為了提取空間中位置的座標,需要接收發布的位置資料。
大致就是想把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...