X:000 · Y:000SECTOR / AIv0.9.SIGNALNO_ADS // NO_TRACK
CILLIAN.AI
← MEMORY

ROS 1 入门:节点、话题与最小可跑系统

用工程视角拆开 ROS 1:Master、节点、Topic/Service/Action、参数与 launch,并给出一个能跑的发布/订阅示例。

2 MIN READ~1500 CHARS
ROS 1 入门:节点、话题与最小可跑系统
SIGNAL COVER · ros1-fundamentals

ROS 1(Robot Operating System)不是传统意义上的操作系统,而是一套机器人中间件 + 工具链:帮你把感知、规划、控制拆成可通信的进程,并配套可视化、录包、参数管理。很多产线、高校课程和遗留代码仍跑在 ROS 1(常见发行版如 Melodic、Noetic)上,搞懂它仍然值得。

本文目标:读完你能画出通信模型,并自己跑通一个最小 pub/sub。

先记住三层

负责什么
通信 节点之间怎么说话(Topic / Service / Action)
工具 roscoreroslaunchrvizrosbagrqt
包生态 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.pylistener.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

复杂系统再叠 machinegroupremap、参数文件——但原则不变:可复现启动 > 手点终端

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 迁过去时最容易踩的坑。

RELATED SIGNALS

SIGNAL FOOTER

本篇已归档到 MEMORY。欢迎继续解码相邻信号,或回到档案首页。