
一.核心基础概念1.node 节点节点是 ROS 2 中独立运行的功能单元通常是一个可执行程序。一个节点应尽量职责单一例如路径规划节点、底盘驱动节点、雷达驱动节点。2.topic 话题发布者Publisher→ 话题通道 → 订阅者 (Subscriber)一个节点向话题发布消息其他一个或多个节点可订阅该话题并接收数据。发布者通常不需要知道订阅者是谁也不需要等待订阅者处理完成。常用话题命令# 查看所有话题 ros2 topic list # 打印话题实时数据 ros2 topic echo /话题名3.Service 服务请求 - 应答同步通信服务采用请求/应答模式属于同步、一次性通信。客户端Client发起请求服务端Server必须立即处理并返回响应否则调用将超时。每次调用都是独立的服务端回调执行完毕后本次连接即销毁下次调用重新建立。适用于需要即时反馈的交互如查询当前状态或触发一次性动作。4.Action 动作 带反馈的长耗时任务Goal 目标 → 持续 Feedback 实时反馈 → 最终 Result 结果action像是一个领导给员工下命令是层层分发一共有三层。第一步总监给leader下发命令是第一层第一层就是总监层发命令肯定是单向的一对一的然后leader接收反馈收到并实时反馈工作进度这个反馈也是一对一的这个是第二层也就是leader层。分给自己手下手下很多人每个人一个工作。手下干活层就是第三层。leader是一对多leader自己可以监控有监控机制Polling。这是标准的action写法。leader的监控机制Polling也就是定个闹钟按照一定频率由循环 sleep 决定检查。二.ros2项目相关知识ros2的层级关系工作空间workspace└── 功能包package├── 节点node│ ├── 发布/订阅话题topic│ ├── 服务service│ │── 动作action│ └── 参数parameter├── launch/ 启动文件├── config/ 参数配置├── msg/srv/action/ 自定义接口接口包中└── 源代码、测试、说明文档等工作空间workspace一个标准工作空间通常是ros2_ws/ ├── src/ 源代码由开发者维护 ├── build/ 编译过程产生的临时文件 ├── install/ 编译后的程序、库、配置 └── log/ 编译日志一个 ROS 2 项目需要包括哪些包ROS 2 并未强制规定项目必须包含哪些包但实际工程中通常按职责拆分成多个包以降低耦合、便于复用。下表列举了常见的包类型及其作用类型例子作用驱动包bynav_ros2_driver与 GNSS、雷达、车辆硬件通信消息包radar_msgs、novatel_oem7_msgs定义自定义消息定位包localization计算车辆位置和姿态感知包radar_detector处理传感器数据、检测障碍物规划包local_path_planner生成车辆行驶路径控制包pid_longitudinal_controller计算油门、制动或转向命令管理包control_manager协调不同模块工具包test_data_publisher发布测试数据可视化包visualization_pkg在 RViz 中展示结果更细粒度的功能包示例功能包核心职责常见输入常见输出robot_description定义机器人结构、坐标系和外观模型—URDF、TF、RViz 模型chassis_driver与底盘 CAN/串口通信/cmd_vel/odom、底盘状态、故障码sensor_driver接入雷达、IMU、相机、GNSS 等硬件原始数据/scan、/imu/data、图像、GNSSrobot_interfaces定义项目专属消息、服务和动作—.msg、.srv、.actionstate_estimation融合编码器、IMU、GNSS 等状态信息轮速、IMU、GNSS更稳定的/odom、TFlocalization在已知地图中定位/scan、/map、/odommap → odom的 TF、位姿mapping未知环境建图雷达、IMU、里程计/map、地图文件navigation全局规划、局部规划、避障、控制地图、定位、传感器、目标点/cmd_vel、导航状态task_manager巡检点、任务流程、状态机、业务逻辑任务列表、导航结果导航目标、采集/拍照指令robot_bringup系统总启动与统一参数管理YAML、Launch 参数启动完整系统visualizationRViz 显示、状态面板、调试工具地图、轨迹、传感器数据可视化界面diagnostics监测通信、传感器、定位和系统健康状态各模块状态故障告警、诊断信息一个规范的 C ROS 2 包通常包含package_name/├── package.xml # 包信息和依赖├── CMakeLists.txt # 编译、链接、安装规则├── include/package_name/ # 头文件类、接口、数据结构├── src/ # 源文件节点和算法实现├── launch/ # 启动文件├── config/ # YAML 参数配置├── test/ # 单元测试、集成测试├── rviz/ # 可选RViz配置├── maps/ # 可选地图文件├── urdf/ # 可选机器人模型├── meshes/ # 可选机器人三维模型└── README.md # 包用途、话题接口、运行命令不同角色包的内容侧重点不同包类型必要内容常见额外内容驱动包节点、硬件通信接口、参数协议解析、日志、超时保护算法包节点、算法模块、参数插件接口、测试数据、性能评估接口包msg/、srv/、action/很少需要src/描述包urdf/、meshes/、rviz/launch/启动包launch/、config/地图、行为树、环境变量脚本任务包状态机、任务配置、服务/动作客户端巡检点文件、数据库接口底盘通信协议包的核心任务是接收 ROS 2 的控制指令按 ICD 打包后发送给底盘接收底盘反馈报文解析后发布为 ROS 2 标准话题。chassis_driver/├── package.xml├── CMakeLists.txt├── include/chassis_driver/│ ├── chassis_driver_node.hpp # 节点类声明│ ├── can_interface.hpp # CAN打开、收发、关闭接口│ ├── protocol_parser.hpp # 协议打包/解析接口│ └── chassis_types.hpp # 状态结构体、枚举定义│├── src/│ ├── chassis_driver_node.cpp # 主节点订阅、发布、定时器、收发调度│ ├── can_interface.cpp # SocketCAN或厂商CAN接口实现│ ├── protocol_parser.cpp # 各CAN ID的编码和解码│ └── main.cpp # 程序入口│├── config/│ └── chassis_params.yaml # CAN口、发送周期、轮距、速度限制等参数│├── launch/│ └── chassis.launch.py # 启动底盘驱动节点│├── test/│ ├── test_protocol_parser.cpp # 单元测试验证字节序、比例系数、CRC等│ └── test_frames/ # 可选保存已知正确的CAN报文样例│└── README.md # 接口、CAN ID、运行方式、诊断说明文件应放内容chassis_driver_node.cpp订阅/cmd_vel发布/odom、/chassis/status调用协议编码和 CAN 收发通过定时器按协议周期发送报文protocol_parser.cpp例如编码0x111运动控制帧解析0x211状态帧、0x221运动反馈帧、0x311轮里程计帧can_interface.cpp初始化can0发送struct can_frame持续接收 CAN 帧处理连接异常chassis_types.hpp定义ChassisState、MotionFeedback、LightState、故障码枚举等不要把这些定义散落在各个.cpp中chassis_params.yamlCAN 接口名、控制发送周期、轮距、最大线速度/角速度、超时阈值、是否启用灯光等chassis.launch.py传入 YAML 参数并启动节点