从零开始,掌握 ROS 2 现代机器人开发的最佳实践


📋 目录

  1. 为什么选择 ROS 2 Jazzy
  2. 环境准备
  3. 标准开发流程
  4. 常见错误及解决方案
  5. 最佳实践
  6. 学习路线推荐
  7. 资源汇总

为什么选择 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

仿真

sudo apt install ros-jazzy-gazebo-ros-pkgs

💬 社区支持


🎯 总结

要点

说明

✅ 使用标准流程

colcon + ament_cmake

✅ 规范目录结构

src/ 放源码,include/ 放头文件

✅ 正确配置依赖

package.xml + CMakeLists.txt

✅ 及时加载环境

source install/setup.bash

✅ 持续学习实践

从简单节点到复杂系统


💡 提示: 遇到问题时,先查看 log/ 目录中的编译日志,大部分问题都能从中找到答案。

🚀 开始你的 ROS 2 之旅吧!


本文基于 ROS 2 Jazzy (2024) 编写,如有更新请参考官方文档。

欢迎转载,请注明出处。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐