机器人操作系统第二版(ROS 2)作为一种领先的中间件,为机器人应用的开发提供了一系列的通信工具和标准化组件。其通信机制的核心是主题(Topics),服务(Services)和动作(Actions)。在这个生态系统中,主题(Topics)扮演了节点间通信的核心角色,而消息(Messages,简写为msg)则是信息交换的基本单元。尽管ROS 2内置了广泛的标准消息类型,某些特定情境下仍然需要开发者设计自定义消息类型以满足独特需求。接下来,我们将详细探讨在ROS 2中定义和使用自定义消息的流程。
ROS 2消息(msg)是一种简单的数据结构,用于节点之间的通信。每个消息类型都定义了一组可以序列化(转化为字节流以便传输)和反序列化(从字节流转换回原始格式)的变量。通过自定义消息,开发者可以根据需求定义数据的格式,实现高效的信息交换。
在复杂的机器人项目中,对数据格式的特定需求远远超出了ROS 2标准消息类型所能提供的范围。自定义消息类型的设计旨在提升信息传递的效率和灵活性,使得消息传输过程更加精确地匹配项目的特定需求,从而最大化通信效率。
以下是创建和使用自定义ROS 2消息的高级步骤:
本文由于是在Ubuntu v20.04操作系统上实践,使用的是ROS2 galactic版本。
source /opt/ros/galactic/setup.bash
mkdir -p Ros2Workspace/src
cd Ros2Workspace/src
首先,确保已配置好ROS 2工作环境,随后创建一个新的包以存储自定义消息定义,命令如下:
ros2 pkg create --build-type ament_python <your_package_name>
其中<your_package_name>应替换为你的包名。
在包目录中创建一个名为msg的新目录,并在此目录下创建.msg文件。例如,Voice.msg文件内容如下所示,定义了一个包含单个整型num的简单消息结构:
int64 id
int16[] data
为保证ROS 2正确识别并构建你的自定义消息,必须在CMakeLists.txt和package.xml文件中声明相应的依赖和配置。
在package.xml中添加以下依赖声明:
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
而CMakeLists.txt需要包含对ROS 2消息生成工具的调用:
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Voice.msg"
)
在工作区的根目录下运行以下命令,构建新的ROS 2包:
colcon build --packages-select <your_package_name>
. install/setup.bash
可以在命令行中查看到此自定义消息,例如:
ros2 interface show robot_interfaces/msg/Voice
int64 id
int16[] data
创建和构建自定义消息后,就可以在发布者和订阅者节点中使用了。以下是一个发布者节点的示例代码,演示了如何发布自定义Voice消息:
# publisher.py
import rclpy
from rclpy.node import Node
from <your_package_name>.msg import Voice
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(Voice, 'topic', 10)
self.timer = self.create_timer(0.5, self.timer_callback)
self.i = 0
def timer_callback(self):
msg = Num()
msg.id = self.i
msg.data = xxx
self.publisher_.publish(msg)
self.get_logger().info(f'Publishing: "{msg.id}"')
self.i += 1
if __name__ == '__main__':
rclpy.init()
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher)
rclpy.shutdown()
节点的订阅者部分会类似,不过是监听相同的消息类型。
本文提供了一个关于如何在ROS 2中创建自定义消息的实用指南。此过程不仅增加了项目的灵活性,还深化了开发者对于ROS 2复杂通信机制的理解。自定义消息的正确实施能够显著提高消息传递的效率和项目的总体性能。
自定义消息是机器人项目成功实施的关键,为项目带来的影响远远超过了其创建和配置的初期工作量。通过本文,开发者可以充分利用ROS 2提供的强大功能,设计出既满足特定需求又高效的机器人应用程序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。