ROS:定制自己的消息类型msg

     在实际应用中,我们可能想发布自己的消息类型,就像众所周知的Twist类型或者航向信息Odometry一样,那么到底如何定制自己想要的消息类型?本文楼主以自己调试过程中监控机器人左右轮速度来进行演示。

     文章内容包括:消息的定制和使用,以及使用rqt_plot来绘制曲线,建议大家先阅读官网教程,一些细节事项也可参见这个自定义消息msg

    首先在你的package创建msg文件夹,然后新建一个空白文档,命名为Num.msg,将下面的左右轮速度复制进去,保存。当然你可以按照官网方式在终端里输入指令来执行上的流程。

这里我定义来一个左右轮速度的如下:

float32 leftspeed
float32 rightspeed</span>

如果你想定义为数组类型的,如下:

float32[]  leftspeed
float32[]  rightspeed

注意这里的数组使用的是无长度限制的,也就是方扩号内没有东西。在使用的时候,不能够直接用数组赋值那样去做,它实际上是一个向量,往里面填充数据应使用c++中vector的push_back、resize之类的函数详细内容可参看该ros answer,该例程使用push_back填充数据.也可以参见官方教程中laserscan的发布,laserscan消息中的ranges就是这样一个向量,在程序中laserscan是使用的resize先设定容器大小,再往里填充数据的.

  36     scan.ranges.resize(num_readings);//使用resize设定激光点的多少
  37     scan.intensities.resize(num_readings);
  38     for(unsigned int i = 0; i < num_readings; ++i){
  39       scan.ranges[i] = ranges[i];    //再往里面填数据
  40       scan.intensities[i] = intensities[i];
  41     }

定义完以后,注意在package.xml文件里添加:

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
如果你之前创建过消息已经有了上面两句就不用再添加了。

然后在 CMakeLists.txt文件的find_packag里添加一些必要的语句,这个参见前面提到的官网教程。
最主要的是在add_message_files里添加上你自定义的消息。

## Generate messages in the 'msg' folder
add_message_files(
  FILES
  Num.msg
  carOdom.msg
)

如果都完成以后,新开一个终端,输入一下指令,编译一下:

cd ~/catkin_ws
catkin_make

在程序中首先使用下面的语句引进该消息msg类型

from  beginner_tutorials.msg import Num       #beginner_tutorials 为自己建立的package,放在catkin_ws/src下
在程序中使用自己已经定义的消息:
car_speed = Num() #注意 消息的使用car_speed.leftspeed = a  car_speed.rightspeed = b

 
这里贴一个自己的完整程序在下面,这个程序里包含了Lz自己写的串口模块,这里贴出来只是让大家知道怎么调用自定义的msg。 

程序如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import roslib;roslib.load_manifest('beginner_tutorials')
import rospy
from  beginner_tutorials.msg import Num       #beginner_tutorials 为自己建立的package,放在catkin_ws/src下

import serial_lisenning as COM_ctr            #这是楼主自己写的串口模块,已经封装好,模块里是开线程不断读取串口
import glob

def talker():
    rec_data = COM_ctr.SerialData( datalen = 2)  #启动监听COM 线程
    allport = glob.glob('/dev/ttyU*')
    port = allport[0]
    baud = 115200
    openflag = rec_data.open_com(port, baud)
    
    pub = rospy.Publisher('car_speed', Num)    #topic
    rospy.init_node('talker', anonymous=True)
    r = rospy.Rate(1000) # 1000hz
    while not rospy.is_shutdown():
        all_data = []
        if rec_data.com_isopen():
            all_data = rec_data.next()  #接收的数据组
        
        if all_data != []:
            car_speed = Num()                  #注意 消息的使用
            car_speed.leftspeed = all_data[0][0]
            car_speed.rightspeed = all_data[1][0]
            print car_speed.leftspeed, car_speed.rightspeed
            pub.publish(car_speed)
        r.sleep()
     
    if openflag:
        rec_data.close_lisen_com()  
    
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException: pass

注意每次新建的py文件都要使用在新的终端中,用下面的命令使程序可执行。

chmod +x  your_code.py

运行roscore以后,再开一个新的终端,运行:

rosrun beginner_tutorials bluetooth_msg.py
然后再在一个新的终端中,运行:

rqt_plot
输入我们的topic,就可一使用rqt_plot绘制曲线了。






### 如何在 ROS2 中查看消息类型ROS2 中,可以通过多种方式来查看已有的消息类型及其结构。以下是具体方法: #### 使用 `ros2 interface` 命令 通过命令行工具可以方便地查询和显示自定义或标准的消息和服务接口。 - **查看特定消息类型的详细信息** 可以使用以下命令来查看某个指定消息类型的字段和数据结构: ```bash ros2 interface show <package_name>/<msg_type> ``` 例如,如果要查看名为 `AddThreeInts` 的自定义服务消息,则运行以下命令[^1]: ```bash ros2 interface show tutorial_interfaces/srv/AddThreeInts ``` - **列出所有可用的消息和服务接口** 如果想获取当前环境中所有的消息和服务接口列表,可执行以下命令: ```bash ros2 interface list ``` 这会返回一系列由不同包提供的消息和服务名称。 #### 自定义消息的创建与依赖管理 当开发新的机器人应用程序时,可能需要定义自己的消息类型。这通常涉及以下几个方面的工作流程: - 创建一个新的 `.msg` 文件并保存到适当位置(通常是 `<your_package>/msg/` 目录下),其中描述所需的数据格式。 - 修改 CMakeLists.txt 和 package.xml 来声明这些新增加的内容,并指明它们所基于的标准库或其他外部资源。比如,在某些情况下仅需引入 std_msgs 即可满足需求[^3]: ```xml <build_depend>std_msgs</build_depend> ``` - 编译项目之后重新加载环境变量使得更改生效。 #### MATLAB中的ROS消息支持 对于那些希望利用MATLAB来进行仿真或者数据分析的研究人员来说,MathWorks 提供了一套完整的解决方案用于处理来自真实世界传感器设备所产生的复杂数据流——包括但不限于图像序列、三维点云图等等[^2]。 它们允许用户轻松完成诸如解码压缩后的视频帧这样的任务而无需深入理解底层协议细节;同时也提供了丰富的API函数以便于进一步定制化操作逻辑。 ```python import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalPublisher(Node): def __init__(self): super().__init__('minimal_publisher') self.publisher_ = self.create_publisher(String, 'topic', 10) timer_period = 0.5 # seconds self.timer = self.create_timer(timer_period, self.timer_callback) def timer_callback(self): msg = String() msg.data = 'Hello World' self.publisher_.publish(msg) self.get_logger().info('Publishing: "%s"' % msg.data) def main(args=None): rclpy.init(args=args) minimal_publisher = MinimalPublisher() rclpy.spin(minimal_publisher) minimal_publisher.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 上述代码片段展示了一个简单的发布者节点实现过程,它定期向订阅端发送字符串形式的信息。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值