
19.1 ROS2 概述ROS2Robot Operating System 2是当前机器人与无人机上层应用开发中广泛使用的开源中间件平台。相比 ROS1ROS2 在实时性、跨平台支持、通信机制和工程部署能力等方面都有明显提升。对于无人机系统而言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.bashros2 --help当终端能够正确显示 topic、node、service、run、launch 等 ROS2 常用命令时说明 ROS2 基础环境安装成功。图19-2 ROS2 命令帮助界面19.2.3 使用 talker 与 listener 验证通信为了进一步验证 ROS2 的发布/订阅通信功能本实验分别运行官方示例节点 talker 和 listener。终端1运行发布者 talkersource /opt/ros/jazzy/setup.bashros2 run demo_nodes_cpp talker该节点会持续向外发布字符串消息“Hello World”。图19-3 talker 节点运行结果终端2运行订阅者 listenersource /opt/ros/jazzy/setup.bashros2 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 --helprosdep --version若终端能够正确显示 colcon 的帮助信息并输出 rosdep 版本号则说明相关开发工具环境正常。图19-5 colcon 与 rosdep 工具检查结果19.3 ROS2 工作空间创建与功能包配置19.3.1 创建 ROS2 工作空间在 ROS2 中用户自定义程序通常放置在工作空间中进行统一管理。实验中创建的工作空间名称为 ros2_ws。mkdir -p ~/ros2_ws/srccd ~/ros2_wscolcon build完成后工作空间中会自动生成 build、install、log 和 src 等目录这说明工作空间已创建成功。图19-6 工作空间创建与初始编译结果19.3.2 创建 Python 功能包 drone_tools进入工作空间源码目录后创建 Python 类型的 ROS2 功能包 drone_toolscd ~/ros2_ws/srcros2 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.py19.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_wsrosdep 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.bashsource ~/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.bashsource ~/ros2_ws/install/setup.bashros2 run drone_tools hello_drone运行后节点会周期性输出 Hello Drone 节点已启动、飞控型号 ZP_H743模拟状态以及发布状态等信息说明节点已开始正常工作并持续发布无人机状态信息。图19-13 hello_drone 节点运行结果19.4.2 查看 /drone/pose 话题数据在另一个终端中输入source /opt/ros/jazzy/setup.bashsource ~/ros2_ws/install/setup.bashros2 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_noderos2 topic list | grep droneros2 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 桥接和无人机上层控制节点开发打下基础。