1. 程式人生 > >ROS--自定義話題訊息

ROS--自定義話題訊息


最近也在學習ROS 的基礎知識,看了ros的wiki,也買了古月大佬的《ROS 機器人開發實踐》一書,在學習過程中也發現了一些問題,在此記錄下。在此書第3章 ROS基礎 3.6.6自定義話題訊息一節,完全按照書本操作在catkin_make階段會出現以下錯誤:
Error(s) in package '/home/xuan/ros_study/src/learning_communication/package.xml':
Error(s):
- The manifest (with format version 2) must not contain the following tags: run_depend

先介紹話題訊息的相關內容,然後再提出解決方法。

自定義msg檔案

Person.msg

string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2

新增依賴

修改package.xml

《ROS機器人開發實踐》是這樣寫的:開啟功能包的package.xml檔案,確保檔案中設定了以下編譯和執行的相關依賴:

<bulid_depend>message_generation</bulid_depend>
<run_depend>message_runtime</run_depend>

修改CMakeLists.txt

然後開啟功能包的CMakeLists.txt檔案嗎在find_package中新增訊息生成依賴的功能包message_generation,這樣才能中編譯時找到所需要的檔案:

find_package(catkin REQUIRED COMPONENTS
	geometry_msgs
	roscpp
	rospy
	std_msgs
	message_generation
)

catkin依賴也要進行以下設定:

catkin_package(
	......
	CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime
	......
)

最後設定需要編譯的msg檔案:

add_message_files(
	FILES
	Person.msg
)
generate_messages(
	DEPENDENCIES
	std_msgs
)

編譯

使用catkin_make命令進行編譯,結果出現了錯誤,錯誤提示如下:
ERROR
錯誤提示為manifest(format的版本是2)禁止包含run_depend標籤。我們來看下package.xml檔案的前幾行:
format

解決辦法

檢視wiki百科,

可以發現,它在package.xml這裡沒有使用run_depend,而是使用了exec_depend。所以我們將run_depend改用exec_depend,然後使用catkin_make命令進行編譯,編譯成功。

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

使用命令檢視自定義的Person訊息型別。

rosmsg show Person

Person

查資料得:
<run_depend> This tag is no longer allowed. Wherever found, it must be replaced: <run_depend>foo</run_depend>
In format 2, that is equivalent to these two new tags:

<build_export_depend>foo</build_export_depend>

<exec_depend>foo</exec_depend>
If the dependency is only used at run-time, only the <exec_depend> is needed. If it is only exported to satisfy other packages’ build dependencies, use <build_export_depend>. If both are needed, this may be a better choice:

foo

總結

出現編譯錯誤的原因就是版本問題,書中的版本應該是在format="1"時編寫的,而現在一般都是format=“2” 。format2 不支援run_depend了。所以,在學習的同時也要多看看wiki百科,畢竟這是最原始的資料。

wiki連結