创建ROS消息和服务---ROS学习第8篇
文章目錄
- 1. msg和srv介紹
- 2. 使用msg
- 2.1 創建msg
- 2.2 使用rosmsg
- 3. 使用srv
- 3.1 創建srv
- 3.2 使用rossrv
- 4. msg和srv的一般步驟
- 5.獲取幫助
- 6. 復習
1. msg和srv介紹
● msg(消息):msg文件是文本文件,用于描述ROS消息的字段。它們用來為不同編程語言編寫的消息生成源代碼。
● srv(服務):一個srv文件描述一個服務。它由兩部分組成:請求(request)和響應(response)。
msg文件存放在軟件包的msg目錄下,srv文件則存放在srv目錄下。
msg文件每行都有一個字段類型和字段名稱,可以使用的類型為:
int8, int16, int32, int64 (以及 uint*)
float32, float64
string
time, duration
其他msg文件
variable-length array[] 和 fixed-length array[C]
ROS中海油一個特殊的數據類型:Header,它含有時間戳和ROS中廣泛使用的坐標幀信息。在msg文件的第一行經??梢钥吹紿eader header。
下面是一個使用Header、字符串原語和其他兩個消息的示例:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
srv文件和msg文件一樣,只是他們包含兩個部分:請求和響應,這兩部分用一條—線隔開,下面是一個srv文件的示例:
在上面的例子中,A和B是請求,Sum是響應。
2. 使用msg
2.1 創建msg
下面,我們將在之前創建的軟件包里定義一個新的消息
$ roscd study
$ mkdir msg
$ echo “int64 num” > msg/Num.msg
上面的示例,.msg文件只有一行,當然,你可以通過添加更多元素(每行一個)來創建一個更復雜的文件,如下所示:
string first_name
string last_name
uint8 age
uint32 score
不過還有關鍵的一步:我們要確保msg文件能被轉換為C++、Python和其他語言的源代碼。
打開package.xml,確保它包含以下兩行且沒被注釋,如果沒有,添加進去:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
注意,在構建時,其實只需要message_generation,而在運行時,我們只需要message_runtime。在CMakeLists.txt文件中,為已經存在里面的find_package調用message_generation依賴項,這樣就能生成消息了。直接將message_generation添加到COMPONENTS列表中即可,如下所示:
#不要直接復制這一大段,只需將message_generation加在括號閉合前即可
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
你可能注意到了,有時即使沒有使用全部依賴項find_package,項目也可以構建。這是因為catkin把你所有的項目整合在了一起,因此如果之前的項目調用了find_package,你的依賴關系也被配置成了一樣的值。但是,忘記調用意味著你的項目在單獨構建時很容易崩潰。
還要確保導出消息的運行時依賴關系:
catkin_package(
…
CATKIN_DEPENDS message_runtime …
…)
找到如下代碼塊:
刪除#符號來取消注釋后,然后將Message*.msg替換為你的.msg文件名,就像下面這樣:
add_message_files(
FILES
Num.msg
)
手動添加.msg文件后,我們要確保CMake知道何時需要重新配置項目?,F在必須確保generate_messages()函數被調用:
在ROS Hydro及更新版本中,你需要取消下面幾行的注釋:
現在,我們可以從msg文件定義中生成源代碼文件了。
2.2 使用rosmsg
以上就是創建消息的所有步驟。讓我們通過rosmsg show命令看看ROS能否識別它,用法:
$ rosmsg show [message type]
$ rosmsg show study/Num
int64 num
在上面的例子中,消息類型包含兩部分:
● study—定義消息的軟件包
● Num—消息的名稱Num
如果不記得msg在哪個保重,也可以省略包名稱,嘗試:
$ rosmsg show Num
[study/Num]:
int64 num
3. 使用srv
3.1 創建srv
使用之前創建的包再來創建服務:
$ roscd study
$ mkdir srv
我們將從另一個包復制現有的srv定義,而不是手動創建新的srv。roscp是一個實用的命令行工具,用于將文件從一個包復制到另一個包。用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
現在我們可以從rospy_tutorials包中復制一個服務:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
還有關鍵的一步:我們要確保msg文件能被轉換為C++、Python和其他語言的源代碼。如果沒做過上面的教程,請先打開package.xml,確保它包含以下兩行且沒有被注釋。如果沒有,添加進去:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
如前所述,在構建時,其實只需要message_generation,而在運行時,我們只需要message_runtime。
如果沒做過上面的教程,在CMakeLists.txt文件中,為已經存在里面的find_package調用添加message_generation依賴項,這樣就能生成消息了。直接將message_generation添加到COMPONENTS列表中即可,如下所示:
#不要直接復制這一大段,只需將message_generation加在括號閉合前即可
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
(別被名字迷惑,message_generation對msg和srv都適用)
此外,你也需要像之前對消息那樣在package.xml中修改服務字段,因此請看上面描述的所需附加依賴項。
刪除#符號來取消注釋,然后將Service*.srv替換為你的.srv文件名,就像下邊這樣:
add_service_files(
FILES
AddTwoInts.srv
)
3.2 使用rossrv
以上就是創建服務的所有步驟。通過rossrv show命令查看ROS能否識別它,用法:
rossrv show
示例:
跟rosmsg類似,也可以在不指定報名的情況下這樣找到這樣的服務:
4. msg和srv的一般步驟
如果沒做過上面的教程,請先修改CMakeLists.txt
取消注釋,然后添加任意你的消息用到的包含.msg文件的軟件包(本例中為std_msgs),如下所示:
generate_messages(
DEPENDENCIES
std_msgs
)
現在我們已經創建了一些新消息,需要重新make一下軟件包
#In your catkin workspace
$ roscd study
$ cd …/…
$ catkin_make
$ cd -
msg目錄中的任何.msg文件都將生成所有支持語言的代碼。C++消息的頭文件將生成在/catkin_ws/devel/include/study/。Python腳本將創建在/catkin_ws/devel/lib/python3.0/dist-packages/study/msg。而Lisp文件則出現在~/catkin_ws/devel/share/common-lisp/ros/study/msg/。
類似地,srv目錄中的任何.srv文件都將生成支持語言的代碼。對于C++,頭文件將生成在消息的頭文件的同一目錄中。對于Python和Lisp,會在msg目錄旁邊的srv目錄中。
5.獲取幫助
我們已經接觸到不少ROS工具了,但很難記住每個命令所需的參數,這時可通過ROS工具自己的幫助命令,嘗試:
$ rosmsg -h
同樣也可以獲得子命令的幫助:
6. 復習
總結一下到目前為止我們接觸過的一些命令:
rospack = ros+pack(age) : provides information related to ROS packages
roscd = ros+cd : changes directory to a ROS package or stack
rosls = ros+ls : lists files in a ROS package
roscp = ros+cp : copies files from/to a ROS package
rosmsg = ros+msg : provides information related to ROS message definitions
rossrv = ros+srv : provides information related to ROS service definitions
catkin_make : makes (compiles) a ROS package
rosmake = ros+make : makes (compiles) a ROS package (if you’re not using a catkin workspace)
總結
以上是生活随笔為你收集整理的创建ROS消息和服务---ROS学习第8篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年寒假将至,教育部致信中小学生家
- 下一篇: 服务机器人产品开发