ROS 2 速查手册
面向:ROS 2 Jazzy / Ubuntu 24.04
0. 一分钟总览
ROS 2 可以先记成这张图:
工作空间 workspace└── src/ ├── package_a/ │ ├── package.xml │ ├── CMakeLists.txt / setup.py │ ├── src/ 或 package_a/ │ ├── launch/ │ ├── config/ │ └── msg/ srv/ action/ └── package_b/
节点 Node │ ├── Topic → 连续数据流:图像、IMU、速度、检测结果 ├── Service → 请求/响应:一次性的查询或控制 ├── Action → 长时间任务:导航、机械臂动作等 ├── Parameter → 节点配置 └── TF2 → 坐标系之间的变换最常用的命令
## 环境source /opt/ros/jazzy/setup.bashsource ~/ros2_ws/install/setup.bash
## 查看 ROS 图ros2 node list # 列出所有节点ros2 topic list # 列出所有话题ros2 service listros2 action list
## 查看详情ros2 node info /node_nameros2 topic info /topic_nameros2 topic type /topic_name # 话题的数据类型ros2 topic hz /topic_name # 话题发布的频率ros2 interface show sensor_msgs/msg/Image
## 运行ros2 run <package> <executable> # 运行一个节点ros2 launch <package> <launch_file> # 拉起一组节点
## 编译colcon buildcolcon build --symlink-install
## 排错ros2 doctorros2 topic echo /topic_name1. ROS 2 基本概念
1.1 Node:节点
Node 是 ROS 2 中执行具体工作的基本单位。
例如一个机器人可能有:
/camera_node ➡️ 发布 /image_raw
/detector_node ➡️ 订阅 /image_raw ➡️ 发布 /detections
/robot_controller ➡️ 订阅 /detections ➡️ 控制机器人查看:
ros2 node list查看某个节点:
ros2 node info /camera_node1.2 Topic:话题
Topic 是 ROS 2 中最常见的通信方式。
特点:
- 发布者 Publisher
- 订阅者 Subscriber
- 一对多、多对一、多对多都可以
- 适合连续数据
例如:
Camera ──publish──> /image_raw ──subscribe──> Detector │ └──────> Viewer常见 Topic:
/image_raw/camera_info/imu/data/cmd_vel/scan/odom/tf/tf_static查看:
ros2 topic list查看类型:
ros2 topic type /image_raw查看信息:
ros2 topic info /image_raw查看详细 QoS:
QoS(Quality of Service)决定”消息丢了怎么办、队列多深”。图像类用 (只留最新帧)。项目里几乎全用 QoS(1) 就够了。真正要调 QoS 的时机是:图像订阅不上、或者图像掉帧——先想到 QoS 不匹配。
ros2 topic info /image_raw --verbose查看数据:
ros2 topic echo /topic_name查看发布频率:
ros2 topic hz /topic_name查看带宽:
ros2 topic bw /topic_name查看消息类型结构:
ros2 interface show sensor_msgs/msg/Image2. Service:服务
Service 是典型的:
Client │ request ▼Server │ response ▼Client例如:
/reset/spawn/set_parameters查看:
ros2 service list查看类型:
ros2 service type /service_name查看接口:
ros2 interface show example_interfaces/srv/AddTwoInts调用:
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 3, b: 5}"3. Action:动作
Action 适合需要一段时间才能完成的任务。
Client │ ├── Goal ──────────────> │ │ <──── Feedback ────── │ <──── Feedback ────── │ └── Result <───────────例如:
- 导航到目标点
- 机械臂移动
- 长时间执行任务
查看:
ros2 action listros2 action info /action_nameros2 action type /action_name查看接口:
ros2 interface show <package>/action/<ActionName>4. Parameter:参数
Parameter 是节点运行时的配置。
例如:
threshold = 0.5camera_fps = 30use_gpu = trueframe_id = camera_link查看:
ros2 param list查看某个节点:
ros2 param list /detector读取:
ros2 param get /detector threshold设置:
ros2 param set /detector threshold 0.6导出:
ros2 param dump /detector加载:
ros2 param load /detector config.yaml5. Workspace:工作空间
推荐结构:
~/ros2_ws/├── src/│ ├── my_robot/│ ├── my_camera/│ └── my_detector/├── build/├── install/└── log/创建:
mkdir -p ~/ros2_ws/srccd ~/ros2_ws进入源码:
cd ~/ros2_ws/src编译:
cd ~/ros2_wscolcon build开发阶段推荐:
colcon build --symlink-install编译单个包:
colcon build --packages-select my_package跳过某个包:
colcon build --packages-skip my_package只编译依赖链:
colcon build --packages-up-to my_package编译后:
source install/setup.bash确认包:
ros2 pkg list | grep my_package6. 环境配置
6.1 每个新终端
source /opt/ros/jazzy/setup.bashsource ~/ros2_ws/install/setup.bash推荐写入:
echo 'source /opt/ros/jazzy/setup.bash' >> ~/.bashrcecho 'source ~/ros2_ws/install/setup.bash' >> ~/.bashrc如果使用 zsh:
echo 'source /opt/ros/jazzy/setup.bash' >> ~/.zshrcecho 'source ~/ros2_ws/install/setup.bash' >> ~/.zshrc7. 创建 ROS 2 Package
进入:
cd ~/ros2_ws/srcC++
ros2 pkg create \ --build-type ament_cmake \ --license Apache-2.0 \ my_cpp_pkg带依赖:
ros2 pkg create \ --build-type ament_cmake \ --license Apache-2.0 \ my_cpp_pkg \ --dependencies rclcpp std_msgs sensor_msgsPython
ros2 pkg create \ --build-type ament_python \ --license Apache-2.0 \ my_py_pkg带依赖:
ros2 pkg create \ --build-type ament_python \ --license Apache-2.0 \ my_py_pkg \ --dependencies rclpy std_msgs8. Python Node 最小模板
import rclpyfrom rclpy.node import Node
class MyNode(Node): def __init__(self): super().__init__('my_node') self.get_logger().info('Node started!')
def main(args=None): rclpy.init(args=args)
node = MyNode()
rclpy.spin(node)
node.destroy_node() rclpy.shutdown()
if __name__ == '__main__': main()运行:
ros2 run my_py_pkg my_node9. C++ Node 最小模板
##include <rclcpp/rclcpp.hpp>
class MyNode : public rclcpp::Node{public: MyNode() : Node("my_node") { RCLCPP_INFO(this->get_logger(), "Node started!"); }};
int main(int argc, char * argv[]){ rclcpp::init(argc, argv);
auto node = std::make_shared<MyNode>();
rclcpp::spin(node);
rclcpp::shutdown(); return 0;}10. Publisher / Subscriber
Python Publisher
from std_msgs.msg import String
self.publisher = self.create_publisher( String, '/chatter', 10)发布:
msg = String()msg.data = 'Hello ROS 2'self.publisher.publish(msg)定时发布:
self.timer = self.create_timer( 0.1, self.timer_callback)Python Subscriber
self.subscription = self.create_subscription( String, '/chatter', self.callback, 10)回调:
def callback(self, msg): self.get_logger().info(msg.data)CLI 手动发布
ros2 topic pub /chatter std_msgs/msg/String "{data: Hello}"持续发布:
ros2 topic pub -r 10 /chatter std_msgs/msg/String "{data: Hello}"只发布一次:
ros2 topic pub --once /chatter std_msgs/msg/String "{data: Hello}"11. 常见 Message 类型
std_msgs
std_msgs/msg/Stringstd_msgs/msg/Boolstd_msgs/msg/Int32std_msgs/msg/Float32查看:
ros2 interface show std_msgs/msg/Stringgeometry_msgs
常用:
geometry_msgs/msg/Pointgeometry_msgs/msg/Vector3geometry_msgs/msg/Quaterniongeometry_msgs/msg/Posegeometry_msgs/msg/PoseStampedgeometry_msgs/msg/Twistgeometry_msgs/msg/Transformgeometry_msgs/msg/TransformStamped例如速度:
Twist├── linear│ ├── x│ ├── y│ └── z└── angular ├── x ├── y └── zsensor_msgs
机器人视觉特别常用:
sensor_msgs/msg/Imagesensor_msgs/msg/CameraInfosensor_msgs/msg/Imusensor_msgs/msg/LaserScansensor_msgs/msg/PointCloud2sensor_msgs/msg/JointStatenav_msgs
nav_msgs/msg/Odometrynav_msgs/msg/Path12. Image / OpenCV
最常见:
Camera ↓sensor_msgs/Image ↓cv_bridge ↓OpenCV ndarray ↓算法Python:
from cv_bridge import CvBridge
self.bridge = CvBridge()
def callback(self, msg): frame = self.bridge.imgmsg_to_cv2( msg, desired_encoding='bgr8' )发布 OpenCV 图像:
msg = self.bridge.cv2_to_imgmsg( frame, encoding='bgr8')
self.publisher.publish(msg)常见 encoding:
bgr8rgb8mono8mono1632FC113. CameraInfo
相机标定信息通常来自:
/camera/camera_info消息:
ros2 topic type /camera/camera_info通常包含:
K → 内参矩阵D → 畸变参数R → 校正矩阵P → 投影矩阵针孔模型核心:
u = fx * X/Z + cxv = fy * Y/Z + cy反投影:
X = (u - cx) * Z / fxY = (v - cy) * Z / fyZ = Z14. TF2:坐标变换
机器人视觉中非常重要。
典型结构:
map └── odom └── base_link └── camera_link └── camera_optical_frame含义:
camera_optical_frame ↓ TFbase_link ↓ TFodom ↓ TFmap查看 TF:
ros2 run tf2_tools view_frames查看两个坐标系:
ros2 run tf2_ros tf2_echo base_link camera_link查看 TF Topic:
ros2 topic echo /tfros2 topic echo /tf_static15. TF2 中最重要的概念
不要把:
camera → robot简单理解成“加一个 xyz”。
完整变换通常是:
p_robot = R * p_camera + t其中:
R = 3×3 rotation matrixt = 3×1 translation vector齐次矩阵:
T =[ R11 R12 R13 tx ][ R21 R22 R23 ty ][ R31 R32 R33 tz ][ 0 0 0 1 ]坐标变换:
p_robot_h = T_robot_camera * p_camera_h16. TF2 Python 常用代码
from tf2_ros import Buffer, TransformListener
self.tf_buffer = Buffer()self.tf_listener = TransformListener( self.tf_buffer, self)查询:
transform = self.tf_buffer.lookup_transform( 'base_link', 'camera_link', rclpy.time.Time())使用:
t = transform.transform.translation
x = t.xy = t.yz = t.z如果查询可能失败:
try: transform = self.tf_buffer.lookup_transform( 'base_link', 'camera_link', rclpy.time.Time() )except Exception as e: self.get_logger().warn(str(e))17. QoS
ROS 2 中通信不仅仅是“能不能收到”。
还涉及 QoS:
ReliabilityDurabilityHistoryDepthDeadlineLifespan常见:
from rclpy.qos import QoSProfile
qos = QoSProfile( depth=10)可靠性:
RELIABLEBEST_EFFORT理解:
RELIABLE→ 尽量保证消息送达
BEST_EFFORT→ 尽快发送,允许丢包相机图像、激光雷达等高频数据经常需要考虑 QoS 匹配。
查看:
ros2 topic info /image_raw --verbose18. Launch
Launch 用于一次启动多个节点。
推荐:
my_package/└── launch/ └── bringup.launch.pyPython Launch:
from launch import LaunchDescriptionfrom launch_ros.actions import Node
def generate_launch_description(): return LaunchDescription([ Node( package='my_package', executable='camera_node', name='camera' ),
Node( package='my_package', executable='detector_node', name='detector' ), ])运行:
ros2 launch my_package bringup.launch.py19. Launch 中传参数
Node( package='my_package', executable='detector', parameters=[{ 'threshold': 0.5, 'debug': True, }])命令行覆盖:
ros2 launch my_package bringup.launch.py threshold:=0.720. YAML 参数文件
detector: ros__parameters: threshold: 0.5 debug: true max_distance: 10.0Launch:
Node( package='my_package', executable='detector', parameters=['config/detector.yaml'])21. ros2 run / launch 区别
ros2 run ↓运行一个 executable
ros2 launch ↓按照 LaunchDescription一次启动多个节点并统一管理参数、命名空间、条件等简单测试:
ros2 run package node正式系统:
ros2 launch package bringup.launch.py22. rosbag:录制与回放
录制:
ros2 bag record /image_raw录制多个:
ros2 bag record \ /image_raw \ /camera_info \ /imu/data录制全部:
ros2 bag record -a查看 bag:
ros2 bag info <bag_directory>回放:
ros2 bag play <bag_directory>暂停:
空格机器人视觉开发非常推荐:
真实相机 ↓rosbag record ↓保存数据 ↓离线算法开发这样可以避免每次都连接真实机器人。
23. rosdep
自动安装依赖。
更新:
sudo rosdep initrosdep update安装当前工作空间依赖:
cd ~/ros2_wsrosdep install \ --from-paths src \ --ignore-src \ -r \ -y这是新机器部署 ROS 项目时非常重要的一步。
24. Package 查询
ros2 pkg list查某个包:
ros2 pkg list | grep camera包路径:
ros2 pkg prefix <package>查看包信息:
ros2 pkg executables <package>例如:
ros2 pkg executables demo_nodes_cpp25. Interface 查询
ROS 2 接口包括:
msgsrvaction查看:
ros2 interface list查消息:
ros2 interface list | grep Image查看结构:
ros2 interface show sensor_msgs/msg/Image服务:
ros2 interface show example_interfaces/srv/AddTwoInts26. 日志
代码:
self.get_logger().debug('debug')self.get_logger().info('info')self.get_logger().warn('warning')self.get_logger().error('error')self.get_logger().fatal('fatal')CLI:
ros2 run <package> <node> --ros-args --log-level debug按节点:
ros2 run <package> <node> \ --ros-args \ --log-level <node_name>:=debug27. rqt
启动:
rqt常用:
rqt_graphrqt_consoleROS Graph:
rqt_graph用于观察:
Node ↓Topic ↓Node28. RViz2
启动:
rviz2典型机器人视觉配置:
Fixed Frame: base_link
Displays: TF Image PointCloud2 LaserScan RobotModel Marker Path如果 Image 看不到:
- 检查 Topic
- 检查 QoS
- 检查 frame
- 检查消息类型
- 检查节点是否真的在发布
29. ros2 doctor
快速检查:
ros2 doctor详细:
ros2 doctor --report出现“节点找不到”时先检查:
printenv | grep ROS30. ROS_DOMAIN_ID
ROS 2 节点默认通过 DDS 发现彼此。
可以用:
echo $ROS_DOMAIN_ID设置:
export ROS_DOMAIN_ID=10例如:
机器人 AROS_DOMAIN_ID=10
机器人 BROS_DOMAIN_ID=10
→ 可以发现彼此不同 Domain:
A: 10B: 20
→ 默认不会互相发现注意:多机器人系统中需要统一规划 Domain ID。
31. RMW
ROS 2 底层通信通过 RMW 抽象层连接 DDS / 其他 middleware。
查看:
echo $RMW_IMPLEMENTATION例如:
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp不要在不了解系统通信环境的情况下随意切换 RMW。
32. 网络通信排错
两个终端:
echo $ROS_DOMAIN_IDecho $RMW_IMPLEMENTATION检查节点:
ros2 node list如果 A 能看到自己,B 看不到 A:
检查:├── ROS_DOMAIN_ID├── RMW_IMPLEMENTATION├── 网络连通性├── 防火墙├── DDS discovery└── multicast / discovery 配置33. 常见命令速查表
| 目的 | 命令 |
|---|---|
| 查看节点 | ros2 node list |
| 节点详情 | ros2 node info /node |
| 查看 Topic | ros2 topic list |
| Topic 类型 | ros2 topic type /topic |
| Topic 详情 | ros2 topic info /topic |
| QoS | ros2 topic info /topic --verbose |
| 看数据 | ros2 topic echo /topic |
| 看频率 | ros2 topic hz /topic |
| 看带宽 | ros2 topic bw /topic |
| 发布 Topic | ros2 topic pub ... |
| 服务列表 | ros2 service list |
| 服务类型 | ros2 service type /service |
| 调用服务 | ros2 service call ... |
| Action 列表 | ros2 action list |
| 参数列表 | ros2 param list |
| 读参数 | ros2 param get ... |
| 写参数 | ros2 param set ... |
| 包列表 | ros2 pkg list |
| 包路径 | ros2 pkg prefix ... |
| 接口列表 | ros2 interface list |
| 查看接口 | ros2 interface show ... |
| 运行节点 | ros2 run ... |
| Launch | ros2 launch ... |
| 检查系统 | ros2 doctor |
| 查看 TF | tf2_echo |
| 图形工具 | rqt |
| RViz | rviz2 |
| 录包 | ros2 bag record |
| 回放 | ros2 bag play |
34. 一个完整的机器人视觉 Pipeline
以“相机识别足球”为例:
Camera │ │ /camera/image_raw ▼Image Subscriber │ ▼OpenCV │ ├── HSV / RGB ├── ROI ├── Threshold ├── Contour └── Detection │ ▼2D Ball Position │ ├── CameraInfo └── Depth / Stereo │ ▼3D Ball Position(camera frame) │ ▼TF2 │ ▼Robot Frame │ ▼Filtering(Kalman / temporal filtering) │ ▼Motion / Control对应 ROS 2 通信可能是:
/camera/image_raw/camera/camera_info/ball/detection/ball/position/tf/tf_static/cmd_vel35. 机器人视觉开发建议
推荐把系统拆成:
camera_node ↓image_topic
detector_node ↓detection_topic
localization_node ↓position_topic
filter_node ↓filtered_position_topic
controller_node ↓cmd_vel / joint commands不要把所有代码塞进一个 Node。
这样更容易:
- 单独测试
- rosbag 回放
- 替换算法
- 调试 Topic
- 观察频率
- 并行开发
36. 高频视觉 Topic 的实用检查
假设:
ros2 topic echo /camera/image_raw非常卡。
不要直接认为 OpenCV 有问题。
先:
ros2 topic hz /camera/image_raw再:
ros2 topic info /camera/image_raw --verbose再检查:
分辨率FPSQoS编码CPU内存网络例如:
1920 × 1080 × 30 FPS数据量可能非常大。
因此机器人视觉中经常需要:
降低分辨率降低 FPS使用合适 QoSROI压缩图像减少复制使用 intra-process communication37. 常见错误
ros2: command not found
source /opt/ros/jazzy/setup.bash找不到自己的包
source ~/ros2_ws/install/setup.bash然后:
ros2 pkg list | grep your_package修改 Python 后没有生效
开发时推荐:
colcon build --symlink-install然后:
source install/setup.bashTopic 存在但收不到数据
检查:
ros2 topic info /topic --verbose重点检查:
Publisher QoSSubscriber QoSReliabilityDurabilityTF lookup 失败
先确认:
ros2 run tf2_ros tf2_echo base_link camera_link再检查:
frame 名称是否写错TF 是否真的发布时间戳是否合理是否存在 TF 链RViz 显示异常
检查:
Fixed FrameTFTopicQoS消息类型时间戳38. 开发时最推荐的工作流
## 1. 进入工作空间cd ~/ros2_ws
## 2. 拉取 / 编写代码cd src
## 3. 安装依赖rosdep install --from-paths src --ignore-src -r -y
## 4. 编译cd ..colcon build --symlink-install
## 5. 加载环境source install/setup.bash
## 6. 查看节点ros2 node list
## 7. 查看 Topicros2 topic list
## 8. 查看 Topic 频率ros2 topic hz /xxx
## 9. 启动系统ros2 launch my_package bringup.launch.py
## 10. 使用 RViz / rqt 调试rviz2rqt_graph39. “看到问题先敲什么”决策树
程序跑不起来│├── ros2 命令不存在?│ └── source /opt/ros/jazzy/setup.bash│├── 找不到 package?│ └── source install/setup.bash│├── Node 启动了?│ └── ros2 node list│├── Topic 存在?│ └── ros2 topic list│├── Topic 有数据?│ └── ros2 topic echo /xxx│├── Topic 有频率?│ └── ros2 topic hz /xxx│├── 类型正确?│ └── ros2 topic type /xxx│├── QoS 匹配?│ └── ros2 topic info /xxx --verbose│├── 坐标系正确?│ └── tf2_echo frame_a frame_b│└── 整体异常? └── ros2 doctor --report40. 必须记住的 10 个命令
如果只能记十个:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
colcon build --symlink-install
ros2 node list
ros2 topic list
ros2 topic echo /topic
ros2 topic info /topic --verbose
ros2 topic hz /topic
ros2 run <package> <node>
ros2 launch <package> <launch.py>41. 最小心智模型
最后把 ROS 2 压缩成下面这句话:
Node 做事情,Topic 传数据,Service 做请求,Action 做长任务,Parameter 配置 Node,TF2 管坐标,Launch 管启动,colcon 管编译,rosbag 管数据回放,RViz/rqt 管观察。
如果做机器人视觉:
相机 → Topic → OpenCV → 检测 → 3D → TF2 → 滤波 → 控制。
这就是以后写复杂机器人系统时最重要的骨架。
官方参考
- ROS 2 Jazzy CLI:
https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools.html - ROS 2 Jazzy Package 开发:
https://docs.ros.org/en/jazzy/How-To-Guides/Developing-a-ROS-2-Package.html - ROS 2 Jazzy Launch:
https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Launch-system.html - ROS 2 Jazzy Tutorials:
https://docs.ros.org/en/jazzy/Tutorials.html
本手册以 ROS 2 Jazzy 的常用工作流为主;具体 API、QoS、RMW、驱动和第三方包行为应以对应发行版/包的官方文档为准。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或投喂支持!
无穷量?