
1. ROS2 是什么ROS2 可以理解成机器人系统里的“通信框架”。机器人不是一个大程序写到底而是由很多小程序组成。每个小程序负责一件事例如状态读取 速度控制 摄像头读取 目标识别 急停保护 任务状态机这些小程序之间通过 ROS2 通信。2. Node节点ROS2 里的一个可运行程序叫node。 /talker /listener就是两个节点。3. Topic话题Topic 是 ROS2 里的“通信频道”。 /chatter 它就是talker和listener之间传消息的频道。举例的通信结构是talker → /chatter → listener4. ros2 topic list命令ros2 topic list 作用查看当前 ROS2 系统里有哪些 topic。/chatter /parameter_events /rosout 其中/chatter是 talker/listener 正在通信的 topic。5. ros2 node list命令ros2 node list 作用查看当前有哪些 ROS2 节点正在运行。/listener /talker说明当前有两个节点正在运行。6. ros2 topic echo命令ros2 topic echo /chatter 作用直接查看某个 topic 里正在传输的数据。data: Hello World: 99---data: Hello World: 100--- 这说明/chatter频道里确实有数据在传输。二、ROS2 工作空间创建的工作空间是~/Embodied-Robot-Secondary-Dev-Demo它的结构是Embodied-Robot-Secondary-Dev-Demo/ ├── src/ ├── build/ ├── install/ └── log/src 放自己写的 ROS2 源码 build 编译过程文件 install 编译完成后的可运行环境 log 编译日志最重要的是src/。以后写的 ROS2 package 都放在这里。三、colcon build 是什么命令colcon build 作用编译当前 ROS2 工作空间。四、source install/setup.bash 是什么命令source install/setup.bash 作用让当前终端认识你这个 ROS2 工作空间。系统 ROS2 在/opt/ros/jazzy 所以你需要source /opt/ros/jazzy/setup.bash我自己的项目在~/Embodied-Robot-Secondary-Dev-Demo 所以需要source install/setup.bashsource /opt/ros/jazzy/setup.bash 让终端认识 ROS2 本体source install/setup.bash 让终端认识你自己的项目如果以后写完节点后不执行source install/setup.bash可能会出现Package not found五、.bashrc 配置为了避免每次打开新终端都手动加载项目环境可以把工作空间的 setup.bash 写入 .bashrcecho source ~/Embodied-Robot-Secondary-Dev-Demo/install/setup.bash ~/.bashrc作用是以后每次打开新终端都会自动加载当前 ROS2 工作空间这样系统就能找到项目里的 package 和节点命令例如ros2 run robot_base state_publisherros2 run robot_base state_listener配置后可以用下面命令检查source ~/.bashrcros2 pkg list | grep robot_base如果能看到 robot_base说明配置生效。注意不要重复执行很多次 echo ... ~/.bashrc否则 .bashrc 里会出现多行重复配置。六、ROS2 的基本通信模型ROS2 中一个功能模块通常写成一个Node。多个 Node 之间通过Topic传递消息。Node 是机器人系统里的功能模块Topic 是模块之间传消息的通道Message 是具体传输的数据。两条基础通信链路state_publisher.py→/robot/state→state_listener.pycmd_vel_publisher.py→/cmd_vel前一条用于机器人状态读取后一条用于机器人速度控制。七、Publisher 与 ListenerPublisher负责发布消息。它不关心有没有人接收只负责把消息发到指定 topic。例如state_publisher.py会定时向/robot/state发布机器人状态。Listener / Subscriber负责订阅消息。只要 topic 上有新消息它就会自动触发 callback 函数处理。例如state_listener.py订阅/robot/state收到消息后执行state_callback()。核心关系是Publisher 发布 → Topic 传递 → Subscriber 接收 → Callback 处理八、机器人状态消息/robot/state/robot/state用来表示机器人当前状态例如机器人名称 当前模式 电量 是否连接 是否急停 当前线速度 当前角速度我项目的当前代码中状态先用 Python 字典表示再通过json.dumps()转成字符串放进String消息里发布。订阅端收到后再用json.loads()把字符串转回字典然后读取里面的字段。json.dumps()字典变字符串。json.loads()字符串变字典。九、rclpy.spin(node)的作用rclpy.spin(node)的作用是让节点持续运行。如果没有spin节点创建完可能很快退出。对 publisher 来说spin可以让定时器持续触发。对 listener 来说spin可以让节点一直等待新消息。十、速度控制 Topic/cmd_vel/cmd_vel是机器人里常见的速度控制 topic。它通常使用Twist消息类型。常用字段有两个linear.x控制前进或后退速度angular.z控制左转或右转速度常见含义linear.x 0.2angular.z 0.0向前运动不旋转linear.x 0.0angular.z 0.5原地左转linear.x 0.0angular.z 0.0停止这里的0.2表示速度不是“每次走 0.2”。十一、step和tick的作用在cmd_vel_publisher.py中可以用step和tick实现简单动作序列。step表示当前动作阶段。例如step 0前进step 1停止step 2左转step 3停止tick表示当前动作阶段已经执行了多少次。如果定时器周期是 0.5 秒那么动作持续时间 tick × 0.5秒例如前进阶段执行 6 次就是6 × 0.5 3秒。十二、package.xml和setup.pypackage.xml可以理解为 ROS2 package 的说明书和依赖清单。因为/cmd_vel使用Twist而Twist来自geometry_msgs所以需要在package.xml中声明geometry_msgs依赖。setup.py用来注册 Python 节点命令。只有在setup.py里注册了cmd_vel_publisher robot_base.cmd_vel_publisher:main才能通过ros2 run robot_base cmd_vel_publisher运行这个节点。