12 KiB
12 KiB
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:
ssh sunrise@192.168.10.210 - 工作区根目录:
/home/sunrise/yiliao_ws - 运行 ROS 2 命令前通常需要:
cd /home/sunrise/yiliao_ws source /opt/ros/humble/setup.bash source install/setup.bash - 部分相机/Hobot 相关流程可能还需要:
source /opt/tros/humble/setup.bash - 远端仓库可能已有无关改动或运行日志。不要随意
git reset、git checkout --或删除未确认文件。
编译与测试
- 编译单个包:
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: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
- 常用启动参数:
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:关闭二维码检测。
- 常用检查命令:
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 需这样启动:
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日志里是否收到并应用/sign4return10/11。
- 查看
- launch 已启动但按空格不能开始比赛时,可能是 stdin 不是 TTY;可使用
auto_start:=true。 - 更新现场点位时,优先修改
src/racing_control/config/racing_control.yaml,然后重新 build/installracing_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 转换记录。