ROS 2 速查手册

3377 字
17 分钟
ROS 2 速查手册
TIP

面向: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 → 坐标系之间的变换

最常用的命令#

Terminal window
## 环境
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
## 查看 ROS 图
ros2 node list # 列出所有节点
ros2 topic list # 列出所有话题
ros2 service list
ros2 action list
## 查看详情
ros2 node info /node_name
ros2 topic info /topic_name
ros2 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 build
colcon build --symlink-install
## 排错
ros2 doctor
ros2 topic echo /topic_name

1. ROS 2 基本概念#

1.1 Node:节点#

Node 是 ROS 2 中执行具体工作的基本单位。

例如一个机器人可能有:

/camera_node ➡️ 发布 /image_raw
/detector_node ➡️ 订阅 /image_raw ➡️ 发布 /detections
/robot_controller ➡️ 订阅 /detections ➡️ 控制机器人

查看:

Terminal window
ros2 node list

查看某个节点:

Terminal window
ros2 node info /camera_node

1.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

查看:

Terminal window
ros2 topic list

查看类型:

Terminal window
ros2 topic type /image_raw

查看信息:

Terminal window
ros2 topic info /image_raw

查看详细 QoS:

QoS(Quality of Service)决定”消息丢了怎么办、队列多深”。图像类用 11(只留最新帧)。项目里几乎全用 QoS(1) 就够了。真正要调 QoS 的时机是:图像订阅不上、或者图像掉帧——先想到 QoS 不匹配。

Terminal window
ros2 topic info /image_raw --verbose

查看数据:

Terminal window
ros2 topic echo /topic_name

查看发布频率:

Terminal window
ros2 topic hz /topic_name

查看带宽:

Terminal window
ros2 topic bw /topic_name

查看消息类型结构:

Terminal window
ros2 interface show sensor_msgs/msg/Image

2. Service:服务#

Service 是典型的:

Client
│ request
Server
│ response
Client

例如:

/reset
/spawn
/set_parameters

查看:

Terminal window
ros2 service list

查看类型:

Terminal window
ros2 service type /service_name

查看接口:

Terminal window
ros2 interface show example_interfaces/srv/AddTwoInts

调用:

Terminal window
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 3, b: 5}"

3. Action:动作#

Action 适合需要一段时间才能完成的任务。

Client
├── Goal ──────────────>
│ <──── Feedback ──────
│ <──── Feedback ──────
└── Result <───────────

例如:

  • 导航到目标点
  • 机械臂移动
  • 长时间执行任务

查看:

Terminal window
ros2 action list
ros2 action info /action_name
ros2 action type /action_name

查看接口:

Terminal window
ros2 interface show <package>/action/<ActionName>

4. Parameter:参数#

Parameter 是节点运行时的配置。

例如:

threshold = 0.5
camera_fps = 30
use_gpu = true
frame_id = camera_link

查看:

Terminal window
ros2 param list

查看某个节点:

Terminal window
ros2 param list /detector

读取:

Terminal window
ros2 param get /detector threshold

设置:

Terminal window
ros2 param set /detector threshold 0.6

导出:

Terminal window
ros2 param dump /detector

加载:

Terminal window
ros2 param load /detector config.yaml

5. Workspace:工作空间#

推荐结构:

~/ros2_ws/
├── src/
│ ├── my_robot/
│ ├── my_camera/
│ └── my_detector/
├── build/
├── install/
└── log/

创建:

Terminal window
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

进入源码:

Terminal window
cd ~/ros2_ws/src

编译:

Terminal window
cd ~/ros2_ws
colcon build

开发阶段推荐:

Terminal window
colcon build --symlink-install

编译单个包:

Terminal window
colcon build --packages-select my_package

跳过某个包:

Terminal window
colcon build --packages-skip my_package

只编译依赖链:

Terminal window
colcon build --packages-up-to my_package

编译后:

Terminal window
source install/setup.bash

确认包:

Terminal window
ros2 pkg list | grep my_package

6. 环境配置#

6.1 每个新终端#

Terminal window
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash

推荐写入:

Terminal window
echo 'source /opt/ros/jazzy/setup.bash' >> ~/.bashrc
echo 'source ~/ros2_ws/install/setup.bash' >> ~/.bashrc

如果使用 zsh:

Terminal window
echo 'source /opt/ros/jazzy/setup.bash' >> ~/.zshrc
echo 'source ~/ros2_ws/install/setup.bash' >> ~/.zshrc

7. 创建 ROS 2 Package#

进入:

Terminal window
cd ~/ros2_ws/src

C++#

Terminal window
ros2 pkg create \
--build-type ament_cmake \
--license Apache-2.0 \
my_cpp_pkg

带依赖:

Terminal window
ros2 pkg create \
--build-type ament_cmake \
--license Apache-2.0 \
my_cpp_pkg \
--dependencies rclcpp std_msgs sensor_msgs

Python#

Terminal window
ros2 pkg create \
--build-type ament_python \
--license Apache-2.0 \
my_py_pkg

带依赖:

Terminal window
ros2 pkg create \
--build-type ament_python \
--license Apache-2.0 \
my_py_pkg \
--dependencies rclpy std_msgs

8. Python Node 最小模板#

import rclpy
from 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()

运行:

Terminal window
ros2 run my_py_pkg my_node

9. 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 手动发布#

Terminal window
ros2 topic pub /chatter std_msgs/msg/String "{data: Hello}"

持续发布:

Terminal window
ros2 topic pub -r 10 /chatter std_msgs/msg/String "{data: Hello}"

只发布一次:

Terminal window
ros2 topic pub --once /chatter std_msgs/msg/String "{data: Hello}"

11. 常见 Message 类型#

std_msgs#

std_msgs/msg/String
std_msgs/msg/Bool
std_msgs/msg/Int32
std_msgs/msg/Float32

查看:

Terminal window
ros2 interface show std_msgs/msg/String

geometry_msgs#

常用:

geometry_msgs/msg/Point
geometry_msgs/msg/Vector3
geometry_msgs/msg/Quaternion
geometry_msgs/msg/Pose
geometry_msgs/msg/PoseStamped
geometry_msgs/msg/Twist
geometry_msgs/msg/Transform
geometry_msgs/msg/TransformStamped

例如速度:

Twist
├── linear
│ ├── x
│ ├── y
│ └── z
└── angular
├── x
├── y
└── z

sensor_msgs#

机器人视觉特别常用:

sensor_msgs/msg/Image
sensor_msgs/msg/CameraInfo
sensor_msgs/msg/Imu
sensor_msgs/msg/LaserScan
sensor_msgs/msg/PointCloud2
sensor_msgs/msg/JointState

nav_msgs/msg/Odometry
nav_msgs/msg/Path

12. 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:

bgr8
rgb8
mono8
mono16
32FC1

13. CameraInfo#

相机标定信息通常来自:

/camera/camera_info

消息:

Terminal window
ros2 topic type /camera/camera_info

通常包含:

K → 内参矩阵
D → 畸变参数
R → 校正矩阵
P → 投影矩阵

针孔模型核心:

u = fx * X/Z + cx
v = fy * Y/Z + cy

反投影:

X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
Z = Z

14. TF2:坐标变换#

机器人视觉中非常重要。

典型结构:

map
└── odom
└── base_link
└── camera_link
└── camera_optical_frame

含义:

camera_optical_frame
↓ TF
base_link
↓ TF
odom
↓ TF
map

查看 TF:

Terminal window
ros2 run tf2_tools view_frames

查看两个坐标系:

Terminal window
ros2 run tf2_ros tf2_echo base_link camera_link

查看 TF Topic:

Terminal window
ros2 topic echo /tf
ros2 topic echo /tf_static

15. TF2 中最重要的概念#

不要把:

camera → robot

简单理解成“加一个 xyz”。

完整变换通常是:

p_robot = R * p_camera + t

其中:

R = 3×3 rotation matrix
t = 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_h

16. 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.x
y = t.y
z = 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:

Reliability
Durability
History
Depth
Deadline
Lifespan

常见:

from rclpy.qos import QoSProfile
qos = QoSProfile(
depth=10
)

可靠性:

RELIABLE
BEST_EFFORT

理解:

RELIABLE
→ 尽量保证消息送达
BEST_EFFORT
→ 尽快发送,允许丢包

相机图像、激光雷达等高频数据经常需要考虑 QoS 匹配。

查看:

Terminal window
ros2 topic info /image_raw --verbose

18. Launch#

Launch 用于一次启动多个节点。

推荐:

my_package/
└── launch/
└── bringup.launch.py

Python Launch:

from launch import LaunchDescription
from 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'
),
])

运行:

Terminal window
ros2 launch my_package bringup.launch.py

19. Launch 中传参数#

Node(
package='my_package',
executable='detector',
parameters=[{
'threshold': 0.5,
'debug': True,
}]
)

命令行覆盖:

Terminal window
ros2 launch my_package bringup.launch.py threshold:=0.7

20. YAML 参数文件#

detector:
ros__parameters:
threshold: 0.5
debug: true
max_distance: 10.0

Launch:

Node(
package='my_package',
executable='detector',
parameters=['config/detector.yaml']
)

21. ros2 run / launch 区别#

ros2 run
运行一个 executable
ros2 launch
按照 LaunchDescription
一次启动多个节点
并统一管理参数、命名空间、条件等

简单测试:

Terminal window
ros2 run package node

正式系统:

Terminal window
ros2 launch package bringup.launch.py

22. rosbag:录制与回放#

录制:

Terminal window
ros2 bag record /image_raw

录制多个:

Terminal window
ros2 bag record \
/image_raw \
/camera_info \
/imu/data

录制全部:

Terminal window
ros2 bag record -a

查看 bag:

Terminal window
ros2 bag info <bag_directory>

回放:

Terminal window
ros2 bag play <bag_directory>

暂停:

空格

机器人视觉开发非常推荐:

真实相机
rosbag record
保存数据
离线算法开发

这样可以避免每次都连接真实机器人。


23. rosdep#

自动安装依赖。

更新:

Terminal window
sudo rosdep init
rosdep update

安装当前工作空间依赖:

Terminal window
cd ~/ros2_ws
rosdep install \
--from-paths src \
--ignore-src \
-r \
-y

这是新机器部署 ROS 项目时非常重要的一步。


24. Package 查询#

Terminal window
ros2 pkg list

查某个包:

Terminal window
ros2 pkg list | grep camera

包路径:

Terminal window
ros2 pkg prefix <package>

查看包信息:

Terminal window
ros2 pkg executables <package>

例如:

Terminal window
ros2 pkg executables demo_nodes_cpp

25. Interface 查询#

ROS 2 接口包括:

msg
srv
action

查看:

Terminal window
ros2 interface list

查消息:

Terminal window
ros2 interface list | grep Image

查看结构:

Terminal window
ros2 interface show sensor_msgs/msg/Image

服务:

Terminal window
ros2 interface show example_interfaces/srv/AddTwoInts

26. 日志#

代码:

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:

Terminal window
ros2 run <package> <node> --ros-args --log-level debug

按节点:

Terminal window
ros2 run <package> <node> \
--ros-args \
--log-level <node_name>:=debug

27. rqt#

启动:

Terminal window
rqt

常用:

Terminal window
rqt_graph
rqt_console

ROS Graph:

Terminal window
rqt_graph

用于观察:

Node
Topic
Node

28. RViz2#

启动:

Terminal window
rviz2

典型机器人视觉配置:

Fixed Frame:
base_link
Displays:
TF
Image
PointCloud2
LaserScan
RobotModel
Marker
Path

如果 Image 看不到:

  1. 检查 Topic
  2. 检查 QoS
  3. 检查 frame
  4. 检查消息类型
  5. 检查节点是否真的在发布

29. ros2 doctor#

快速检查:

Terminal window
ros2 doctor

详细:

Terminal window
ros2 doctor --report

出现“节点找不到”时先检查:

Terminal window
printenv | grep ROS

30. ROS_DOMAIN_ID#

ROS 2 节点默认通过 DDS 发现彼此。

可以用:

Terminal window
echo $ROS_DOMAIN_ID

设置:

Terminal window
export ROS_DOMAIN_ID=10

例如:

机器人 A
ROS_DOMAIN_ID=10
机器人 B
ROS_DOMAIN_ID=10
→ 可以发现彼此

不同 Domain:

A: 10
B: 20
→ 默认不会互相发现

注意:多机器人系统中需要统一规划 Domain ID。


31. RMW#

ROS 2 底层通信通过 RMW 抽象层连接 DDS / 其他 middleware。

查看:

Terminal window
echo $RMW_IMPLEMENTATION

例如:

Terminal window
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

不要在不了解系统通信环境的情况下随意切换 RMW。


32. 网络通信排错#

两个终端:

Terminal window
echo $ROS_DOMAIN_ID
echo $RMW_IMPLEMENTATION

检查节点:

Terminal window
ros2 node list

如果 A 能看到自己,B 看不到 A:

检查:
├── ROS_DOMAIN_ID
├── RMW_IMPLEMENTATION
├── 网络连通性
├── 防火墙
├── DDS discovery
└── multicast / discovery 配置

33. 常见命令速查表#

目的命令
查看节点ros2 node list
节点详情ros2 node info /node
查看 Topicros2 topic list
Topic 类型ros2 topic type /topic
Topic 详情ros2 topic info /topic
QoSros2 topic info /topic --verbose
看数据ros2 topic echo /topic
看频率ros2 topic hz /topic
看带宽ros2 topic bw /topic
发布 Topicros2 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 ...
Launchros2 launch ...
检查系统ros2 doctor
查看 TFtf2_echo
图形工具rqt
RVizrviz2
录包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_vel

35. 机器人视觉开发建议#

推荐把系统拆成:

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 的实用检查#

假设:

Terminal window
ros2 topic echo /camera/image_raw

非常卡。

不要直接认为 OpenCV 有问题。

先:

Terminal window
ros2 topic hz /camera/image_raw

再:

Terminal window
ros2 topic info /camera/image_raw --verbose

再检查:

分辨率
FPS
QoS
编码
CPU
内存
网络

例如:

1920 × 1080 × 30 FPS

数据量可能非常大。

因此机器人视觉中经常需要:

降低分辨率
降低 FPS
使用合适 QoS
ROI
压缩图像
减少复制
使用 intra-process communication

37. 常见错误#

ros2: command not found#

Terminal window
source /opt/ros/jazzy/setup.bash

找不到自己的包#

Terminal window
source ~/ros2_ws/install/setup.bash

然后:

Terminal window
ros2 pkg list | grep your_package

修改 Python 后没有生效#

开发时推荐:

Terminal window
colcon build --symlink-install

然后:

Terminal window
source install/setup.bash

Topic 存在但收不到数据#

检查:

Terminal window
ros2 topic info /topic --verbose

重点检查:

Publisher QoS
Subscriber QoS
Reliability
Durability

TF lookup 失败#

先确认:

Terminal window
ros2 run tf2_ros tf2_echo base_link camera_link

再检查:

frame 名称是否写错
TF 是否真的发布
时间戳是否合理
是否存在 TF 链

RViz 显示异常#

检查:

Fixed Frame
TF
Topic
QoS
消息类型
时间戳

38. 开发时最推荐的工作流#

Terminal window
## 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. 查看 Topic
ros2 topic list
## 8. 查看 Topic 频率
ros2 topic hz /xxx
## 9. 启动系统
ros2 launch my_package bringup.launch.py
## 10. 使用 RViz / rqt 调试
rviz2
rqt_graph

39. “看到问题先敲什么”决策树#

程序跑不起来
├── 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 --report

40. 必须记住的 10 个命令#

如果只能记十个:

Terminal window
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、驱动和第三方包行为应以对应发行版/包的官方文档为准。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或投喂支持!

投喂
ROS 2 速查手册
https://www.infvar.com/posts/ros2/
作者
Dignite
发布于
2026-09-11
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Dignite
技术,学习,生活,旅行。
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
站点统计
文章
158
分类
5
标签
282
总字数
338,254
运行时长
0
最后活动
0 天前

目录