ROS2基础教程
·
以下是一份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 <文件名>(回放数据) |
五、进阶学习方向
- 服务与动作:实现同步通信和长时间任务(参考
example_interfaces包中的srv和action类型)。 - 参数服务器:动态配置节点参数(使用
rclcpp::Parameter)。 - 坐标变换(TF2):处理机器人各部件的坐标关系(如激光雷达与底盘的位置转换)。
- 导航栈(Nav2):基于ROS2的自主导航功能包。
- 仿真环境:结合Gazebo模拟机器人运行。
学习资源
- 官方文档:docs.ros.org/en/humble
- 示例代码:
ros2 pkg list查看官方示例包(如demo_nodes_cpp) - 社区论坛:answers.ros.org
更多推荐



所有评论(0)