111 lines
4.6 KiB
Markdown
111 lines
4.6 KiB
Markdown
# 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)
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
# 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 |
|
|
|
|
```bash
|
|
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()`:
|
|
|
|
```cpp
|
|
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`.
|