ROS自定義msg型別及編寫收發資料程式

2021-10-03 06:39:42 字數 3213 閱讀 5239

為了提取空間中位置的座標,需要接收發布的位置資料。

大致就是想把test_msg和test_pkg兩個包的用法融合起來。

可以把這兩個包直接寫在一起,或者新建乙個pkg在裡面分別用這兩個包。兩種方法都進行了嘗試,最後用了第一種。

ros中新建乙個工作包的命令為:catkin_create_pkg 工作包名 依賴項1 依賴項2

# 建立工作包

# 建立乙個名為test_pkg 的工作包, 使用ros和c++的介面(roscpp),其中要使用ros的標準訊息(std_msgs)

a) cd .

/catkin_ws/src

b)catkin_create_pkg test_pkg roscpp std_msgs geometry_msgs

此時,會在src資料夾中建立test_pkg 的資料夾,其中還會自動生成:cmakelist.txt, package.xml, src, include.

這次準備接收的資料是空間中的未知資料,因此需要建立自定義的訊息。

# 在test_pkg  資料夾下,建立自定義msg的資料夾和對應的msg檔案

a) mkdir msg

# 編輯gps.msg檔案,在其中鍵入以下**

b) float32[

] data

float32 vel

geometry_msgs/pose pose

string name

# 修改cmakelists.txt 檔案

a) find_package

(catkin required components

roscpp # 這是我們建立工作包時指定的依賴項

std_msgs # 這是我們建立工作包時指定的依賴項

message_generation

# 上面一行是我們增加的,意思是請編譯系統將我們自定義的msg檔案生成可執行檔案和庫檔案

)b) add_message_flies

(files test.msg) # 指定把哪個檔案生成msg檔案

c)generate_messages

(dependencies std_msgs)

# 修改package.xml檔案

a) message_generation<

/build_depend>

b)message_runtime<

/exec_depend>

編譯完成後,在devel/include/test_pkg 下生成test.h 的標頭檔案,如果在後面的節點中需要使用自定義gps.msg訊息,只需要 #include即可

發布

#include

#include

intmain

(int argc,

char

**ar**)

; std::vector<

float

>

array1

(array,array+3)

; msg.data = array1;

std::cout <<

"msg.data3[0]="

<< msg.data[0]

<< std::endl;

std::cout <<

"msg.data3.size="

<< msg.data.

size()

<< std::endl;

//下標訪問float32陣列

msg.data[0]

=0.1

; std::cout <<

"msg.data3[0]="

<< msg.data[0]

<< std::endl;

float array4[4]

=;std::vector<

float

>

array41

(array4,array4+4)

; msg.data = array41;

std::cout <<

"msg.data4.size="

<< msg.data.

size()

<< std::endl;

std::cout <<

"msg.data4="

<< msg.data[0]

<<

" "<< msg.data[1]

<<

" "<< msg.data[2]

<<

" "<< msg.data[3]

<< std::endl;

msg.data.

push_back

(5.5);

std::cout <<

"msg.data[5]="

<< msg.data[4]

<< std::endl;

//使用迭代器

msg.data.

resize(6

);std::cout <<

"msg.data6.size="

<< msg.data.

size()

<< std::endl;

std::cout <<

"msg.data6="

;for

(std::vector<

float

>

::iterator it = msg.data.

begin()

; it != msg.data.

end();

++it)

std::cout << std::endl;

msg_pub.

publish

(msg)

; ros::

spinonce()

; loop_rate.

sleep()

;++count;

}return0;

}

接收

#include

#include

void

msgcallback

(const test_pkg::test::constptr &msg)

intmain

(int argc,

char

** ar**)

ROS之msg檔案定義以及自定義發布主題訊息型別

一 建立msg檔案 相當於乙個結構體 總結 二 使用msg檔案 注意 msg檔案自定義資料型別其實就是乙個結構體型別,所以使用的時候就是相當於定義乙個結構體成員變數 struct stustu1,stu2 三 自定義發布訊息的型別 這裡舉乙個例子 robotcontrol.msg 相當於定義了乙個含...

ROS通訊機制(二) 話題通訊自定義msg

在 ros 通訊協議中,資料載體是乙個較為重要組成部分,ros 中通過 std msgs 封裝了一些原生的資料型別,但這些資料一般只包含乙個 data 字段,當傳輸一些複雜的資料,可以使用自定義的訊息型別 建立自定義msg 功能包下新建msg目錄,新增person.msg string name i...

ros編寫自定義的服務( srv)

1 編寫自定義的服務檔案 即.srv 檔案。2 儲存,catkin make編譯,要生成可以被 include 包 addtwoints.h 注意cmakelist.txt檔案的配置 cmake minimum required version 2.8.3 project learing commu...