ROS2 自定义消息、服务

我的平台是Ubuntu22.04+humble,使用Python语言。下一内容主要是对官方教程的翻译实现。ros2自定义消息等主要包括创建一个包用于集中管理这些信息类型,定义msg、srv的信息结构,修改CMakeLists.txt和package.xml文件,编译。下面是具体内容。 

1. 进入工作空间src目录,创建功能包

        在创建包的时候,选择 ament_cmake方式创建,编译完成后c++和Python都能使用。

ros2 pkg create --build-type ament_cmake tutorial_interfaces

        在改包目录下新建msg和srv两个文件夹,用于存放自己定义的消息和服务类型文件。

mkdir msg

mkdir srv

2.  在msg和srv文件中定义信息结构

        这里定义了两种消息,一种只用了简单的数据结构,另一种使用了ros2自带的较复杂的消息。这两种消息在修改cmakelist文件时有区别。

        消息1:传递一个int64整数。新建Num.msg文件,内容为:

int64 num

        消息2:传递球的球心和半径。新建Sphere.msg文件,内容为:

geometry_msgs/Point center
float64 radius

        进入srv文件,新建AddThreeInts.srv文件,用于描述请求三个数a、b、c相加,返回总和sum的服务,请求和返回之间用三个-隔开。

int64 a
int64 b
int64 c
---
int64 sum

3. 修改CMakeList.txt和package.xml文件

        在原CMakeList.txt文件中添加以下内容:

find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"
  "msg/Sphere.msg"  # 这里各项之间不能用标点符号隔开
  "srv/AddThreeInts.srv"
  DEPENDENCIES geometry_msgs # 添加以上自定义依赖的ros包, 这里的Sphere.msg使用了geometry_msgs
)

        在原package.xml文件中添加以下内容

<depend>geometry_msgs</depend>

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

4. 编译并验证

colcon build --packages-select tutorial_interfaces

编译后在工作空间目录执行下面命令source一下:

. install/setup.bash

查看Sphere消息:

ros2 interface show tutorial_interfaces/msg/Sphere

返回:

geometry_msgs/Point center
        float64 x
        float64 y
        float64 z
float64 radius

5. 编译错误

我的系统还安装了anaconda,如果是在base环境编译的话会出下面的问题(build_type是ament_python时则没有问题):

ImportError: cannot import name 'generate_py' from 'rosidl_generator_py'

解决办法:

不使用anaconda的base环境,deactivate出来,再编译。还不行的话把build、install和log文件夹删除,重新编译。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍如何使用 Python 实现 ROS 2 自定义消息。 假设您已经按照上一条回答中的步骤创建了一个名为 `my_custom_msg` 的 ROS 2 包,并定义了一个名为 `MyCustomMsg` 的自定义消息。现在,我们将使用 Python 实现这个消息。 首先,您需要导入 ROS 2 中的消息定义模块。在 Python 中,您可以使用以下代码导入 `my_custom_msg` 包中的 `MyCustomMsg` 消息: ```python from my_custom_msg.msg import MyCustomMsg ``` 接下来,您可以创建一个 `MyCustomMsg` 类型的消息对象,并设置它的字段值。例如,以下代码创建了一个 `MyCustomMsg` 消息对象,并将 `foo` 和 `bar` 字段设置为 42 和 "hello": ```python msg = MyCustomMsg() msg.foo = 42 msg.bar = "hello" ``` 完成消息对象的创建和设置后,您可以将其发布到 ROS 2 中。以下代码演示了如何使用 `rclpy` 发布一个 `MyCustomMsg` 类型的消息: ```python import rclpy from rclpy.node import Node class MyNode(Node): def __init__(self): super().__init__('my_node') self.publisher_ = self.create_publisher(MyCustomMsg, 'my_topic', 10) def publish_message(self): msg = MyCustomMsg() msg.foo = 42 msg.bar = "hello" self.publisher_.publish(msg) def main(args=None): rclpy.init(args=args) node = MyNode() node.publish_message() rclpy.spin(node) rclpy.shutdown() if __name__ == '__main__': main() ``` 在这个例子中,我们创建了一个名为 `MyNode` 的 Python 类,并在其中创建了一个 `MyCustomMsg` 类型的发布者。然后,在 `publish_message` 方法中,我们创建了一个 `MyCustomMsg` 消息对象,并将其发布到名为 `my_topic` 的 ROS 2 主题上。 这就是使用 Python 实现 ROS 2 自定义消息的基本步骤。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值