首先切換到功能包底下:
$cd catkin_ws/src/scan
$mkdir msg
在msg資料夾下建立 乙個名為laserscan.msg的檔案,輸入如下內容:
header header
float32 angle_min # start angle of the scan [rad]
float32 angle_max # end angle of the scan [rad]
float32 angle_increment # angular distance between measurements [rad]
float32 time_increment # time between measurements [seconds]
float32 scan_time # time between scans [seconds]
float32 range_min # minimum range value [m]
float32 range_max # maximum range value [m]
float32 ranges # range data [m] (note: values < range_min or > range_max should be discarded)
float32 intensities # intensity data [device-specific units]
接下來,還有關鍵的一步:我們要確保msg檔案被轉換成為c++,python和其他語言的源**:
檢視package.xml, 確保它包含一下兩條語句:
message_generation
message_runtime
然後開啟cmakelists.txt檔案,利用find_packag函式,增加對message_generation的依賴,這樣就可以生成訊息了:
# do not just add this line to your cmakelists.txt, modify the existing line
find_package(catkin required components roscpp rospy std_msgs message_generation)
同樣,你需要確保你設定了執行依賴,這塊兒要放在generate_message()之後:
catkin_package(
catkin_depends
message_runtime
)
找到如下**塊:
# add_message_files(
# files
# message1.msg
# message2.msg
# )
去掉注釋符號#,用你的.msg檔案替代message*.msg,就像下邊這樣:
add_message_files(
files
laserscan.msg
)
手動新增.msg檔案後,我們要確保cmake知道在什麼時候重新配置我們的project。 確保新增了如下**:
generate_message(
dependencies
std_msgs
)
現在,你可以編譯工作空間生成自己的訊息源**了。
然後在工作空間的devel/include/scan資料夾下出現乙個laserscan.**件,這樣就生成了自定義訊息型別,就可在程式中include引用
以上就是你建立訊息的所有步驟。下面通過rosmsg show命令,檢查ros是否能夠識別訊息。
使用方法:
rosmsg show [message type]
樣例:
rosmsg show /scan/laserscan.msg
你將會看到:
[scan/laserscan]:
std_msgs/header header
uint32 seq
time stamp
string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32 ranges
float32 intensities
在上邊的樣例中,訊息型別包含兩部分:
如果你忘記了訊息所在的package,你也可以省略掉package名。輸入:
rosmsg show laserscan
你將會看到:
[scan/laserscan]:
std_msgs/header header
uint32 seq
time stamp
string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32 ranges
float32 intensities
如果在程式中用的話應該這樣:
scan::laserscan msg;//scan是訊息所在包的名字,laserscan為訊息資料夾名字去掉.msg,msg為自定義的乙個變數,然後
msg.header.stamp = ros::time::now();
msg.header.frame_id = "laser_frame";
msg.angle_min = -1.57;
msg.angle_max = 1.57;
在上面的包中建立srv資料夾,在srv資料夾下再建立addtwoints.srv檔案,在檔案中貼上如下訊息
#本srv檔案是對兩個整數求和,虛線前是輸入量,後是返回量
int32 a
int32 b
---int32 sum
下面就是修改package.xml和cmakelists.txt兩個檔案,告訴ros如何編譯,以及編譯什麼
首先package.xml加上
message_generation
message_runtime
再是cmakelists.txt分別加上
catkin_package(
catkin_depends message_runtime
)
find_package(catkin required components
std_msgs
message_generation
)
add_service_files(directory srv
files
addtwoints.srv
)
generate_messages(dependencies
std_srvs
)
然後編譯,編譯通過後檢視服務型別
rossrv show package_name/srv_name
如果和你建立的相同,那麼你就成功了。 建立ROS訊息和服務
1.建立乙個msg 在package msg下面 新增自定義的訊息檔案 msg。在ros中有乙個特殊的資料型別 header,它含有時間戳和座標系資訊。在msg檔案的第一行經常可以看到header header的宣告.header header string child frame id geome...
ROS 自定義訊息型別方法
1 在package中新建資料夾名為msg 2 在msg資料夾中建立訊息 此處以my msg.msg 為例,注意的是要以msg為字尾名 內容舉例如下 int32 data1 float64 data2關於訊息內容,需要注意的是如果型別錯誤,那麼將不能生成標頭檔案。例如float64寫成了float,...
ROS 自定義訊息型別 c
一 msg 用於發布 訂閱的通訊方式中。在包的src同級目錄下建立msg資料夾。在 sg資料夾中,建立.msg檔案 例 my msg.msg 編輯my msg.msg檔案 int32 data1 string data2 編輯package.xml 新增依賴 message generation m...