Chạy move_base2 trên sim
Bộ launch này thay cho chuỗi lệnh của move_base cũ. Không sửa gì ở đường chạy cũ — hai runtime
chạy song song được, chọn bằng lệnh roslaunch nào được gọi.
Đường chạy cũ (giữ nguyên, để đối chiếu)
roslaunch amr_startup robot_maze_world.launch
roslaunch amr_startup rviz.launch
roslaunch robot_depth_image_proc depth_image_proc_gazebo.launch
export PNKX_NAV_CORE_CONFIG_DIR=/home/duongtd/T800_ws/src/AMR_T800/pnkx_nav_core/config
roslaunch amr_startup amr_control.launch
Đường chạy move_base2
cd /home/duongtd/T800_ws && source devel/setup.bash
roslaunch move_base2 move_base2_sim.launch
Một lệnh, không cần export gì. Muốn tách terminal như cũ thì chạy từng phần:
# Terminal 1 — Gazebo + model T800 + world (dùng lại launch cũ, không đổi)
roslaunch amr_startup robot_maze_world.launch
# Terminal 2 — rviz (dùng lại config cũ)
rviz -d $(rospack find amr_startup)/rviz/navigation.rviz
# Terminal 3 — depth image -> point cloud (dùng lại launch cũ)
roslaunch robot_depth_image_proc depth_image_proc_gazebo.launch
# Terminal 4 — nav stack trên move_base2. KHÔNG export gì: launch tự đặt config dir.
roslaunch move_base2 move_base2_control.launch
Tham số
| Arg | Mặc định | Ghi chú |
|---|---|---|
world |
maze |
maze | warehouse | sehc | empty |
robot_type |
T800 |
quyết định footprint; T800 = [[0.583,±0.48],[-0.583,±0.48]] |
gui |
true |
false = gzserver headless, chạy được qua ssh |
rviz |
true |
|
depth_proc |
true |
tắt khi không cần đường depth camera |
roslaunch move_base2 move_base2_sim.launch world:=warehouse gui:=false
Đổi qua lại giữa hai runtime bằng cách nào
amr_control nạp plugin navigation bằng cách tra symbol MoveBase — tên này hard-code trong
host (amr_control.cpp:244-246), không đọc từ config. Thư viện nào được nạp thì do khoá
MoveBase: library_path trong move_base_common_params.yaml quyết định, và file đó được tìm qua
PNKX_NAV_CORE_CONFIG_DIR.
Vì vậy chuyển đổi = trỏ PNKX_NAV_CORE_CONFIG_DIR sang cây khác:
| Runtime | PNKX_NAV_CORE_CONFIG_DIR |
MoveBase: library_path |
|---|---|---|
| cũ | pnkx_nav_core/config |
libmove_base |
| mới | move_base2/config/runtime |
libmove_base2 |
move_base2/config/runtime/ là symlink tới toàn bộ pnkx_nav_core/config/, trừ đúng một file
thật: move_base_common_params.yaml. Chọn symlink thay vì copy là có lý do — CLAUDE.md cảnh báo
rõ về hai cây config trùng tên ("file khớp đầu tiên thắng", "sửa mãi không có tác dụng vì sửa nhầm
bản cũ"). Với symlink, sửa tham số ở cây gốc là cả hai đường chạy cùng thấy; chỉ đúng một dòng thật
sự khác nhau.
libmove_base2.so export cả hai alias MoveBase và MoveBase2, nên host không phải sửa dòng
nào.
Xem gì khi chạy
Log khởi động của amr_node phải có, theo thứ tự:
[move_base2] dùng schema mới ... | ... đọc theo schema gen-1 của move_base_common_params.yaml
[move_base2] PlannerRunner: global planner đang dùng là '...'
[move_base2] ControllerRunner: local planner đang dùng là '...'
[move_base2] NavigationRuntime dựng xong: <toàn bộ config>
Trên rviz: /global_costmap/costmap/plan và /local_costmap/costmap/footprint có dữ liệu.
Chưa có: lưới costmap trên rviz. getGlobalData/getLocalData của move_base2 hiện điền plan
và footprint nhưng chưa chuyển costmap sang OccupancyGrid — xem @warning ở
NavigationServer::fillPlannerData. Path và footprint hiện được, costmap thì không.
Nếu treo ở lúc khởi động
amr_control.cpp:252-258 chờ vô hạn getFeedback()->is_ready sau khi gọi initialize():
do { r.sleep(); ros::spinOnce(); } while (ros::ok() && !move_base_ptr_->getFeedback()->is_ready);
NavigationRuntime::build() hỏng thì is_ready giữ nguyên false và vòng lặp này quay mãi. Triệu
chứng là amr_node im lặng không tiến thêm. Đọc log ngay phía trên nó — initialize() luôn in lý
do thất bại trước khi trả về:
[move_base2] initialize() thất bại: <lý do>
Nguyên nhân hay gặp: sai PNKX_NAV_CORE_CONFIG_DIR, thiếu library_path cho planner trong YAML,
hoặc .so của planner không có trong devel/lib.