ROS 2 Jazzy 规范开发与学习指南
本文介绍了ROS2 Jazzy(2024)机器人开发的最佳实践。主要内容包括:选择ROS2 Jazzy的优势(支持至2029年、C++20特性等)、环境配置步骤、标准开发流程(创建功能包、编写节点、编译运行)、常见错误解决方案以及最佳实践(目录结构、代码规范等)。文章还提供了学习路线推荐和资源汇总,帮助开发者从基础到实战循序渐进掌握ROS2开发。特别强调规范化的开发流程和环境配置的重要性,为开发者
从零开始,掌握 ROS 2 现代机器人开发的最佳实践
📋 目录
为什么选择 ROS 2 Jazzy
📅 版本对比
|
特性 |
Humble (2022) |
Jazzy (2024) |
|
支持周期 |
至 2027 年 |
至 2029 年 |
|
Ubuntu 版本 |
22.04 |
24.04 |
|
C++ 标准 |
C++17 |
C++20 |
|
Python 版本 |
3.10 |
3.12 |
|
Gazebo 版本 |
Classic/Ignition |
Harmonic |
✅ 推荐理由
- 更长的支持周期:新项目可维护至 2029 年
- 更新的技术栈:C++20 新特性、更好的性能
- 更完善的工具链:RViz2、CLI 工具持续改进
- 社区趋势:新项目多采用 Jazzy
环境准备
1. 系统要求
# 检查 Ubuntu 版本(Jazzy 需要 24.04)
lsb_release -a
# WSL 用户检查
uname -a
2. 安装 ROS 2 Jazzy
# 添加 ROS 2 软件源
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
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
# 安装桌面版(推荐)
sudo apt update
sudo apt install ros-jazzy-desktop
# 安装开发工具
sudo apt install python3-colcon-common-extensions python3-rosdep2
3. 环境变量配置
# 临时加载(每次新终端)
source /opt/ros/jazzy/setup.bash
# 永久配置(添加到 ~/.bashrc)
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
source ~/.bashrc
# 验证安装
ros2 --version
标准开发流程
📁 步骤 1:创建工作空间
# 创建标准目录结构
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
目录结构说明:
ros2_ws/
├── src/ # 源代码(所有功能包放这里)
├── build/ # 编译中间文件(自动生成)
├── install/ # 安装文件(自动生成)
└── log/ # 编译日志(自动生成)
📦 步骤 2:创建功能包
cd ~/ros2_ws/src
# 创建 C++ 功能包
ros2 pkg create --build-type ament_cmake my_package --dependencies rclcpp
# 创建 Python 功能包
ros2 pkg create --build-type ament_python my_python_package --dependencies rclpy
📝 步骤 3:编写节点代码
C++ 节点示例 (src/my_node.cpp):
#include "rclcpp/rclcpp.hpp"
class MyNode : public rclcpp::Node
{
public:
MyNode() : Node("my_node")
{
RCLCPP_INFO(this->get_logger(), "Node started!");
// 创建定时器
timer_ = this->create_wall_timer(
std::chrono::seconds(1),
std::bind(&MyNode::timer_callback, this)
);
}
private:
void timer_callback()
{
RCLCPP_INFO(this->get_logger(), "Timer callback! Count: %d", count_++);
}
rclcpp::TimerBase::SharedPtr timer_;
int count_ = 0;
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MyNode>());
rclcpp::shutdown();
return 0;
}
⚙️ 步骤 4:配置 CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(my_package)
# C++20 标准(Jazzy 要求)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic -std=c++20)
endif()
# 查找依赖
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
# 添加可执行文件
add_executable(my_node src/my_node.cpp)
# 链接依赖
ament_target_dependencies(my_node rclcpp)
# 安装规则
install(TARGETS
my_node
DESTINATION lib/${PROJECT_NAME}
)
ament_package()
📋 步骤 5:配置 package.xml
<?xml version="1.0"?>
<package format="3">
<name>my_package</name>
<version>0.0.1</version>
<description>My ROS 2 package</description>
<maintainer email="your@email.com">Your Name</maintainer>
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
🔨 步骤 6:编译与运行
# 返回工作空间根目录
cd ~/ros2_ws
# 编译
colcon build --symlink-install
# 加载环境
source install/setup.bash
# 运行节点
ros2 run my_package my_node
常见错误及解决方案
❌ 错误 1:No executable found
原因: 可执行文件未正确安装或环境未加载
解决:
# 检查 install 目录
ls install/my_package/lib/my_package/
# 重新编译
colcon build --packages-select my_package
# 重新加载环境
source install/setup.bash
❌ 错误 2:Cannot find source file
原因: 源文件路径与 CMakeLists.txt 配置不匹配
解决:
正确结构:
my_package/
├── CMakeLists.txt
├── package.xml
└── src/
└── my_node.cpp ← 文件必须在这里!
❌ 错误 3:Package not found
原因: 环境变量未设置
解决:
# 检查环境变量
echo $AMENT_PREFIX_PATH
# 确保包含工作空间路径
# 应该看到:/opt/ros/jazzy:/home/yourname/ros2_ws/install
❌ 错误 4:头文件找不到
原因: 依赖未声明或未安装
解决:
# 在 package.xml 中添加依赖
<depend>消息包名称</depend>
# 安装缺失的包
sudo apt install ros-jazzy-包名称
# 在 CMakeLists.txt 中查找
find_package(包名称 REQUIRED)
ament_target_dependencies(目标 包名称)
最佳实践
📂 1. 目录结构规范
my_package/
├── CMakeLists.txt
├── package.xml
├── src/ # C++ 源文件
│ └── *.cpp
├── include/ # 头文件(如果有)
│ └── my_package/
│ └── *.hpp
├── launch/ # Launch 文件
│ └── *.launch.py
├── config/ # 配置文件
│ └── *.yaml
└── test/ # 测试文件
└── *.cpp
🔧 2. 版本控制
# .gitignore 推荐内容
cat > .gitignore << EOF
build/
install/
log/
*.pyc
__pycache__/
.DS_Store
EOF
📝 3. 代码规范
// 类名:大驼峰
class MyNode : public rclcpp::Node {}
// 函数名:小写 + 下划线
void timer_callback() {}
// 变量名:小写 + 下划线
int message_count = 0;
// 常量:全大写 + 下划线
const int MAX_COUNT = 100;
🧪 4. 测试规范
# 添加测试依赖(package.xml)
<test_depend>ament_cmake_gtest</test_depend>
# CMakeLists.txt 中添加测试
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()
endif()
📚 5. 文档规范
# 在 README.md 中说明
## 功能说明
## 依赖项
## 使用方法
## 示例
## 许可证
学习路线推荐
📖 第一阶段:基础(1-2 周)
|
主题 |
内容 |
实践 |
|
节点 |
创建、运行、生命周期 |
Hello World 节点 |
|
话题 |
发布/订阅机制 |
聊天机器人 |
|
服务 |
请求/响应通信 |
计算器服务 |
|
参数 |
运行时配置 |
可配置节点 |
📖 第二阶段:进阶(2-4 周)
|
主题 |
内容 |
实践 |
|
自定义消息 |
消息定义与生成 |
传感器数据包 |
|
Action |
长时间任务 |
导航任务 |
|
Launch |
多节点启动 |
系统启动文件 |
|
TF |
坐标变换 |
机器人定位 |
📖 第三阶段:实战(1-2 月)
|
主题 |
内容 |
实践 |
|
Gazebo |
仿真环境 |
仿真机器人 |
|
RViz |
可视化 |
传感器可视化 |
|
Navigation2 |
导航栈 |
自主导航 |
|
MoveIt2 |
机械臂控制 |
抓取任务 |
资源汇总
📚 官方文档
📖 中文资源
🛠️ 工具推荐
|
工具 |
用途 |
安装命令 |
|
VS Code |
代码编辑 |
官网下载 |
|
ROS Extension |
ROS 支持 |
市场安装 |
|
Foxglove Studio |
数据可视化 |
官网下载 |
|
Gazebo Harmonic |
仿真 |
|
💬 社区支持
🎯 总结
|
要点 |
说明 |
|
✅ 使用标准流程 |
colcon + ament_cmake |
|
✅ 规范目录结构 |
src/ 放源码,include/ 放头文件 |
|
✅ 正确配置依赖 |
package.xml + CMakeLists.txt |
|
✅ 及时加载环境 |
source install/setup.bash |
|
✅ 持续学习实践 |
从简单节点到复杂系统 |
💡 提示: 遇到问题时,先查看 log/ 目录中的编译日志,大部分问题都能从中找到答案。
🚀 开始你的 ROS 2 之旅吧!
本文基于 ROS 2 Jazzy (2024) 编写,如有更新请参考官方文档。
欢迎转载,请注明出处。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)