ROS 定製自己的訊息型別msg

2021-06-27 09:09:44 字數 3427 閱讀 5406

在實際應用中,我們可能想發布自己的訊息型別,就像眾所周知的twist型別或者航向資訊odometry一樣,那麼到底如何定製自己想要的訊息型別?本文樓主以自己除錯過程中監控機械人左右輪速度來進行演示。

文章內容包括:訊息的定製和使用,以及使用rqt_plot來繪製曲線,建議大家先閱讀官網教程,一些細節事項也可參見這個自定義訊息msg。

首先在你的package建立msg資料夾,然後新建乙個空白文件,命名為num.msg,將下面的左右輪速度複製進去,儲存。當然你可以按照官網方式在終端裡輸入指令來執行上的流程。

這裡我定義來乙個左右輪速度的如下:

float32 leftspeed

float32 rightspeed

如果你想定義為陣列型別的,如下:

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設定雷射點的多少

37scan.intensities.resize(num_readings);

38for(unsigned

inti = 0; i

< num_readings; ++i)

定義完以後,注意在package.xml檔案裡新增:

message_generation

message_runtime

如果你之前建立過訊息已經有了上面兩句就不用再新增了。

然後在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繪製曲線了。

ros 建立自己的msg

在使用ros訂閱話題訊息的時候,有些時候為了能夠進行資料型別的轉換或者想實現訊息的傳輸問題時,需要用到自己定義的.msg訊息型別。建立乙個msg檔案,再建立乙個.msg檔案 mkdir msg vi test.msg如下定義 float32 data uint16 size header heade...

理解ROS 建立並使用自己的msg和srv

在包的src同一級建立msg和srv資料夾,並在裡面建立自己的訊息和服務。如 my msg.msg header header string child frame id geometry msgs posewithcovariance pose geometry msgs twistwithcov...

ROS的常見的訊息型別

rviz中顯示的是乙個有方向的箭頭 std msgs header header string child frame id geometry msgs posewithcovariance pose 位置和方向 geometry msgs twistwithcovariance twist 角速度...