第一章:ROS基础与环境搭建

大家好,我是你们这门课的主讲工程师。说实话,做了这么多年机器人,我见过太多人一上来就急着写代码,结果连ROS的基本概念都没搞明白,最后debug到怀疑人生。这一章,咱们就把地基打牢。

1.1 ROS核心概念

ROS的核心,说白了就是一套「通信机制」。它让机器人的各个零件——比如摄像头、激光雷达、电机控制器——能互相说话。我刚开始接触ROS时,最困惑的就是节点、话题、服务、参数这几个东西到底怎么用。咱们一个一个说清楚。

1.1.1 节点(Node)

节点就是ROS里的最小执行单元。你可以把它理解成一个独立运行的小程序。比如,一个节点负责读取摄像头数据,另一个节点负责处理图像,第三个节点控制电机。

重要:每个节点都是独立的进程。一个节点挂了,其他节点还能继续跑。这就是ROS的容错设计。

我在项目中遇到过这样的情况:有一次调试机器人,激光雷达节点突然崩溃,但导航节点还在傻等数据。嗯,从那以后我养成了一个习惯——每个节点都要加心跳检测。

1.1.2 话题(Topic)

话题是节点之间通信的「总线」。一个节点发布数据到话题上,其他节点订阅这个话题就能收到数据。你想想看,这就像电台广播——主播只管说话,听众自己决定要不要听。

举个例子:

# 发布者节点
ros::Publisher pub = nh.advertise<sensor_msgs::Image>("/camera/image", 10);

# 订阅者节点
ros::Subscriber sub = nh.subscribe("/camera/image", 10, callback);

我个人习惯用rostopic list先看看当前有哪些话题在跑,再决定订阅哪个。这比瞎猜快多了。

1.1.3 服务(Service)

话题是单向的、持续的通信。但有些场景需要「一问一答」——比如你让机器人拍张照片,它拍完得告诉你结果。这时候就用服务。

服务的模式很简单:客户端发请求,服务端回响应。我建议你记住这个区别:话题用于高频数据流(比如传感器数据),服务用于低频指令(比如开关控制)。

小技巧:如果你不确定用话题还是服务,问自己一个问题:「这个数据需要持续更新吗?」需要就用话题,不需要就用服务。

1.1.4 参数(Parameter)

参数就是ROS里的全局变量。比如机器人的轮子半径、摄像头焦距、PID系数这些配置项,都可以放在参数服务器里。好处是改参数不用重新编译代码。

我曾经踩过一个坑:把参数写死在代码里,结果换了个机器人就得改源码重新编译。后来我学乖了,所有可调参数都放到launch文件里,用rosparam加载。

<launch>
    <param name="wheel_radius" value="0.1" />
    <param name="max_linear_speed" value="0.5" />
</launch>

1.2 ROS文件系统

ROS的文件系统结构,说白了就是一套「放文件的规矩」。你想想看,如果每个人乱放代码,团队协作就是灾难。ROS用功能包(Package)来组织代码。

一个标准功能包的结构长这样:

my_package/
├── CMakeLists.txt    # 编译规则
├── package.xml       # 包信息(依赖、版本等)
├── src/              # 源代码
├── include/          # 头文件
├── launch/           # 启动文件
├── config/           # 配置文件
└── msg/              # 自定义消息类型

我个人习惯把launch文件和config文件分开。launch只管启动,config只管参数。这样别人看你的包,一眼就知道哪里改什么。

注意:不要把所有代码都塞到src目录下。ROS的编译系统会递归查找,但文件多了容易乱。我建议按功能分目录,比如src/drivers/src/algorithms/

1.3 创建工作空间与功能包

工作空间(Workspace)就是你所有ROS项目的根目录。我习惯叫它catkin_ws。创建步骤很简单:

# 1. 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

# 2. 编译
cd ~/catkin_ws
catkin_make

# 3. 设置环境变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

创建功能包就更简单了:

cd ~/catkin_ws/src
catkin_create_pkg my_package roscpp rospy std_msgs

这里roscpprospy是C++和Python的客户端库,std_msgs是标准消息类型。我建议新手先加这三个依赖,后面需要什么再加。

经验之谈:我刚开始时总忘记source setup.bash,结果编译完找不到包。后来我在.bashrc里加了一行自动source,再也没出过这个问题。

1.4 ROS命令行工具

命令行工具是ROS的「瑞士军刀」。调试机器人时,我80%的时间都在用这几个命令。记住它们,能省你大量时间。

命令 作用 常用场景
roscore 启动ROS主节点 所有ROS程序的第一步
rosrun 运行单个节点 测试某个功能包
roslaunch 启动多个节点 启动整个机器人系统
rostopic 查看话题信息 调试传感器数据
rosservice 调用服务 触发某个动作
rosparam 管理参数 修改配置
rqt_graph 可视化节点关系 理解系统架构

举个例子,调试激光雷达数据时,我通常会:

# 先看看有哪些话题
rostopic list

# 再查看激光数据
rostopic echo /scan

# 最后可视化节点关系
rqt_graph

我曾经遇到一个bug:机器人导航时总是撞墙。用rqt_graph一看,发现激光雷达的话题根本没连上导航节点。原来是话题名字拼错了。这种问题,用命令行工具几分钟就能定位。

核心总结:ROS的核心就是节点通过话题、服务、参数进行通信。文件系统用功能包组织代码。命令行工具是调试利器。这一章的内容,你以后每天都会用到。

好了,第一章就到这里。下一章咱们开始搭建真实的视觉SLAM系统,到时候会用到这些基础知识。记住,基础不牢,地动山摇。别急着跑,先把这些概念吃透。

课后练习:自己动手创建一个工作空间,写一个发布者节点和一个订阅者节点,让它们通过话题通信。这是ROS的「Hello World」,做完了你就算入门了。

公众号:蓝海资料掘金营,微信deep3321