Files
yiliao2026/AGENTS.md
2026-08-09 21:02:42 +08:00

238 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# yiliao_ws 项目说明
本文件是 `/home/sunrise/yiliao_ws` 工作区的项目级说明,主要记录当前比赛会用到的模块、接口、启动方式和调试注意事项。后续如果某个子目录内还有自己的 `AGENTS.md`,进入该子目录工作时以更近的说明为准。
## 项目定位
- 这是 RDKx5 机器人上的 ROS 2 Humble 工作区,当前主要服务于医疗赛道/竞速赛道任务。
- 当前比赛主链路是调度型架构底盘、雷达、相机、二维码、Nav2、VLM、TTS 等功能分别由独立模块完成,`src/racing_control` 只负责总调度。
- 当前默认只走 Nav2 路径规划与跟随,`trajectory_guard` 只作为可选备用链路,不作为默认路径。
- 比赛点位、路线和行为开关应优先放在 YAML/launch 参数中,不要把新采集的场地点位直接写死进 C++。
- 修改比赛逻辑时优先保证流程稳定、有序、可调试;除非明确需要,不要在总调度节点里另起感知、规划或控制功能。
## 环境与访问
- 机器人 SSH
```bash
ssh sunrise@192.168.10.210
```
- 工作区根目录:
```bash
/home/sunrise/yiliao_ws
```
- 运行 ROS 2 命令前通常需要:
```bash
cd /home/sunrise/yiliao_ws
source /opt/ros/humble/setup.bash
source install/setup.bash
```
- 部分相机/Hobot 相关流程可能还需要:
```bash
source /opt/tros/humble/setup.bash
```
- 远端仓库可能已有无关改动或运行日志。不要随意 `git reset`、`git checkout --` 或删除未确认文件。
## 编译与测试
- 编译单个包:
```bash
cd /home/sunrise/yiliao_ws
source /opt/ros/humble/setup.bash
source install/setup.bash
colcon build --packages-select <package_name> --cmake-args -DBUILD_TESTING=ON
```
- 测试 `racing_control`
```bash
cd /home/sunrise/yiliao_ws
source /opt/ros/humble/setup.bash
source install/setup.bash
colcon test --packages-select racing_control
colcon test-result --verbose --test-result-base build/racing_control
```
- 不要在同一个工作区里同时启动多个 `colcon build`。
- `ament_xmllint` 可能依赖远端 ROS schema。如果只有 xmllint 因网络/schema 临时失败,先重跑验证,再考虑改 XML。
## 比赛模块总览
### 总调度
- 包路径:`src/racing_control`
- 主节点:`src/racing_control/src/racing_control.cpp`
- 配置:`src/racing_control/config/racing_control.yaml`
- 启动:`src/racing_control/launch/racing_control.launch.py`
- 点位转换说明:`src/racing_control/点位格式转换.md`
- 设计原则:
- 只做比赛流程调度不重复实现二维码、VLM、Nav2、底盘控制等子功能。
- 通过 `/sign4return` 控制二维码、VLM 和 Nav2 参数档位。
- 通过 Nav2 action 完成到点、路径规划和路径跟随。
- 当前比赛流程:
- 导航到 `qr_pose` 附近。
- 一旦收到可解析二维码结果,立即选择顺/逆时针路线。
- 识别二维码后不再等待 QR 目标,按配置前往 `post_qr_pose` 和 `entry_pose`。
- 进入对应方向路线,按 `clockwise_waypoints` 或 `counterclockwise_waypoints` 执行。
- 到第 `vlm_waypoint_number` 个路线点时触发 VLM。
- home 前一个点到达后发布 `/sign4return=10` 调参,再发布 home goal。
- 最后返回方向对应的 `clockwise_home_pose` 或 `counterclockwise_home_pose`。
- 使用的 Nav2 actions
- `/navigate_to_pose`
- `/compute_path_through_poses`
- `/follow_path`
- 常用启动参数:
```bash
ros2 launch racing_control racing_control.launch.py auto_start:=false
ros2 launch racing_control racing_control.launch.py auto_start:=true
ros2 launch racing_control racing_control.launch.py enable_vlm_image_relay:=true
```
### 点位与路线参数
- 点位数组使用 `[x, y, yaw_radians]`,坐标系由 `frame_id` 指定。
- `racing_control.yaml` 中当前关键字段:
- `qr_pose`:二维码区域导航点。
- `post_qr_pose`:二维码识别后的后置过渡点,用于后续调参。
- `entry_pose`:进入正式路线前的入口点。
- `clockwise_waypoints`:顺时针路线点,不包含 home。
- `counterclockwise_waypoints`:逆时针路线点,不包含 home。
- `clockwise_home_pose`、`counterclockwise_home_pose`:最终 home 点。
- `use_post_qr_pose: true` 时启用 QR 后置点;设为 `false` 时二维码识别后直接去 `entry_pose`。
- `vlm_waypoint_number: 4` 表示正式路线第 4 个点是 VLM 拍摄点。不要依赖 `goal_004` 之类的点名。
- 二维码方向解析:
- 文本包含 `` 或奇数数字时选择顺时针。
- 文本包含 `` 或偶数数字时选择逆时针。
### Nav2 与轨迹保护
- 包路径:`src/navigation/obstacle_nav2`
- 主启动:`launch/obstacle_nav2.launch.py`
- 轨迹保护启动:`launch/trajectory_guard.launch.py`
- 运行时参数档位切换:`launch/nav2_profile_tuner.launch.py`
- 关键配置:
- `config/nav2_profile_10.yaml`:普通/默认导航参数。
- `config/nav2_profile_11.yaml`:任务二路线参数。
- `config/trajectory_guard.yaml`:轨迹保护参数。
- `trajectory_guard_node` 订阅 `/trajectory_guard/input_path`,属于备用链路;默认比赛流程不依赖它。
- `nav2_profile_tuner` 监听 `/sign4return`,收到 10 或 11 后调用 Nav2 参数服务切换参数档位。
- `obstacle_nav2.launch.py` 当前以里程计坐标为主,默认 global frame 是 `odom`;静态地图和 AMCL 相关配置留作备用。
### 相机与二维码
- 相机包:`src/car_usb_cam`
- 二维码包:`src/qr_detection`
- 常见相机话题:`/image`
- 当前 VLM/调度链路期望的图像类型:`sensor_msgs/msg/CompressedImage`
- 二维码结果话题:`/qr_results`,类型 `std_msgs/msg/String`
- 二维码检测受 `/sign4return` 控制:
- `0`:启用二维码检测。
- `5`:关闭二维码检测。
- 常用检查命令:
```bash
ros2 topic echo /qr_results
ros2 topic info /image
ros2 topic hz /image
```
- 如果 `racing_control` 到二维码区域后不继续走,优先检查:
- 日志里是否出现 `QR result received`。
- `/qr_results` 是否真的有输出。
- 输出文本是否包含 ``、`` 或可解析数字。
### VLM 与语音
- 包路径:`src/vlm_detect`
- 启动文件:
- `launch/vlm_detect.launch.py`OpenAI 兼容 VLM 服务流程。
- `launch/local_vlm_adapter.launch.py`:本地 `hobot_llamacpp` 适配流程。
- VLM 触发信号:`/sign4return=9`
- VLM 结果话题:`/vlm_result`
- TTS 服务:`/tts/speak`,类型 `origincar_msg/srv/Speak`
- `vlm_detect` 的图像输入可通过 launch 参数 `image_topic` 配置。
- `racing_control` 可选单帧 VLM 图像转发:
- `enable_vlm_image_relay: false` 默认关闭。
- 输入话题:`vlm_image_input_topic`,默认 `/image`。
- 输出话题:`vlm_image_output_topic`,默认 `/vlm_image`。
- 启用后,`racing_control` 在发布 `/sign4return=9` 前,把缓存到的一帧压缩图像发布到 `/vlm_image`。
- 若要让 VLM 使用该帧VLM 需这样启动:
```bash
ros2 launch vlm_detect vlm_detect.launch.py image_topic:=/vlm_image
```
- 当前 VLM 拍摄模式:
- `vlm_capture_mode: stop`:到 VLM 点停住,发布图像/触发信号,等待 `vlm_capture_wait_sec` 后继续。
- `vlm_capture_mode: pass_through`:保留的经过拍照模式,按 `pass_through_vlm_trigger_radius` 在接近 VLM 点时触发。
### 底盘、雷达、里程计与消息
- 底盘包:`src/origincar_base`
- 常见启动:`origincar_bringup.launch.py`、`base_serial.launch.py`、`ekf.launch.py`
- 负责底盘串口、IMU、里程计、EKF 和 TF 等基础能力。
- 雷达驱动路径:`src/LSLIDAR_X_ROS2-20240228/src`
- 障碍物检测包:`src/obstacle_scanner`
- 消费雷达数据,发布导航需要的障碍物信息。
- 消息/服务包:`src/origincar_msg`
- 包含 `origincar_msg/srv/Speak`。
- 当前 `racing_control` 期望里程计话题是 `/odom_combined`。
### 启动编排
- `src/my_robot_bringup/launch/master_launch.py` 是较完整的分阶段总启动涉及底盘、雷达、TTS、相机、二维码、障碍物、规划和 VLM。
- 当前 `racing_control` 流程会直接依赖 Nav2 actions并结合 `obstacle_nav2`/轨迹保护相关节点。修改 `master_launch.py` 前,应确认现场实际是通过总 launch 还是多个终端分别启动。
- `planner` 包里还有较旧或备用的 Hybrid A*、Pure Pursuit 等流程。除非当前 launch 明确使用它,否则先把它当作历史/备用路径看待。
## 共享信号与话题
- `/sign4return` 类型是 `std_msgs/msg/Int32`,被多个模块共享:
- `0`:启用二维码检测。
- `5`:关闭二维码检测。
- `9`:触发 VLM 拍摄/推理。
- `10`:应用普通 Nav2 参数档。
- `11`:应用任务二 Nav2 参数档。
- 新增 `/sign4return` 数值前,必须检查所有订阅者,包括底盘、感知和导航参数切换节点。
- 其他关键接口:
- `/qr_results`:二维码文本结果。
- `/vlm_result`VLM 文本结果。
- `/tts/speak`TTS 服务。
- `/image`:压缩相机流。
- `/vlm_image`:可选单帧 VLM 图像转发输出。
- `/trajectory_guard/input_path`:轨迹保护输入路径。
- `/cmd_vel`:真实运动控制通道,避免多个节点同时发布。
## 调试注意事项
- 不要让多个节点同时发布 `/cmd_vel`,除非明确 remap 掉其中一个。
- 二维码区域后不继续走时:
- 看 `racing_control` 日志是否出现 `QR result received`。
- 直接 echo `/qr_results`。
- 确认二维码文本能被解析为顺/逆方向。
- VLM 报 `No image` 或没有结果时:
- 检查 `ros2 topic info /image`。
- 如果启用转发,确认 `enable_vlm_image_relay:=true`,并且 VLM 使用 `image_topic:=/vlm_image`。
- 确认相机实际发布的是 `sensor_msgs/msg/CompressedImage`。
- 路线段末端卡住时:
- 检查 `/odom_combined` 是否连续。
- 检查 `circle_goal_tolerance` 是否过小。
- 如果临时启用了 `trajectory_guard`,再检查它是否正常向 `/follow_path` 转发。
- Nav2 在任务二前后行为差异大时:
- 查看 `nav2_profile_10.yaml` 和 `nav2_profile_11.yaml`。
- 查看 `nav2_profile_tuner` 日志里是否收到并应用 `/sign4return` 10/11。
- launch 已启动但按空格不能开始比赛时,可能是 stdin 不是 TTY可使用 `auto_start:=true`。
- 更新现场点位时,优先修改 `src/racing_control/config/racing_control.yaml`,然后重新 build/install `racing_control`,确保 launch 读到安装后的配置。
## 关键参数清单
- `frame_id`:比赛点位所属坐标系。
- `qr_pose`、`post_qr_pose`、`entry_pose`:二维码阶段到正式路线阶段的关键过渡点。
- `clockwise_waypoints`、`counterclockwise_waypoints`:顺/逆时针路线点。
- `clockwise_home_pose`、`counterclockwise_home_pose`:顺/逆方向 home 点。
- `use_post_qr_pose`:是否启用二维码后置点。
- `vlm_waypoint_number`:第几个正式路线点触发 VLM。
- `vlm_capture_mode``stop` 或 `pass_through`。
- `vlm_capture_wait_sec`:停住拍照模式下触发 VLM 后等待时间。
- `enable_vlm_image_relay`:是否由 `racing_control` 把 `/image` 的单帧图像转发到 `/vlm_image`。
- `vlm_image_input_topic`、`vlm_image_output_topic`VLM 图像转发输入/输出话题。
## 待后续补齐
- 比赛日标准启动顺序:到底使用 `my_robot_bringup/master_launch.py`,还是分终端启动 `obstacle_nav2`、`vlm_detect`、`racing_control` 等节点。
- 当前最权威的 Nav2 参数归属:`obstacle_nav2` 的 profile 看起来是比赛主路径,但 `planner` 和 `my_robot_bringup` 仍保留旧流程。
- 不同部署模式下相机话题的最终类型。近期 `vlm_detect` 期望 `CompressedImage`,换相机驱动前要重新确认。
- `/sign4return` 除 0、5、9、10、11 外,在底盘板和感知节点里的完整含义。
- 现场最新点位来源、采集时间和对应 JSON/YAML 转换记录。