【ROS】ROS自定义msg以及在python中的使用

总结一下ROS自定义msg的用法(python)
参考:ROS Tutorials

一、自定义msg

1.新建msg文件

ROS自定义message需要在软件包下新建 /msg 文件夹,并在此文件夹下建立文件 msg名称.msg.msg文件的文件格式如下

<< data_type1 >>  << name_1 >>
<< data_type2 >>  << name_2 >>
<< data_type3 >>  << name_3 >>
...

(实际应用中删除<<与>>)
其中data_type包含以下几种:

  • int8,int16,int32,int64
  • float32,float64
  • string
  • 其他自定义msg:package/MessageName
  • 不定长array[ ]以及定长array[N]

msg文件例子

string message
float32 sent_time

2.修改package.xml

在package.xml中加入以下两行代码

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

message_generation用于编译阶段,message_runtime用于运行阶段。

3.修改CMakelist.txt

在CMakelist.txt中找到以下代码并取消注释

find_package(catkin REQUIRED COMPONENTS rospy std_msgs message_generation)
add_message_files(FILES <<msg名称>>.msg)
generate_messages(DEPENDENCIES std_msgs)
catkin_package(CATKIN_DEPENDS rospy std_msgs message_runtime)

注意第二行使用自己定义的msg文件名称,使用时去掉<<与>>。

4.catkin_make

以上步骤使用完毕后回到catkin工作空间使用catkin_make命令就大功告成了,可以使用如下命令验证msg是否定义成功

rosmsg show <<msg名称>>

二、python文件中的自定义msg使用

话不多说,直接上代码

#!/usr/bin/env python
import rospy
from my_chatter.msg import TimestampString

def talker():

  rospy.init_node('talker', anonymous=True) #定义节点

  pub = rospy.Publisher('user_message', TimestampString, queue_size=10) #定义话题
  
  r = rospy.Rate(10) # 10hz

  # Loop until the node is killed with Ctrl-C
  while not rospy.is_shutdown():

    pub_string = TimestampString() #声明msg类型
    pub_string.message = raw_input("Please enter a line of text and press <Enter>:") # ros使用python2.7,使用raw_input读取字符串
    pub_string.sent_time = rospy.get_time()
        
    pub.publish(pub_string) #发布消息
    
    r.sleep()
      
if __name__ == '__main__':
  try:
    talker()
  except rospy.ROSInterruptException: pass

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是在ROS 2使用Python自定义消息的示例: 1. 首先,我们需要安装ROS 2并设置环境变量。 2. 然后创建一个ROS 2工作区并创建一个ROS 2软件。 ``` mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ros2 pkg create mypkg --build-type ament_python --dependencies rclpy ``` 3. 在mypkg创建一个名为msg的文件夹,并在其创建一个名为MyMsg.msg的文件。 ``` mkdir msg touch msg/MyMsg.msg ``` 在MyMsg.msg文件定义自定义消息: ``` # My custom message int32 id string name float32 value ``` 4. 使用以下命令在mypkg生成Python代码: ``` cd ~/ros2_ws colcon build --packages-select mypkg ``` 5. 为了测试自定义消息,我们将创建一个发布者和一个订阅者节点。 在mypkg创建一个名为publisher.py的文件,并将以下代码添加到文件: ``` import rclpy from rclpy.node import Node from mypkg.msg import MyMsg class MyPublisher(Node): def __init__(self): super().__init__('my_publisher') self.publisher_ = self.create_publisher(MyMsg, 'my_topic', 10) self.timer = self.create_timer(0.5, self.timer_callback) self.i = 0 def timer_callback(self): msg = MyMsg() msg.id = self.i msg.name = 'My Message' msg.value = 2.5 self.publisher_.publish(msg) self.get_logger().info('Publishing: "%d, %s, %f"' % (msg.id, msg.name, msg.value)) self.i += 1 def main(args=None): rclpy.init(args=args) my_publisher = MyPublisher() rclpy.spin(my_publisher) my_publisher.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 在mypkg创建一个名为subscriber.py的文件,并将以下代码添加到文件: ``` import rclpy from rclpy.node import Node from mypkg.msg import MyMsg class MySubscriber(Node): def __init__(self): super().__init__('my_subscriber') self.subscription = self.create_subscription( MyMsg, 'my_topic', self.listener_callback, 10) self.subscription # prevent unused variable warning def listener_callback(self, msg): self.get_logger().info('Received: "%d, %s, %f"' % (msg.id, msg.name, msg.value)) def main(args=None): rclpy.init(args=args) my_subscriber = MySubscriber() rclpy.spin(my_subscriber) my_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 6. 最后,使用以下命令运行发布者和订阅者节点: ``` ros2 run mypkg publisher.py ros2 run mypkg subscriber.py ``` 在发布者节点,我们定义了一个MyMsg类型的消息,并在定时器回调填充消息数据并将其发布到my_topic主题。在订阅者节点,我们订阅了my_topic主题,并在回调函数打印收到的消息。 这是一个简单的使用Python自定义消息的ROS 2示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值