日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

创建ROS消息和服务---ROS学习第8篇

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建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文件的第一行經常可以看到Header 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知道何時需要重新配置項目。現在必須確保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篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。