工作空间和功能包构建

在前面的章节中,我们已经安装好了openEuler系统和ROS2 Humble完整版。

本小节将介绍如何创建自己的工作空间构建代码,并简单测试节点间的Topic和Service通信。

创建工作空间

ROS 工作空间(workspace)是一个具有特定结构的目录,用来存放管理机器人代码开发过程中的所有资料。工作空间下通常会有一个 src 子目录,存放着 ROS 软件包的源代码,可以是我们下载的开源代码,也可以是我们自研的代码。

打开终端,输入以下命令创建一个名为“ros2_ws”的工作空间以及其下的src子目录:

bash
mkdir -p ~/ros2_ws/src

此时src目录下为空,下面我们下载ros_arm_tutorials仓库的代码到src目录下,作为后续测试节点通信的示例源代码:

bash
cd ~/ros2_ws/src
git clone -b ros2-humble https://gitee.com/xiao_yun_wang/ros_arm_tutorials.git

下载完成后,我们可以安装tree工具用来查看工作空间下的目录结构:

bash
 dnf install tree
 tree -L 3

1

ros_arm_tutorials 的 ros2-humble 分支代码共包含以下五个功能包:

功能包(软件包)内容
base_demo自定义消息和服务、topic发布/订阅节点、service服务端/客户端节点、参数操作示例节点
advance_demoaction 的定义和服务端/客户端节点、ROS 常用工具、动态参数配置节点、TF2示例节点、RVIZ Marker发布和显示等
myrobot_description三自由度机械臂和移动小车的URDF模型
xarm_descriptionXBot-Arm 机械臂 URDF 模型文件包
xarm_moveit_config使用配置助手生成的 XBot-Arm 机械臂 MoveIt! 配置和启动功能包

更多说明可参考原仓库

构建功能包

ROS2 使用 colcon 构建工具进行源代码的构建,更多信息可参考:设计文档

默认情况下,colcon 会创建以下目录作为 src 目录的同级目录:

  • build:存放中间文件。

  • install:每个软件包的安装目录。默认情况下,每个软件包都将安装到一个单独的子目录中。

  • log:日志目录包含有关每次调用 colcon 的各种日志信息。

由于 ament_cmake 等联编类型不支持开发空间的概念,需要安装软件包,因此 colcon 支持选项 --symlink-install。这允许通过更改源代码空间中的文件(如 Python 文件或其他非编译资源)来更改已安装的文件,从而加快迭代速度。

安装 colcon:

bash
pip3 install -U pytest colcon-common-extensions

在工作空间的根目录下,使用 colcon 构建功能包。

bash
cd ~/ros2_ws/
colcon build --symlink-install

构建过程中因使用的 CMake 版本不一致等原因可能会出现一些 warning,可先忽略。

1

构建完成后会提示已经完成5个软件包的构建:

1

设置环境

执行source ~/ros2_ws/install/setup.bash设置环境,或者运行以下命令添加到.bashrc中。

bash
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

测试Topic通信节点

ROS2基于分布式的设计,将复杂系统分为许多用于实现不同功能的模块化节点(进程)。不同节点之间通过消息传递数据。Topic话题通信是一种基于发布/订阅的异步通信机制,base_demo功能包中提供了Topic通信的示例代码节点。每个节点都提供了Python与Cpp两种编程方式的实现。

打开终端,输入以下命令启动话题发布端的Python节点或者CPP节点:

bash
ros2 run base_demo topic_pub.py

or

bash
ros2 run base_demo topic_pub

新开终端,输入ros2 topic list可以查看当前的话题列表,其中/robot_info是节点发布的话题。

输入ros2 topic echo /robot_info可以看到话题接收到的消息:

1

新开终端,输入以下命令启动话题订阅端的Python节点:

bash
ros2 run base_demo topic_sub.py

或者启动CPP节点:

bash
ros2 run base_demo topic_sub

节点启动后会接收话题消息并将消息数据处理后发布到终端显示:

1

测试Service通信节点

Service通信是一种基于请求/响应模式的同步通信方式。base_demo功能包中提供了Service通信的示例代码节点。每个节点都提供了Python与Cpp两种编程方式的实现。

打开终端,输入以下命令启动Service服务端的Python节点:

bash
ros2 run base_demo service_server.py

或者CPP节点:

bash
ros2 run base_demo service_server

新开终端,输入以下命令启动Service客户端的Python节点:

bash
ros2 run base_demo service_client.py

或者Cpp节点:

bash
ros2 run base_demo service_client

客户端节点启动后会向代码中自定义的服务发送请求,服务端接收到请求的信息后会进行处理并在终端提示“Target object is box”“find box and response”,同时反馈响应信息。

客户端节点接收到响应后会在终端显示相应的信息:

1

注意:本小节主要介绍工作空间的创建和代码包的构建,源码编写过程可参考。

ros_arm_tutorials

大家可以参考此教程在openEuler系统上编译构建自己的ROS程序~

参考资料