这是本节的多页打印视图。 .
经历
项目与比赛。先点进某一个经历,再看里面的分节。
1 - 2026 RAICOM 智能侦察
全国大学生机器人大赛(RAICOM)「智能侦察」赛项的整车 ROS 软件文档。源码仓库:RyanYhy/raicom2026。
建议按侧栏或右侧目录顺序阅读:概述 → 使用说明 → 各功能模块 → 总结 → 附录速查表。
概述
分层架构、数据流、prep/go、运行时状态。
→ 阅读概述
使用说明
环境、3个 workspace、conda、编译与两段式启动。
→ 阅读使用说明
硬件与驱动
外设清单、udev、驱动 ROS 包、EKF 融合与 TF 链。
→ 阅读硬件与驱动
建图
比赛地图 map2.yaml / map2.pbstream 与 Cartographer 工具链。
→ 阅读建图
定位
Cartographer 纯定位与 AMCL、loc_mode 切换。
→ 阅读定位
导航
move_base、costmap、反坦克点云与 cmd_vel 速度链路。
→ 阅读导航
比赛任务
人物识别/打靶、雷区计数、反坦克避障与 6 行报告。
→ 阅读比赛任务
总结
模块依赖、二次开发建议与关键入口。
→ 阅读总结
附录
未完成功能声明与「功能 → 文件」速查表。
→ 阅读附录
1.1 - 概述
全国大学生机器人大赛(RAICOM)「智能侦察」赛项的整车 ROS 软件。小车在 5 分钟内自主穿越 A–D 四区,完成人物识别与水弹打靶、雷区计数、反坦克检测与避障,并输出 6 行字节精确 的 report.txt。
- 平台:ROS Melodic · Ubuntu 18.04 · catkin 工作空间
1raicom_ws - 仓库:raicom2026
系统在做什么
比赛任务可以概括为三条链路:
- 导航 — 按预设航点巡航(
move_base+ Cartographer 定位) - 感知 — 到任务点触发视觉识别(人物 / 雷区 / 反坦克)
- 输出 — 各任务写分报告,最后合并为 6 行
report.txt
启动分两段:prep 拉起全部传感器与模型;裁判计时后 go 只启动导航编排,秒级出发。

分层结构
| 层 | 内容 | 主要位置 |
|---|---|---|
| M1 硬件 | 麦克纳姆底盘、IMU、2D 雷达、云台枪、webcam、Orbbec | config/udev/ |
| M2 驱动 | 串口/雷达/相机驱动,里程计 | chassis_driver、imu_driver、leishen/、orbbec_camera |
| M3 融合 | EKF:odom_raw + IMU → /odom | robot_localization |
| M4 模型 | URDF、静态 TF | robot_description |
| M5 定位导航 | 地图、Cartographer、move_base | raicom2026/launch/、robot_navigation/ |
| M6 比赛任务 | 导航编排、视觉检测、报告 | raicom2026/scripts/ |
| M7 运维 | prep/go、标定工具 | scripts/、test/ |
总数据流

传感器 → 融合 → 定位 → 规划 → 底盘
- 雷达
/scan、IMU、odom_raw经 EKF 得到/odom - Cartographer 发布
map → odom move_base输出/move_base/cmd_vel→cmd_vel_merge→/cmd_vel→ 底盘
任务触发(Service,非连续话题):nav_competition.py 调用 /person_detect_service、/mine_detect_service、/antitank_check_service。
双相机分工

| 相机 | 安装 | 模型 | 任务 |
|---|---|---|---|
| 云台 webcam | 随舵机转 | person.onnx | A–D 区人物识别 + 水弹打靶 |
| 云台 webcam | 同上 | mine.onnx | A/B 雷区计数 |
| Orbbec DCW2 | 车头固定 | antitank.onnx | 反坦克检测 → costmap 避障 |
prep / go 两阶段

| 阶段 | 命令 | 做什么 |
|---|---|---|
| prep | start_match_prep.sh | 后台主 launch,起传感器/模型/定位/move_base |
| go | start_match_go.sh | 清空报告,仅起 nav_competition.py |
详见 使用说明。
运行时状态
stateDiagram-v2
[*] --> BOOT
BOOT --> NAV: map就绪 + move_base
NAV --> TASK: 到达任务航点
TASK --> NAV: 检测完成
NAV --> REPORT: 航点完成或预算耗尽
REPORT --> DONE: 合并 report.txt
DONE --> [*]状态话题:/nav_competition/state(如 NAV:P3、TASK:人物A)。
相关页面
1.2 - 使用说明
默认工作空间路径为 ~/1raicom_ws(与仓库 raicom2026 同结构)。
环境要求
| 组件 | 说明 |
|---|---|
| 系统 | Ubuntu 18.04 |
| ROS | Melodic |
| 本仓库 | 1raicom_ws(catkin 根) |
~/cartographer_ws | Cartographer 定位(不在本仓库内) |
~/cv_bridge_ws | Python3 版 cv_bridge(YOLO 节点) |
Conda yolov8 | ONNX 推理 |

统一环境入口
每个新终端:
setup_env.sh 依次 overlay ROS → cartographer → 1raicom_ws → cv_bridge,并强制 1raicom_ws 在 ROS_PACKAGE_PATH 最前。
编译
若失败,再执行一次 catkin_make 即可。
外设与 udev
规则在 config/udev/:
| 设备 | 节点 |
|---|---|
| 底盘 | /dev/carserial |
| IMU | /dev/imu |
| 雷达 | /dev/lslidar |
| 云台枪 | /dev/gun |
| webcam | /dev/video* |
| Orbbec | USB 2bc5 |
比赛启动(两段式)

赛前 prep
- 后台
nav_competition_2026.launch(start_nav:=false,loc_mode:=cartographer) - 等待
person_detect_service就绪后脚本退出,prep 进程继续跑 - 日志:
/tmp/prep.log
出发 go
- 清空
src/raicom2026/data/reports/ - 仅启动
match_go.launch→nav_competition.py
清理
地图与模型
| 资源 | 路径 |
|---|---|
| 比赛地图 | src/raicom2026/data/maps/map2.yaml |
| pbstream | src/raicom2026/data/maps/map2.pbstream |
| ONNX | data/models/person.onnx、mine.onnx、antitank.onnx |
| 航点 | param/nav_competition.yaml |
| 报告 | data/reports/report.txt |
clone 后建议先看
| 文件 | 作用 |
|---|---|
scripts/setup_env.sh | 环境 |
scripts/start_match_*.sh | 比赛入口 |
launch/nav_competition_2026.launch | 主 launch |
param/nav_competition.yaml | 航点课程 |
scripts/nav_competition.py | 导航编排 |
PC 与实车同步
- PC 改代码 →
git push - PC → 车:
scp同步src/、scripts/、config/ - 车上
catkin_make+source setup_env.sh
车上通常无法直连 GitHub,不要在车上 git push。
1.3 - 硬件与驱动
硬件清单
| 设备 | 用途 | udev 节点 |
|---|---|---|
| 麦克纳姆轮底盘 | 全向移动 | /dev/carserial |
| Wit IMU | 姿态/角速度 | /dev/imu |
| 镭神 N10_P | 2D 激光 | /dev/lslidar |
| 云台 + 水弹枪 | 瞄准/开火 | /dev/gun |
| USB 摄像头 | 人物/雷区(云台) | /dev/video* |
| Orbbec DCW2 | 反坦克 RGB+深度 | USB 2bc5 |

驱动包对照
| ROS 包 | 节点 | 输出 |
|---|---|---|
chassis_driver | base_controller.py | 串口底盘 |
imu_driver | wit_multi_ros.py | /imu |
leishen/lslidar_driver | 雷达节点 | /scan |
car_bringup | base_node | odom_raw |
orbbec_camera | SDK 驱动 | /camera/color/*、/camera/depth/* |
robot_bringup | bringup_robot.launch | 聚合启动 上表 + EKF + URDF |
bringup 启动链
主 launch 通过 <include> 引入。
EKF 融合
| 项 | 说明 |
|---|---|
| 节点 | robot_localization / ekf_localization_node |
| 输入 | odom_raw + /imu |
| 输出 | /odom |
URDF 与 TF
webcam 装在云台上,无独立 TF,识别用舵机角。
云台串口
/dev/gun 只能单进程打开,由 gimbal_server.py 独占。
1.4 - 建图
比赛使用的地图
| 文件 | 用途 |
|---|---|
data/maps/map2.yaml | map_server 占用栅格 |
data/maps/map2.pbstream | Cartographer 纯定位 |
两者须同一次建图产出;换图后必须重测航点(nav_competition.yaml)。
工具链
建图核心在 外部 ~/cartographer_ws;本仓库提供:
| 位置 | 内容 |
|---|---|
config/cartographer/ | lua 配置 |
scripts/save_map.sh | 保存 yaml+pgm |
scripts/save_pbstream.sh | 保存 pbstream |
test/launch/cartographer_localization.launch | 调试纯定位 |
建图流程
flowchart LR
A[实车 laser+odom] --> B[cartographer_ros]
B --> C[map2.pbstream]
B --> D[map2.yaml]
D --> E[map_server]
C --> F[纯定位]- 场地 Cartographer 在线建图
- 保存 pbstream + yaml
- 拷贝到
raicom2026/data/maps/ mark_waypoint*.py标定航点
与比赛 launch 的关系
nav_competition_2026.launch 默认:
map→map2.yamlpbstream→map2.pbstreamloc_mode:=cartographer时cartographer_node读 pbstream
1.5 - 定位
nav_competition_2026.launch 通过 loc_mode 切换:
| 模式 | 参数 | 说明 |
|---|---|---|
| Cartographer | loc_mode:=cartographer(比赛默认) | 加载 map2.pbstream |
| AMCL | loc_mode:=amcl | 粒子滤波 + 静态地图 |

prep 固定:
Cartographer 辅助节点
| 节点 | 作用 |
|---|---|
odom_cleaner.py | 清洗 /odom 时间戳 |
carto_init.py | 注入起点位姿 |
carto_relocalize.py | RViz 2D Pose Estimate 手动重定位 |
配置:config/cartographer/localization.lua
与 nav_competition 衔接
nav_competition.py 启动:
- 等待
/map - 连接
move_base - 发布初始位姿
- 等待约 3s 收敛
- 按
course巡航
Cartographer 模式下反坦克还用 /tracked_pose 做 map 坐标转换。
1.6 - 导航
核心组件
| 组件 | 作用 |
|---|---|
map_server | 发布 /map |
move_base | 全局 + DWA 局部规划 |
robot_navigation/param/ | costmap、DWA 参数 |
visual_layer_params.yaml | local costmap 订阅 /visual_mine/obstacles |
主 launch 自持 move_base(clear_params=true),最后加载 visual 层参数。
costmap 设计
| 层 | observation_sources | 说明 |
|---|---|---|
| global | 空(仅静态地图) | 防定位漂移误标障碍 |
| local | scan + visual_mine | 激光 + 反坦克点云 |
反坦克点云由 orbbec_mine_antitank.py 在 P21 一次性识别后发布(map 帧,0.5s 重发)。
visual_mine_avoidance.py 在 prep 会起,但 enable_at=false,不发布比赛用点云。
cmd_vel 速度链路

cmd_vel_merge.py 当前 enable_line_follow=false,仅透传。
nav 与 move_base
- 航点:
nav_competition.yaml - actionlib 发
MoveBaseGoal;失败跳过该站(报告补 0) - 任务点到达后 朝向对齐 再触发视觉
1.7 - 比赛任务
代码主要在 raicom2026 包。仓库

主调度 nav_competition
| 项 | 说明 |
|---|---|
| 配置 | nav_competition.yaml |
| go 启动 | match_go.launch |
| 任务类型 | person(A–D)、mine(A/B)、antitank |
| Service | 执行节点 |
|---|---|
/person_detect_service | webcam_person_gun.py |
/mine_detect_service | orbbec_mine_antitank.py |
/antitank_check_service | orbbec_mine_antitank.py |
云台服务 gimbal_server
- 独占
/dev/gun /gun/aim、/gun/fire、/gun/home- 人物与雷区共用云台
人物识别与打靶
| 项 | 说明 |
|---|---|
| 相机 | /usb_cam/image_raw(848×480 MJPG) |
| 模型 | person.onnx |
| 流程 | 扫描计数 → 精确报告串 → 对 enemy 瞄准开火 |
打靶与识别在同一节点,不直写串口。
雷区识别
orbbec_mine_antitank.py 的 mine 部分:
| 项 | 说明 |
|---|---|
| 相机 | 云台 webcam |
| 云台 | A (70,70)、B (175,70) |
| 模型 | mine.onnx |
| 报告 | "A雷区未排雷数量x个,已经排雷数量x个"(半角逗号) |
反坦克与避障
同一脚本的 antitank 部分 + move_base:
| 项 | 说明 |
|---|---|
| 相机 | Orbbec color + depth |
| 触发 | P21 /antitank_check_service |
| 输出 | /visual_mine/obstacles → local costmap |
报告输出
report.py + assemble_report.py → 恰好 6 行 report.txt。

1.8 - 总结
模块依赖
flowchart TB
subgraph HW [硬件与驱动]
BR[robot_bringup]
end
subgraph LOC [定位]
CARTO[cartographer]
MAP[map_server]
end
subgraph NAV [导航]
MB[move_base]
end
subgraph TASK [比赛任务]
NAVCOMP[nav_competition]
PERSON[webcam_person_gun]
MINEAT[orbbec_mine_antitank]
end
BR --> CARTO
MAP --> MB
CARTO --> MB
NAVCOMP --> MB
NAVCOMP --> PERSON
NAVCOMP --> MINEAT
MINEAT --> MB二次开发建议
| 目标 | 建议 |
|---|---|
| 改航点/超时 | 只改 nav_competition.yaml |
| 改识别 | 对应 scripts/*.py + data/models/*.onnx |
| 改导航 | robot_navigation/param/ + launch |
| 新功能 | 优先写在 raicom2026 包内 |
关键入口
| 用途 | 路径 |
|---|---|
| 环境 | scripts/setup_env.sh |
| prep/go | scripts/start_match_*.sh |
| 主 launch | launch/nav_competition_2026.launch |
1.9 - 附录
未完成功能
黄线循线
| 环节 | 状态 |
|---|---|
visual_mine_avoidance.py | prep 会起;发 /visual_line/* |
cmd_vel_merge.py | enable_line_follow=false |
| 比赛效果 | 无;速度仅透传 |
visual_mine_avoidance
| 能力 | 状态 |
|---|---|
| 反坦克常驻推理 | enable_at=false |
| 比赛点云 | 由 orbbec_mine_antitank 发布 |
| bench | roslaunch raicom2026 visual_mine_avoidance.launch |
功能 → 文件速查
| 想改 / 想查 | 路径(相对仓库根) |
|---|---|
| 航点、超时 | src/raicom2026/param/nav_competition.yaml |
| 导航编排 | src/raicom2026/scripts/nav_competition.py |
| 人物+打靶 | src/raicom2026/scripts/webcam_person_gun.py |
| 雷区+反坦克 | src/raicom2026/scripts/orbbec_mine_antitank.py |
| 云台 | src/raicom2026/scripts/gimbal_server.py |
| 报告 | src/raicom2026/src/raicom2026/report.py |
| 主 launch | src/raicom2026/launch/nav_competition_2026.launch |
| move_base 参数 | src/robot_navigation/param/ |
| 地图 | src/raicom2026/data/maps/map2.* |
| prep/go | scripts/start_match_*.sh |
完整列表见 GitHub 仓库。
常用 Topic / Service
| 名称 | 说明 |
|---|---|
/cmd_vel | 到底盘 |
/usb_cam/image_raw | 云台相机 |
/camera/color/image_raw | Orbbec |
/visual_mine/obstacles | 反坦克点云 |
/person_detect_service | 人物任务 |
/mine_detect_service | 雷区任务 |
/antitank_check_service | 反坦克 |
2 - 示例项目
这是一页项目 / 比赛的占位内容。
请改成你自己的介绍:目标、技术栈、结果与相关链接。