19.1 ROS2 概述
ROS2(Robot Operating System 2)是当前机器人与无人机上层应用开发中广泛使用的开源中间件平台。相比 ROS1,ROS2 在实时性、跨平台支持、通信机制和工程部署能力等方面都有明显提升。对于无人机系统而言,ROS2 主要承担高层任务规划、状态感知、数据记录、仿真验证以及与飞控之间的数据通信等功能。
本章主要完成以下内容:
-
搭建 ROS2 Jazzy 开发环境;
-
验证 ROS2 基本通信功能;
-
安装开发工具 colcon 与 rosdep;
-
创建 ROS2 工作空间;
-
创建 Python 功能包 drone_tools;
-
编写并运行 hello_drone 节点;
-
测试节点的话题发布与订阅功能。
19.2 ROS2 开发环境安装与验证
19.2.1 使用小鱼 ROS 一键安装
为提高安装效率,本实验采用小鱼 ROS 一键安装方式完成 ROS2 环境部署。通过下载安装脚本并运行,可自动完成 ROS2 软件安装及常用环境配置。
wget https://fishros.com/install -O fishros && . fishros

图19-1 小鱼 ROS 一键安装脚本页面
19.2.2 ROS2 环境检查
ROS2 安装完成后,首先需要检查系统中 ROS2 是否可正常调用。通过加载 Jazzy 环境变量,并运行 ros2 --help 命令,可以查看 ROS2 命令行工具是否可用。
source /opt/ros/jazzy/setup.bash
ros2 --help
当终端能够正确显示 topic、node、service、run、launch 等 ROS2 常用命令时,说明 ROS2 基础环境安装成功。

图19-2 ROS2 命令帮助界面
19.2.3 使用 talker 与 listener 验证通信
为了进一步验证 ROS2 的发布/订阅通信功能,本实验分别运行官方示例节点 talker 和 listener。
终端1:运行发布者 talker
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker
该节点会持续向外发布字符串消息“Hello World”。

图19-3 talker 节点运行结果
终端2:运行订阅者 listener
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_py listener
该节点会接收 talker 节点发送的消息,并在终端中显示“I heard: [Hello World: x]”。

图19-4 listener 节点运行结果
如果 talker 能持续发布消息,listener 能同步接收消息,则说明 ROS2 的基本通信机制工作正常。
19.2.4 开发工具检查
ROS2 开发过程中常用的两个工具分别为 colcon 和 rosdep。colcon 用于编译 ROS2 工作空间,rosdep 用于自动安装功能包依赖。
colcon --help
rosdep --version
若终端能够正确显示 colcon 的帮助信息,并输出 rosdep 版本号,则说明相关开发工具环境正常。

图19-5 colcon 与 rosdep 工具检查结果
19.3 ROS2 工作空间创建与功能包配置
19.3.1 创建 ROS2 工作空间
在 ROS2 中,用户自定义程序通常放置在工作空间中进行统一管理。实验中创建的工作空间名称为 ros2_ws。
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
完成后,工作空间中会自动生成 build、install、log 和 src 等目录,这说明工作空间已创建成功。

图19-6 工作空间创建与初始编译结果
19.3.2 创建 Python 功能包 drone_tools
进入工作空间源码目录后,创建 Python 类型的 ROS2 功能包 drone_tools:
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python drone_tools --dependencies rclpy std_msgs geometry_msgs
创建完成后,可通过 tree 命令查看其目录结构:
tree ~/ros2_ws/src/drone_tools
功能包中包含 package.xml、setup.py、setup.cfg、resource、drone_tools 和 test 等标准目录与文件,说明 Python 功能包创建成功。

图19-7 drone_tools 功能包目录结构
19.3.3 编写 hello_drone.py 节点程序
在 drone_tools/drone_tools 目录下创建 hello_drone.py 文件,用于编写第一个 ROS2 无人机示例节点。
该节点主要实现以下功能:
- 发布无人机状态话题 /drone/status;
- 发布模拟位姿话题 /drone/pose;
- 订阅控制指令话题 /drone/command;
- 根据接收到的文字指令输出相应提示信息。

图19-8 hello_drone.py 节点代码编写界面
程序编写完成后,需要赋予执行权限:
chmod +x hello_drone.py
19.3.4 配置 setup.py 入口文件
为了能够通过 ros2 run 直接运行 Python 节点,需要在功能包的 setup.py 中注册入口函数。在 entry_points 中加入:
'hello_drone = drone_tools.hello_drone:main',
该配置表示在终端执行 ros2 run drone_tools hello_drone 时,将自动调用 hello_drone.py 中的 main() 函数。

图19-9 setup.py 入口配置界面
19.3.5 安装依赖并编译功能包
在工作空间根目录中执行以下命令安装依赖:
cd ~/ros2_ws
rosdep install -i --from-paths src --rosdistro jazzy -y
当终端输出“All required rosdeps installed successfully”时,说明功能包依赖安装成功。

图19-10 rosdep 依赖安装成功界面
随后对功能包进行编译:
colcon build --packages-select drone_tools --symlink-install
编译成功后,终端会显示 Starting >>> drone_tools、Finished <<< drone_tools 和 Summary: 1 package finished。

图19-11 drone_tools 功能包编译成功界面
19.3.6 加载工作空间环境
功能包编译完成后,需要重新加载 ROS2 环境以及当前工作空间环境:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
随后使用以下命令检查功能包是否已被 ROS2 正确识别:
ros2 pkg list | grep drone_tools
若终端输出 drone_tools,则说明该功能包已成功注册到当前 ROS2 环境中。

图19-12 工作空间环境加载与功能包识别结果
19.4 Hello Drone 节点运行与通信测试
19.4.1 运行 hello_drone 节点
在终端中输入:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 run drone_tools hello_drone
运行后,节点会周期性输出 Hello Drone 节点已启动、飞控型号 ZP_H743(模拟状态)以及发布状态等信息,说明节点已开始正常工作,并持续发布无人机状态信息。

图19-13 hello_drone 节点运行结果
19.4.2 查看 /drone/pose 话题数据
在另一个终端中输入:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 topic echo /drone/pose
终端中会持续输出位姿消息,包括坐标位置 x、y、z 和姿态四元数 x、y、z、w。当前节点持续发布的位姿信息为固定模拟值:位置为 (0.0, 0.0, 0.0),姿态为 (0.0, 0.0, 0.0, 1.0),说明 /drone/pose 话题发布功能正常。

图19-14 /drone/pose 话题查看结果
19.4.3 发送 /drone/command 指令测试
为了验证节点的订阅功能,在终端中分别向 /drone/command 话题发布三条测试命令:
ros2 topic pub --once /drone/command std_msgs/msg/String "{data: 'ARM'}"
ros2 topic pub --once /drone/command std_msgs/msg/String "{data: 'TAKEOFF'}"
ros2 topic pub --once /drone/command std_msgs/msg/String "{data: 'LAND'}"
实验结果表明,发送 ARM、TAKEOFF 和 LAND 后,hello_drone 节点能够分别接收指令,并输出模拟执行解锁、起飞和降落的提示信息,说明节点已经能够正常订阅并处理控制指令。

图19-15 /drone/command 指令发布与接收测试结果
19.4.4 查看节点与话题信息
为进一步验证节点的通信关系,可使用以下命令查看节点和话题信息:
ros2 node info /hello_drone_node
ros2 topic list | grep drone
ros2 topic type /drone/status
实验结果显示,节点 /hello_drone_node 已正常注册;话题列表中成功出现 /drone/command、/drone/pose 和 /drone/status;/drone/status 的消息类型为 std_msgs/msg/String。由此可见,该节点的发布、订阅以及 ROS2 注册信息均正常。

图19-16 节点与话题信息查看结果
19.5 本章小结
本章完成了 ROS2 Jazzy 基础开发环境的搭建与验证,并通过 hello_drone 节点实现了 ROS2 基本通信流程的实践。主要完成内容如下:
-
采用小鱼 ROS 一键安装方式完成 ROS2 Jazzy 环境部署;
-
使用 ros2 --help 验证 ROS2 命令行工具可正常使用;
-
使用 talker 与 listener 示例验证 ROS2 发布/订阅通信功能;
-
检查 colcon 与 rosdep 工具工作正常;
-
成功创建 ROS2 工作空间 ros2_ws;
-
成功创建 Python 功能包 drone_tools;
-
编写并运行 hello_drone 节点;
-
实现 /drone/status 和 /drone/pose 的发布;
-
实现 /drone/command 的订阅与处理;
-
完成节点信息与话题类型的检查验证。
通过本章实验,已经掌握了 ROS2 的基础开发流程,包括环境搭建、工作空间创建、功能包管理、节点编写以及话题通信测试等内容,为后续 MAVROS2、PX4 桥接和无人机上层控制节点开发打下基础。

415

被折叠的 条评论
为什么被折叠?



