ROS 1(Robot Operating System)不是传统意义上的操作系统,而是一套机器人中间件 + 工具链:帮你把感知、规划、控制拆成可通信的进程,并配套可视化、录包、参数管理。很多产线、高校课程和遗留代码仍跑在 ROS 1(常见发行版如 Melodic、Noetic)上,搞懂它仍然值得。
本文目标:读完你能画出通信模型,并自己跑通一个最小 pub/sub。
先记住三层
| 层 | 负责什么 |
|---|---|
| 通信 | 节点之间怎么说话(Topic / Service / Action) |
| 工具 | roscore、roslaunch、rviz、rosbag、rqt |
| 包生态 | catkin 工作空间里的 package(C++/Python 节点) |
没有 roscore(Master),节点互相发现不了对方——这是 ROS 1 和 ROS 2 最大的架构差异之一。
核心抽象
Node(节点)
一个可执行进程,做一件事:读激光、发速度、做 SLAM……节点通过名字注册到 Master。
Topic(话题)——异步流
一对多、持续推送。适合传感器、里程计、图像。
Publisher ──/scan──▶ Subscriber(s)
特点:发送方不关心有没有人听;延迟低、吞吐高;不保证每次调用都成功送达(UDP 味更重的使用场景常见)。
Service(服务)——同步 RPC
一问一答。适合「拍一张图」「重置里程计」。
Client ──request──▶ Server
◀─response──
调用期间会阻塞等待;服务端挂了或超时,客户端要自己处理失败。
Action(动作)——长任务 + 反馈
适合导航到点、机械臂轨迹:有目标、有过程反馈、可取消。底层常由 actionlib 用一组 Topic 实现。
Parameter(参数)
全局/私有键值配置。启动时注入,运行时可读可改(也容易变成「隐式全局状态」,要克制)。
最小工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
source devel/setup.bash
新建包(示例名 demo_talker):
cd ~/catkin_ws/src
catkin_create_pkg demo_talker rospy std_msgs
发布者(Python)
src/demo_talker/scripts/talker.py:
#!/usr/bin/env python3
import rospy
from std_msgs.msg import String
def main():
rospy.init_node("talker")
pub = rospy.Publisher("chatter", String, queue_size=10)
rate = rospy.Rate(10) # 10 Hz
i = 0
while not rospy.is_shutdown():
msg = String(data=f"hello ROS1 {i}")
pub.publish(msg)
i += 1
rate.sleep()
if __name__ == "__main__":
main()
订阅者
#!/usr/bin/env python3
import rospy
from std_msgs.msg import String
def cb(msg):
rospy.loginfo("I heard: %s", msg.data)
def main():
rospy.init_node("listener")
rospy.Subscriber("chatter", String, cb)
rospy.spin()
if __name__ == "__main__":
main()
终端 A:
roscore
终端 B / C:分别 rosrun demo_talker talker.py 与 listener.py(记得 chmod +x)。
日常排障三板斧
rosnode list # 谁活着
rostopic list # 有哪些话题
rostopic echo /chatter
rostopic hz /chatter # 实际频率
rosmsg show std_msgs/String
对不上类型、没 source setup.bash、Master 不在同一 ROS_MASTER_URI,是新手 80% 的坑。
Launch:别手工开十个终端
<!-- demo.launch -->
<launch>
<node pkg="demo_talker" type="talker.py" name="talker" output="screen"/>
<node pkg="demo_talker" type="listener.py" name="listener" output="screen"/>
</launch>
roslaunch demo_talker demo.launch
复杂系统再叠 machine、group、remap、参数文件——但原则不变:可复现启动 > 手点终端。
rosbag:时间旅行调试
rosbag record /scan /odom -O run1.bag
rosbag play run1.bag
传感器贵、现场难复现时,bag 就是你的单元测试夹具。录的时候想清楚话题列表,别无脑全录撑爆磁盘。
什么时候还该用 ROS 1
适合:
- 维护 Noetic 产线/课程资产
- 依赖大量尚未完整迁移的 ROS 1 only 包
- 单机、局域网、对实时性要求不极端的系统
不适合新开长期项目时优先选 ROS 1:官方已 EOL 导向 ROS 2;多机发现、QoS、安全与实时调度,ROS 2 更现代。
小结
ROS 1 的心智模型可以压成一句话:Master 做黄页,Node 做工人,Topic 拉流水线,Service/Action 处理问答与长任务。 先跑通 talker/listener,再上 rviz 看点云、用 rosbag 存一场实验——比先背完所有 CLI 更有体感。
下一篇会讲 ROS 2:DDS、QoS、生命周期节点,以及从 ROS 1 迁过去时最容易踩的坑。
