ROS 2 Jazzy 规范开发与学习指南
从零开始,掌握 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)