1. ROS2 Humble 完整学习指南(中文版)
作为一名机器人开发工程师,我经常需要快速搭建和测试各种机器人算法。ROS2作为目前最流行的机器人操作系统,已经成为我的日常开发工具。本文将详细介绍ROS2 Humble版本的完整学习路径,从环境搭建到核心概念,再到实际代码开发,帮助大家快速掌握ROS2开发技能。
1.1 为什么选择ROS2 Humble?
ROS2 Humble Hawksbill是2022年5月发布的LTS(长期支持)版本,支持到2027年5月。相比之前的版本,它有以下优势:
- 更稳定的DDS中间件(默认使用Fast DDS)
- 改进的实时性能
- 更好的Windows支持
- 更完善的工具链
提示:如果你是初学者,建议直接从Humble版本开始学习,避免使用已经停止维护的旧版本。
2. 环境搭建
2.1 系统准备
ROS2 Humble官方支持以下系统:
- Ubuntu 22.04 (Jammy)
- Windows 10/11
- macOS(社区支持)
对于大多数开发者,我推荐使用Ubuntu 22.04系统。Windows用户可以通过WSL2获得接近原生的体验。
2.1.1 Windows用户安装WSL2
bash复制# PowerShell管理员模式执行
wsl --install -d Ubuntu-22.04
安装完成后需要重启电脑。首次启动时会提示设置用户名和密码。
2.1.2 换国内源加速
bash复制sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
2.2 安装ROS2 Humble
bash复制# 1. 安装前置工具
sudo apt install curl gnupg lsb-release software-properties-common -y
# 2. 添加ROS2 GPG密钥
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
| sudo gpg --dearmor -o /usr/share/keyrings/ros-archive-keyring.gpg
# 3. 添加ROS2软件源
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
http://packages.ros.org/ros2/ubuntu \
$(. /etc/os-release && echo $UBUNTU_CODENAME) main" | \
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 4. 安装ROS2桌面版(包含常用工具)
sudo apt update
sudo apt install ros-humble-desktop -y
# 5. 安装构建工具
sudo apt install python3-colcon-common-extensions -y
# 6. 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
2.3 验证安装
bash复制ros2 --version # 显示版本号
ros2 pkg list | head -5 # 列出几个包
ros2 run demo_nodes_cpp talker # 运行发布者(不报错即可)
如果能看到版本号和运行talker节点没有报错,说明安装成功。
2.4 VSCode配置
- 安装VSCode:https://code.visualstudio.com/
- 安装插件:
- WSL(连接Ubuntu)
- C/C++(微软官方)
- CMake Tools
- ROS(微软官方)
- 在VSCode里按
Ctrl+Shift+P→ 输入WSL: Connect to WSL
3. ROS2核心概念
3.1 节点(Nodes)
节点是ROS2中的基本执行单元,每个节点负责一个特定功能。一个典型的机器人系统由多个节点组成,例如:
code复制相机节点 → 图像处理节点 → 目标检测节点
↓
导航节点 ← 决策节点 ← 目标跟踪节点
3.1.1 节点操作命令
bash复制# 启动turtlesim节点
ros2 run turtlesim turtlesim_node
# 查看当前运行的节点
ros2 node list
# 查看节点详细信息
ros2 node info /turtlesim
# 节点重命名
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
3.2 话题(Topics)
话题是节点间通信的主要方式,采用发布/订阅模式:
code复制发布者节点 → 话题 → 订阅者节点
特点:
- 可以有多个发布者和订阅者
- 数据单向流动
- 发布者不关心谁在接收
3.2.1 话题操作命令
bash复制# 查看所有话题
ros2 topic list
# 查看话题信息
ros2 topic info /turtle1/cmd_vel
# 实时查看话题数据
ros2 topic echo /turtle1/pose
# 手动发布消息
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}, angular: {z: 1.8}}"
# 查看发布频率
ros2 topic hz /turtle1/pose
3.3 服务(Services)
服务是请求/响应模式的通信方式,适用于需要即时响应的操作:
code复制客户端 → 请求 → 服务端 → 响应 → 客户端
3.3.1 服务操作命令
bash复制# 查看所有服务
ros2 service list
# 查看服务类型
ros2 service type /spawn
# 查看服务定义
ros2 interface show turtlesim/srv/Spawn
# 调用服务
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.0, y: 5.0, theta: 0.0, name: 'turtle2'}"
3.4 参数(Parameters)
参数是节点的配置项,可以在运行时动态修改:
bash复制# 查看参数列表
ros2 param list /turtlesim
# 获取参数值
ros2 param get /turtlesim background_r
# 设置参数值
ros2 param set /turtlesim background_r 255
# 导出参数到文件
ros2 param dump /turtlesim
# 从文件加载参数
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
3.5 动作(Actions)
动作适用于长时间运行的任务,提供目标、反馈和结果三种消息:
code复制客户端 → 目标 → 服务端
客户端 ← 反馈 ← 服务端
客户端 ← 结果 ← 服务端
3.5.1 动作操作命令
bash复制# 查看动作列表
ros2 action list
# 查看动作类型
ros2 action type /turtle1/rotate_absolute
# 查看动作定义
ros2 interface show turtlesim/action/RotateAbsolute
# 发送动作目标
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}" --feedback
4. C++节点开发
4.1 创建C++功能包
bash复制mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake cpp_pubsub --dependencies rclcpp std_msgs
4.2 编写发布者节点
创建src/publisher_member_function.cpp:
cpp复制#include <chrono>
#include <functional>
#include <memory>
#include <string>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std::chrono_literals;
class MinimalPublisher : public rclcpp::Node
{
public:
MinimalPublisher()
: Node("minimal_publisher"), count_(0)
{
publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
timer_ = this->create_wall_timer(
500ms, std::bind(&MinimalPublisher::timer_callback, this));
}
private:
void timer_callback()
{
auto message = std_msgs::msg::String();
message.data = "Hello ROS2! Count: " + std::to_string(count_++);
RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
publisher_->publish(message);
}
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
size_t count_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalPublisher>());
rclcpp::shutdown();
return 0;
}
4.3 修改CMakeLists.txt
cmake复制add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp std_msgs)
install(TARGETS
talker
DESTINATION lib/${PROJECT_NAME}
)
4.4 编译运行
bash复制cd ~/ros2_ws
colcon build --packages-select cpp_pubsub
source install/setup.bash
ros2 run cpp_pubsub talker
5. 自定义接口
5.1 创建自定义消息
- 创建功能包:
bash复制ros2 pkg create --build-type ament_cmake custom_interfaces
- 创建msg文件:
msg复制# custom_interfaces/msg/SensorData.msg
float64 temperature
float64 humidity
string sensor_name
builtin_interfaces/Time timestamp
- 修改package.xml:
xml复制<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
- 修改CMakeLists.txt:
cmake复制find_package(rosidl_default_generators REQUIRED)
find_package(builtin_interfaces REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/SensorData.msg"
DEPENDENCIES builtin_interfaces
)
- 编译验证:
bash复制colcon build --packages-select custom_interfaces
source install/setup.bash
ros2 interface show custom_interfaces/msg/SensorData
6. 实际开发建议
6.1 调试技巧
-
使用rqt工具:
rqt_graph:查看节点和话题连接rqt_console:查看日志rqt_plot:可视化数据
-
日志级别设置:
bash复制
ros2 run package node --ros-args --log-level debug
6.2 性能优化
- 使用高效的DDS实现(如Fast-RTPS或CycloneDDS)
- 合理设置QoS策略
- 避免在回调函数中进行耗时操作
6.3 常见问题解决
-
节点无法通信:
- 检查网络配置
- 确认DDS域ID一致
- 检查防火墙设置
-
消息丢失:
- 调整QoS策略
- 增加队列大小
- 检查发布频率
-
编译错误:
- 确认所有依赖已安装
- 检查CMakeLists.txt和package.xml配置
- 清理build目录重新编译
7. 学习资源推荐
- 官方文档:https://docs.ros.org/en/humble/
- ROS2教程:https://index.ros.org/doc/ros2/
- 社区论坛:https://answers.ros.org/
- GitHub示例:https://github.com/ros2/examples
通过本指南,你应该已经掌握了ROS2 Humble的基本使用和开发方法。在实际项目中,建议从小型demo开始,逐步构建复杂的机器人系统。记住,ROS2的学习是一个持续的过程,保持实践和探索的态度非常重要。