当前位置: 首页 > news >正文

ROS2 环境搭建与基础通信:状态发布订阅与 /cmd_vel 速度控制

1. ROS2 是什么

ROS2 可以理解成机器人系统里的“通信框架”。

机器人不是一个大程序写到底,而是由很多小程序组成。每个小程序负责一件事,例如:

状态读取 速度控制 摄像头读取 目标识别 急停保护 任务状态机

这些小程序之间通过 ROS2 通信。


2. Node:节点

ROS2 里的一个可运行程序叫node。 /talker /listener就是两个节点。


3. Topic:话题

Topic 是 ROS2 里的“通信频道”。 /chatter 它就是talkerlistener之间传消息的频道。

举例的通信结构是:talker → /chatter → listener


4. 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.bash

source /opt/ros/jazzy/setup.bash= 让终端认识 ROS2 本体

source install/setup.bash= 让终端认识你自己的项目

如果以后写完节点后不执行source install/setup.bash,可能会出现:Package not found


五、.bashrc 配置

为了避免每次打开新终端都手动加载项目环境,可以把工作空间的 setup.bash 写入 .bashrc:

echo "source ~/Embodied-Robot-Secondary-Dev-Demo/install/setup.bash" >> ~/.bashrc

作用是:以后每次打开新终端,都会自动加载当前 ROS2 工作空间,这样系统就能找到项目里的 package 和节点命令,

例如:ros2 run robot_base state_publisher

ros2 run robot_base state_listener

配置后可以用下面命令检查:

source ~/.bashrc

ros2 pkg list | grep robot_base

如果能看到 robot_base,说明配置生效。

注意:不要重复执行很多次 echo ... >> ~/.bashrc,否则 .bashrc 里会出现多行重复配置。


六、ROS2 的基本通信模型

ROS2 中,一个功能模块通常写成一个Node。多个 Node 之间通过Topic传递消息。

Node 是机器人系统里的功能模块,Topic 是模块之间传消息的通道,Message 是具体传输的数据。

两条基础通信链路:

state_publisher.py/robot/statestate_listener.py

cmd_vel_publisher.py/cmd_vel

前一条用于机器人状态读取,后一条用于机器人速度控制


七、Publisher 与 Listener

Publisher负责发布消息。它不关心有没有人接收,只负责把消息发到指定 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”。


十一、steptick的作用

cmd_vel_publisher.py中,可以用steptick实现简单动作序列。

step表示当前动作阶段。

例如:step = 0:前进step = 1:停止step = 2:左转step = 3:停止

tick表示当前动作阶段已经执行了多少次。

如果定时器周期是 0.5 秒,那么:动作持续时间 =tick × 0.5

例如:前进阶段执行 6 次,就是6 × 0.5 = 3秒。


十二、package.xmlsetup.py

package.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运行这个节点。

http://www.jsqmd.com/news/994078/

相关文章:

  • 【Qt控件之QTabBar】从入门到精通:构建现代化应用界面的核心组件
  • 2026 翡翠变现不纠结,郑州实体同步全国一线行情 - 奢侈品回收评测
  • 从整改到预防:实战解析PCB布局与GND设计如何轻松应对ESD静电测试
  • 深入解析P89LPC912/913/914:80C51内核的低功耗与时钟系统实战
  • MATLAB许可回收算法,对比三家开源脚本技术
  • 合肥正规回收,钻石回收行情涨跌分析,2026最佳出手时机 - 奢侈品回收评测
  • 企业级AI Agent落地:摒弃技术堆砌,核心是业务与知识
  • Vite HMR 原理与定制:从模块热替换到开发体验优化
  • OpenCore Simplify:5分钟搞定黑苹果EFI配置的终极方案
  • NX许可隐藏浪费,对比三款轻量工具实测数据
  • M3U8视频流下载架构:从原理到实战的完整解决方案
  • 【课程设计/毕业设计】基于springboot+微信小程序的零工市场服务系统小程序零工市场招工服务系统【附源码、数据库、万字文档】
  • 湖南大学OS实验包:多线程同步实战代码,含生产者消费者、哲学家进餐、读写锁、CAS、UDP通信等完整可运行示例
  • VideoCaptioner:基于LLM的智能视频字幕处理终极解决方案
  • 专业级虚幻引擎资产编辑器:UAssetGUI深度解析与实战指南
  • 3分钟搞定个人文件服务器:chfsgui图形化文件共享终极指南
  • 别再让小目标‘隐身’!用PyTorch手把手实现F³Net的加权损失函数(附完整代码)
  • std::move 根本不移动,就像老婆饼里没有老婆
  • 终极歌词获取神器:163MusicLyrics免费工具完整使用指南
  • OpenClaw 小龙虾 AI 多系统适配安装 常见故障排查汇总
  • 卫生间漏水到楼下怎么查找漏水点?2026齐齐哈尔24小时上门维修电话TOP7机构推荐,免费勘察+精准定位,专业师傅处理屋顶墙体洗手间暗管漏水 - 一休咨询
  • ncmdump:终极指南 - 如何快速解密网易云音乐NCM格式文件
  • 3分钟掌握百度网盘秒传技术:永久分享文件的终极指南
  • MCU电气特性深度解析:从Flash、ADC到DC-DC的硬件设计实战
  • FT232H USB转SPI实测工程:含EEPROM烧录工具、SPI电流检测代码与MPSSE时序控制示例
  • NXP NVT4558 SIM卡接口芯片:集成电平转换、EMI滤波与ESD保护的设计实战
  • Gradle 8.0 升级预警:识别并修复废弃API,确保构建兼容性
  • 别再只用流动线了!试试用 ol-wind 插件在Openlayers地图上展示风场与水流动态
  • 辞退员工沟通技巧 实操建议
  • C# EasyModbus库实战:从PLC数据采集到WinForm实时监控(.NET Framework 4.0+)