以下是一份ROS2(Humble Hawksbill版本,长期支持版)入门教程,涵盖安装、核心操作及基础示例,适合初学者快速上手:

一、ROS2安装(以Ubuntu 22.04为例)

1. 配置系统环境
# 允许apt通过HTTPS访问仓库
sudo apt update && sudo apt install -y curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# 添加ROS2仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
2. 安装ROS2核心包
sudo apt update
# 桌面版(含GUI工具、示例)
sudo apt install -y ros-humble-desktop
# 基础版(仅核心组件,无GUI)
# sudo apt install -y ros-humble-ros-base
3. 设置环境变量
# 每次打开终端自动加载ROS2环境(推荐)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 验证安装
ros2 --version  # 若输出版本信息,说明安装成功

二、ROS2核心概念快速回顾

  • 节点(Node):独立运行的进程,负责单一功能(如“激光雷达处理节点”“电机控制节点”)。
  • 话题(Topic):异步通信通道,采用“发布-订阅”模式(如传感器数据持续发布)。
  • 服务(Service):同步通信接口,采用“请求-响应”模式(如单次查询机器人位置)。
  • 动作(Action):用于长时间任务,支持进度反馈和取消(如“导航到目标点”)。
  • 参数(Parameter):节点的配置变量(如PID控制器的比例系数)。

三、第一个ROS2程序:话题通信

1. 创建工作空间与功能包
# 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

# 创建功能包(C++版)
ros2 pkg create --build-type ament_cmake my_package --dependencies rclcpp std_msgs

# 若用Python:
# ros2 pkg create --build-type ament_python my_package --dependencies rclpy std_msgs
2. 编写发布者节点(以C++为例)

~/ros2_ws/src/my_package/src/ 下创建 publisher_node.cpp

#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) {
    // 创建发布者,话题名为"topic",消息类型String,队列长度10
    publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
    // 定时器:每500ms触发一次回调
    timer_ = this->create_wall_timer(
      500ms, std::bind(&MinimalPublisher::timer_callback, this));
  }

private:
  void timer_callback() {
    auto msg = std_msgs::msg::String();
    msg.data = "Hello ROS2! Count: " + std::to_string(count_++);
    RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", msg.data.c_str());
    publisher_->publish(msg);
  }
  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;
}
3. 编写订阅者节点

在同目录下创建 subscriber_node.cpp

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class MinimalSubscriber : public rclcpp::Node {
public:
  MinimalSubscriber() : Node("minimal_subscriber") {
    // 创建订阅者,订阅"topic"话题,收到消息时触发回调
    subscription_ = this->create_subscription<std_msgs::msg::String>(
      "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, std::placeholders::_1));
  }

private:
  void topic_callback(const std_msgs::msg::String & msg) const {
    RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg.data.c_str());
  }
  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char * argv[]) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalSubscriber>());
  rclcpp::shutdown();
  return 0;
}
4. 配置编译规则

修改 ~/ros2_ws/src/my_package/CMakeLists.txt,添加以下内容(放在ament_package()前):

add_executable(talker src/publisher_node.cpp)
ament_target_dependencies(talker rclcpp std_msgs)
install(TARGETS
  talker
  DESTINATION lib/${PROJECT_NAME})

add_executable(listener src/subscriber_node.cpp)
ament_target_dependencies(listener rclcpp std_msgs)
install(TARGETS
  listener
  DESTINATION lib/${PROJECT_NAME})
5. 编译与运行
# 回到工作空间根目录
cd ~/ros2_ws
# 编译
colcon build
# 加载工作空间环境(每次新终端需执行)
source install/setup.bash

# 打开新终端,运行发布者
ros2 run my_package talker

# 再开新终端,运行订阅者
ros2 run my_package listener

此时订阅者会打印发布者发送的消息,实现话题通信。

四、常用ROS2命令行工具

命令 功能 示例
ros2 node list 查看所有节点 -
ros2 topic list 查看所有话题 ros2 topic echo /topic(打印话题消息)
ros2 service list 查看所有服务 ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 1, b: 2}"(调用服务)
ros2 param list 查看节点参数 ros2 param set /my_node max_speed 0.5(设置参数)
ros2 bag record /topic 录制话题数据 ros2 bag play <文件名>(回放数据)

五、进阶学习方向

  1. 服务与动作:实现同步通信和长时间任务(参考example_interfaces包中的srvaction类型)。
  2. 参数服务器:动态配置节点参数(使用rclcpp::Parameter)。
  3. 坐标变换(TF2):处理机器人各部件的坐标关系(如激光雷达与底盘的位置转换)。
  4. 导航栈(Nav2):基于ROS2的自主导航功能包。
  5. 仿真环境:结合Gazebo模拟机器人运行。

学习资源

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐