第1章:ROS2基础与环境搭建

各位同学,今天咱们来聊聊ROS2的环境搭建。说实话,我刚开始接触ROS2时也踩了不少坑。记得第一次装Humble版本,折腾了一整天,最后发现是源的问题。嗯,今天我就把这些经验分享给你,让你少走弯路。

1.1 为什么选择ROS2 Humble?

ROS2 Humble是2022年发布的长期支持版本,支持到2027年。我个人习惯用LTS版本,稳定、省心。你想想看,做机器人项目最怕什么?最怕写到一半,系统不支持了。Humble基于Ubuntu 22.04,生态成熟,社区活跃,遇到问题基本都能搜到答案。

核心优势:

  • 长期支持(LTS),5年维护周期
  • 与Ubuntu 22.04完美兼容
  • 支持多机器人协同、实时通信
  • 安全性、可靠性大幅提升

1.2 安装ROS2 Humble

安装过程其实不复杂,但有几个关键点要注意。我曾经因为没设置好locale,导致编译一直报错。咱们一步步来。

1.2.1 设置语言环境

sudo apt update
sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

1.2.2 添加ROS2源

sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update
sudo apt install curl
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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

1.2.3 安装ROS2 Humble

sudo apt update
sudo apt install ros-humble-desktop

注意:安装过程可能需要20-30分钟,取决于你的网络速度。建议使用国内镜像源,速度会快很多。我曾经用默认源下载,等了一个多小时...后来换了清华源,十分钟搞定。

1.2.4 配置环境变量

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证安装是否成功:

ros2 --version

如果看到版本号,恭喜你,安装成功了!

1.3 创建工作空间

工作空间是ROS2项目的组织方式。说白了,就是把你写的代码、依赖的包都放在一个文件夹里,方便管理。我习惯用ros2_ws这个名字,简单明了。

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

小技巧:每次编译后,记得source一下:source install/setup.bash。我刚开始经常忘记,结果运行节点时一直报找不到包。后来我把它写进了.bashrc里,一劳永逸。

1.4 发布-订阅模型实战

发布-订阅模型是ROS2的核心通信机制。一个节点发布消息,另一个节点订阅消息。就像电台和收音机的关系——电台只管播,收音机只管收,互不干扰。

1.4.1 创建功能包

cd ~/ros2_ws/src
ros2 pkg create my_package --build-type ament_python --dependencies rclpy std_msgs

1.4.2 编写发布者节点

在my_package/my_package/目录下创建publisher.py:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class MyPublisher(Node):
    def __init__(self):
        super().__init__('my_publisher')
        self.publisher_ = self.create_publisher(String, 'topic', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)
        self.i = 0

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello, ROS2! %d' % self.i
        self.publisher_.publish(msg)
        self.get_logger().info('Publishing: "%s"' % msg.data)
        self.i += 1

def main(args=None):
    rclpy.init(args=args)
    my_publisher = MyPublisher()
    rclpy.spin(my_publisher)
    my_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

1.4.3 编写订阅者节点

在同一个目录下创建subscriber.py:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class MySubscriber(Node):
    def __init__(self):
        super().__init__('my_subscriber')
        self.subscription = self.create_subscription(
            String,
            'topic',
            self.listener_callback,
            10)
        self.subscription

    def listener_callback(self, msg):
        self.get_logger().info('I heard: "%s"' % msg.data)

def main(args=None):
    rclpy.init(args=args)
    my_subscriber = MySubscriber()
    rclpy.spin(my_subscriber)
    my_subscriber.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

1.4.4 配置setup.py

编辑my_package/setup.py,添加入口点:

entry_points={
    'console_scripts': [
        'publisher = my_package.publisher:main',
        'subscriber = my_package.subscriber:main',
    ],
},

1.4.5 编译并运行

cd ~/ros2_ws
colcon build
source install/setup.bash
ros2 run my_package publisher

再开一个终端:

source ~/ros2_ws/install/setup.bash
ros2 run my_package subscriber

你会看到发布者每秒发送一条消息,订阅者实时接收。这就是发布-订阅模型的基本工作方式。

核心知识点总结:

  • 发布者通过create_publisher创建发布器
  • 订阅者通过create_subscription创建订阅器
  • 消息类型使用std_msgs.msg.String
  • 节点通过rclpy.spin()保持运行

1.5 本章知识体系

下面这张图展示了本章的核心逻辑,我画了个流程图,帮你理清思路:

ROS2基础与环境搭建 - 知识体系 环境搭建 工作空间创建 发布-订阅模型 安装ROS2 Humble 配置环境变量 验证安装 创建src目录 colcon build编译 source环境 创建功能包 编写发布者 编写订阅者 编译运行 目标:掌握ROS2开发全流程,为路径规划打下基础

这张图把本章内容串起来了。从环境搭建开始,到工作空间创建,再到发布-订阅模型实战,每一步都是环环相扣的。你想想看,没有环境,代码跑不了;没有工作空间,代码没地方放;没有发布-订阅模型,节点之间没法通信。所以,每一步都很重要。

个人经验:我在做第一个ROS2项目时,就是按照这个流程走的。当时遇到一个坑——编译时忘了source,结果运行节点一直报错。后来我养成了习惯:每次打开终端,第一件事就是source。你也记住这个习惯,能省不少时间。

好了,这一章的内容就到这里。环境搭好了,代码也跑通了,接下来就可以开始真正的路径规划了。记住,基础打牢了,后面才能走得稳。

可可精品资料库