zoukankan      html  css  js  c++  java
  • ros之自定义消息类型

    现在发布一个ROS本身未定义的消息

    在std_msgs包定义拉一些基本的类型由这些类型数据构成的定长或变长数组在Python中处理后得到元组并且可以被设置成元组或列表

    c++比python有更多的原生数据类型,这在从c++节点和python节点交换数据的时候产生一些问题,

    例如在C++中一个8位无符号整数,在pyhton中被当作整数,这就意为着可以给他赋为负数或者大于255的值,当作为ROS消息发送时会被解释成8位无符号数值。

    定义一个自定义类型的消息

    假设发送随即的复数,复数包含实部和虚部,并且两部分都是浮点型

    创建一个Complex.msg文件在basic包的msg目录下

    Complex.msg  

    float32 real        
    float32 imaginary   

    消息被定义后需要在根目录下运行catkin_make进行编译,产生语言相关的代码,其中包含 了类型的定义,以及序列化和反序列化的相关的代码,这将能够在任何ROS支持的语言使用这一消息类型。

    为了让ROS  产生相关的消息代码,我们需要确保已经告知构建系统新消息的定义

    可以通过向package.xml文件添加下以下代码来实现:

    <build_depend>message_generation</build_depend>

    <run_depend>message_runtime</run_time>       ##书上给出的这一条在运行时出现了错误并提醒改称:<exec_depend>rmessage_runtime</exec_depend>

    然后需要更改下CmakeLists.txt文件

    1

    find_package(catkin REQUIRED COMPONENTS
     rospy
     roscpp
     std_msgs
     message_generation
    )

    添加了message_generation这样catkin知道去哪里寻找这个包

    2

    catkin_package(
       CATKIN_DEPENDS message_runtime
    )   

    在catkin_package()调用末尾加message_runtime         告知catkin我们将在运行时使用消息

    3

    add_message_files(
      FILES
      Complex.msg
    )

    在其末尾添加消息定义文件告知catkin我们想编译他

    4

    generate_messages(
      DEPENDENCIES
      std_msgs   
    )

    将其前边的注释去掉,并写入消息依赖的所有依赖项

    然后在工作空间的根目录下进行catkin_make进行编译

    书上说会产生python类但没有找到

    接下来消息的代码

    发布者:

    #!/usr/bin/env python                                                             
     
    import rospy
     
    from basic.msg import Complex
     
    from random import random
     
    rospy.init_node('message_publisher')
     
    pub = rospy.Publisher('complex',Complex)
     
    rate = rospy.Rate(2)
     
    while not rospy.is_shutdown():
        msg = Complex()
        msg.real = random()
        msg.imaginary = random()
     
        pub.publish(msg)
        rate.sleep()

    订阅者:

    #!/usr/bin/env python                                                             
     
    import rospy
     
    from basic.msg import Complex
     
    def callback(msg):
        print 'Real:',msg.real
        print 'Imaginary:',msg.imaginary
        print 
     
    rospy.init_node('message_subscriber')
     
    sub = rospy.Subscriber('complex',Complex,callback)
     
    rospy.spin()

    可以通过rosmsg命令查看某个消息的内容:

    miao@openlib:~$ rosmsg show Complex
    [basic/Complex]:
    float32 real
    float32 imaginary

    rosmsg package 将会例举定义了消息的所有包

    miao@openlib:~$ rosmsg package basic
    basic/Complex

    以上即为定义了新的数据类型,并且在消息中引用,如何在package.xml和CmakeLists.txt文件中配置。

  • 相关阅读:
    微信小程序开发之选项卡
    sublime text3安装cssrem 插件步骤
    我的第二个Vue项目
    node下载指定版本
    我的第一个vue项目构建
    js实现二级月日联动菜单
    webStrom设置打开默认浏览器
    html-webpack-plugin Configuration配置信息
    webpack html-webpack-plugin 遍历
    git使用笔记
  • 原文地址:https://www.cnblogs.com/miaorn/p/11743557.html
Copyright © 2011-2022 走看看