第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项目时,就是按照这个流程走的。当时遇到一个坑——编译时忘了source,结果运行节点一直报错。后来我养成了习惯:每次打开终端,第一件事就是source。你也记住这个习惯,能省不少时间。
好了,这一章的内容就到这里。环境搭好了,代码也跑通了,接下来就可以开始真正的路径规划了。记住,基础打牢了,后面才能走得稳。