# 项目说明

## 项目用途

- 这是 RDKx5 赛车机器人的 ROS2 Humble 工作区。
- `src/racing_control` 是比赛总调度包。它只负责调度已有的感知、导航、VLM、TTS 和备用轨迹保护节点，不在包内重新实现这些功能。

## 环境准备

- 通过 `ssh sunrise@192.168.10.210` 连接机器人。
- 构建或运行前先 source ROS 和工作区：
  `source /opt/ros/humble/setup.bash && source /home/sunrise/yiliao_ws/install/setup.bash`。
- 部分相机/Hobot 流程可能还需要 source `/opt/tros/humble/setup.bash`。

## 构建与测试

- 只构建比赛总控：
  `cd /home/sunrise/yiliao_ws && source /opt/ros/humble/setup.bash && source install/setup.bash && colcon build --packages-select racing_control --cmake-args -DBUILD_TESTING=ON`。
- 只测试比赛总控：
  `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`。
- `ament_xmllint` 会从 `download.ros.org` 读取 package schema；如果出现临时资源或网络错误，先重跑 xmllint 测试，不要急着修改 XML。

## 架构

- `/sign4return` 是共享的 `std_msgs/msg/Int32` 控制话题：
  `0` 开启二维码检测，`5` 关闭二维码检测，`9` 触发 VLM 拍照识别，`10` 切换普通 Nav2 参数，`11` 切换任务二 Nav2 参数。
- `obstacle_nav2/nav2_profile_tuner` 监听 `/sign4return`，并根据 10 或 11 应用对应的 Nav2 profile。
- `obstacle_nav2/trajectory_guard_node` 订阅 `/trajectory_guard/input_path`，属于备用链路；默认比赛流程不依赖它。
- 比赛总控使用 Nav2 actions（`/navigate_to_pose`、`/compute_path_through_poses`、`/follow_path`），当前默认不走 `trajectory_guard`。
- 当前 route 执行默认启用动态重规划和短倒车恢复：距离 segment 终点大于 `dynamic_replan_stop_distance` 时按 `dynamic_replan_interval_sec` 重算路径；FollowPath/planner 连续失败会短倒车恢复，默认 `-0.2m/s`、`0.04m` 或 `0.2s` 停止，最多 `max_recovery_attempts: 2`。

## 外部系统

- `vlm_detect` 会调用由 launch 参数配置的外部 VLM 服务，该服务可能运行在另一台机器上。
- `vlm_detect` 同时通过 `origincar_msg/srv/Speak` 提供 `/tts/speak` 语音服务。

## 已知注意事项

- 不要让多个节点同时发布 `/cmd_vel`，避免与 Nav2 controller 输出互相抢控制权。
- 实际比赛点位依赖现场标定；不要把代码或 yaml 默认值当作真实赛场坐标。
- 机器人底盘也订阅 `/sign4return`；总调度节点不要发布未明确约定的负数复位指令。
