跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

经历

项目与比赛——做过什么、学到什么。

项目与比赛。先点进某一个经历,再看里面的分节。

1 - 2026 RAICOM 智能侦察

ROS 整车软件架构、使用说明与按功能划分的模块讲解;配合 GitHub 仓库 raicom2026 阅读。

全国大学生机器人大赛(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 2026 智能侦察 — 系统目标、分层架构、数据流与运行时状态。

全国大学生机器人大赛(RAICOM)「智能侦察」赛项的整车 ROS 软件。小车在 5 分钟内自主穿越 A–D 四区,完成人物识别与水弹打靶、雷区计数、反坦克检测与避障,并输出 6 行字节精确report.txt

  • 平台:ROS Melodic · Ubuntu 18.04 · catkin 工作空间 1raicom_ws
  • 仓库raicom2026

系统在做什么

比赛任务可以概括为三条链路:

  1. 导航 — 按预设航点巡航(move_base + Cartographer 定位)
  2. 感知 — 到任务点触发视觉识别(人物 / 雷区 / 反坦克)
  3. 输出 — 各任务写分报告,最后合并为 6 行 report.txt

启动分两段:prep 拉起全部传感器与模型;裁判计时后 go 只启动导航编排,秒级出发。

七层架构
系统分层:由硬件到比赛任务

分层结构

内容主要位置
M1 硬件麦克纳姆底盘、IMU、2D 雷达、云台枪、webcam、Orbbecconfig/udev/
M2 驱动串口/雷达/相机驱动,里程计chassis_driverimu_driverleishen/orbbec_camera
M3 融合EKF:odom_raw + IMU → /odomrobot_localization
M4 模型URDF、静态 TFrobot_description
M5 定位导航地图、Cartographer、move_baseraicom2026/launch/robot_navigation/
M6 比赛任务导航编排、视觉检测、报告raicom2026/scripts/
M7 运维prep/go、标定工具scripts/test/

总数据流

总数据流
传感器 → 融合 → 定位 → 规划 → 底盘;nav 经 Service 触发视觉任务

传感器 → 融合 → 定位 → 规划 → 底盘

  • 雷达 /scan、IMU、odom_raw 经 EKF 得到 /odom
  • Cartographer 发布 map → odom
  • move_base 输出 /move_base/cmd_velcmd_vel_merge/cmd_vel → 底盘

任务触发(Service,非连续话题):nav_competition.py 调用 /person_detect_service/mine_detect_service/antitank_check_service

双相机分工

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

prep / go 两阶段

prep 与 go
阶段命令做什么
prepstart_match_prep.sh后台主 launch,起传感器/模型/定位/move_base
gostart_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:P3TASK:人物A)。

1.2 - 使用说明

环境、编译、udev、prep/go 两段式启动与 PC/实车同步。

默认工作空间路径为 ~/1raicom_ws(与仓库 raicom2026 同结构)。

环境要求

组件说明
系统Ubuntu 18.04
ROSMelodic
本仓库1raicom_ws(catkin 根)
~/cartographer_wsCartographer 定位(不在本仓库内
~/cv_bridge_wsPython3 版 cv_bridge(YOLO 节点)
Conda yolov8ONNX 推理
环境 overlay
overlay 加载顺序(setup_env.sh)

统一环境入口

每个新终端:

source ~/1raicom_ws/scripts/setup_env.sh

setup_env.sh 依次 overlay ROS → cartographer → 1raicom_ws → cv_bridge,并强制 1raicom_wsROS_PACKAGE_PATH 最前。

编译

cd ~/1raicom_ws
source /opt/ros/melodic/setup.bash
catkin_make
lslidar 首次并行编译

若失败,再执行一次 catkin_make 即可。

外设与 udev

规则在 config/udev/

设备节点
底盘/dev/carserial
IMU/dev/imu
雷达/dev/lslidar
云台枪/dev/gun
webcam/dev/video*
OrbbecUSB 2bc5
bash ~/1raicom_ws/scripts/check_devices.sh

比赛启动(两段式)

prep 与 go

赛前 prep

source ~/1raicom_ws/scripts/setup_env.sh
bash ~/1raicom_ws/scripts/start_match_prep.sh
  • 后台 nav_competition_2026.launchstart_nav:=falseloc_mode:=cartographer
  • 等待 person_detect_service 就绪后脚本退出,prep 进程继续跑
  • 日志:/tmp/prep.log

出发 go

bash ~/1raicom_ws/scripts/start_match_go.sh
  • 清空 src/raicom2026/data/reports/
  • 仅启动 match_go.launchnav_competition.py

清理

bash ~/1raicom_ws/scripts/clean_ros.sh

地图与模型

资源路径
比赛地图src/raicom2026/data/maps/map2.yaml
pbstreamsrc/raicom2026/data/maps/map2.pbstream
ONNXdata/models/person.onnxmine.onnxantitank.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 与实车同步

  1. PC 改代码 → git push
  2. PC → 车:scp 同步 src/scripts/config/
  3. 车上 catkin_make + source setup_env.sh
说明

车上通常无法直连 GitHub,不要在车上 git push

1.3 - 硬件与驱动

实车外设、udev、驱动 ROS 包、EKF 融合与 TF 链。

硬件清单

设备用途udev 节点
麦克纳姆轮底盘全向移动/dev/carserial
Wit IMU姿态/角速度/dev/imu
镭神 N10_P2D 激光/dev/lslidar
云台 + 水弹枪瞄准/开火/dev/gun
USB 摄像头人物/雷区(云台)/dev/video*
Orbbec DCW2反坦克 RGB+深度USB 2bc5
硬件与驱动

驱动包对照

ROS 包节点输出
chassis_driverbase_controller.py串口底盘
imu_driverwit_multi_ros.py/imu
leishen/lslidar_driver雷达节点/scan
car_bringupbase_nodeodom_raw
orbbec_cameraSDK 驱动/camera/color/*/camera/depth/*
robot_bringupbringup_robot.launch聚合启动 上表 + EKF + URDF

bringup 启动链

bringup_robot.launch

lslidar → imu → base_controller → odom_raw → EKF → /odom
       → static TF → robot_state_publisher

主 launch 通过 <include> 引入。

EKF 融合

说明
节点robot_localization / ekf_localization_node
输入odom_raw + /imu
输出/odom

参数:robot_localization.yaml

URDF 与 TF

map → odom → base_footprint → base_link → laser_link
                           → camera_link → camera_color_optical_frame

webcam 装在云台上,无独立 TF,识别用舵机角。

云台串口

/dev/gun 只能单进程打开,由 gimbal_server.py 独占。

1.4 - 建图

比赛地图 map2.yaml / map2.pbstream 与 Cartographer 建图工具链。

比赛使用的地图

文件用途
data/maps/map2.yamlmap_server 占用栅格
data/maps/map2.pbstreamCartographer 纯定位

两者须同一次建图产出;换图后必须重测航点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[纯定位]
  1. 场地 Cartographer 在线建图
  2. 保存 pbstream + yaml
  3. 拷贝到 raicom2026/data/maps/
  4. mark_waypoint*.py 标定航点

与比赛 launch 的关系

nav_competition_2026.launch 默认:

  • mapmap2.yaml
  • pbstreammap2.pbstream
  • loc_mode:=cartographercartographer_node 读 pbstream

1.5 - 定位

AMCL 与 Cartographer 纯定位、辅助节点与 nav 衔接。

nav_competition_2026.launch 通过 loc_mode 切换:

模式参数说明
Cartographerloc_mode:=cartographer比赛默认加载 map2.pbstream
AMCLloc_mode:=amcl粒子滤波 + 静态地图
定位模式

prep 固定:

roslaunch raicom2026 nav_competition_2026.launch start_nav:=false loc_mode:=cartographer

Cartographer 辅助节点

节点作用
odom_cleaner.py清洗 /odom 时间戳
carto_init.py注入起点位姿
carto_relocalize.pyRViz 2D Pose Estimate 手动重定位

配置:config/cartographer/localization.lua

与 nav_competition 衔接

nav_competition.py 启动:

  1. 等待 /map
  2. 连接 move_base
  3. 发布初始位姿
  4. 等待约 3s 收敛
  5. course 巡航

Cartographer 模式下反坦克还用 /tracked_pose 做 map 坐标转换。

1.6 - 导航

move_base、costmap、反坦克点云与 cmd_vel 速度链路。

核心组件

组件作用
map_server发布 /map
move_base全局 + DWA 局部规划
robot_navigation/param/costmap、DWA 参数
visual_layer_params.yamllocal costmap 订阅 /visual_mine/obstacles

主 launch 自持 move_baseclear_params=true),最后加载 visual 层参数。

costmap 设计

observation_sources说明
global空(仅静态地图)防定位漂移误标障碍
localscan + visual_mine激光 + 反坦克点云

反坦克点云由 orbbec_mine_antitank.py 在 P21 一次性识别后发布(map 帧,0.5s 重发)。

说明

visual_mine_avoidance.py 在 prep 会起,但 enable_at=false不发布比赛用点云。

cmd_vel 速度链路

cmd_vel 链路
move_base → /move_base/cmd_vel → cmd_vel_merge → /cmd_vel → base_controller

cmd_vel_merge.py 当前 enable_line_follow=false仅透传

nav 与 move_base

  • 航点:nav_competition.yaml
  • actionlib 发 MoveBaseGoal;失败跳过该站(报告补 0)
  • 任务点到达后 朝向对齐 再触发视觉

1.7 - 比赛任务

主调度、人物/雷区/反坦克检测、云台服务与 6 行报告。

代码主要在 raicom2026 包。仓库

任务 Service 流

主调度 nav_competition

说明
配置nav_competition.yaml
go 启动match_go.launch
任务类型person(A–D)、mine(A/B)、antitank
Service执行节点
/person_detect_servicewebcam_person_gun.py
/mine_detect_serviceorbbec_mine_antitank.py
/antitank_check_serviceorbbec_mine_antitank.py

云台服务 gimbal_server

  • 独占 /dev/gun
  • /gun/aim/gun/fire/gun/home
  • 人物与雷区共用云台

人物识别与打靶

webcam_person_gun.py

说明
相机/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 包内
Oink 与仓库

本文档站点用 Oink 主题组织内容;改代码以 GitHub 仓库 为准。详见 附录 速查表。

关键入口

用途路径
环境scripts/setup_env.sh
prep/goscripts/start_match_*.sh
主 launchlaunch/nav_competition_2026.launch

1.9 - 附录

未完成功能与「功能 → 文件」速查表。

未完成功能

黄线循线

环节状态
visual_mine_avoidance.pyprep 会起;发 /visual_line/*
cmd_vel_merge.pyenable_line_follow=false
比赛效果;速度仅透传

visual_mine_avoidance

能力状态
反坦克常驻推理enable_at=false
比赛点云orbbec_mine_antitank 发布
benchroslaunch 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
主 launchsrc/raicom2026/launch/nav_competition_2026.launch
move_base 参数src/robot_navigation/param/
地图src/raicom2026/data/maps/map2.*
prep/goscripts/start_match_*.sh

完整列表见 GitHub 仓库

常用 Topic / Service

名称说明
/cmd_vel到底盘
/usb_cam/image_raw云台相机
/camera/color/image_rawOrbbec
/visual_mine/obstacles反坦克点云
/person_detect_service人物任务
/mine_detect_service雷区任务
/antitank_check_service反坦克

2 - 示例项目

占位项目页——换成真实的项目或比赛介绍。

这是一页项目 / 比赛的占位内容。

请改成你自己的介绍:目标、技术栈、结果与相关链接。