7.ROS2接口介紹
寫在前面
- 當(dāng)前平臺文章匯總地址:ROS2機器人從入門到實戰(zhàn)
- 獲取完整教程及配套資料代碼,請關(guān)注公眾號<魚香ROS>獲取
- 教程配套機器人開發(fā)平臺:兩驅(qū)版| 四驅(qū)版
- 為方便交流,搭建了機器人技術(shù)問答社區(qū):地址 fishros.org.cn
本節(jié)小魚將會帶你學(xué)習(xí)認(rèn)識一個新的概念,叫做interface,即接口。
1.ROS2接口介紹
1.1 什么是接口
接口其實是一種規(guī)范
你還記得前面幾節(jié)的示例中,我們在代碼中使用過這兩種接口,這兩種數(shù)據(jù)類型分別代表字符串和32位二進制的整型數(shù)據(jù),是ROS 2提前定義的一種規(guī)范。
std_msgs/msg/String
std_msgs/msg/UInt32
1.2 為什么使用接口
小魚舉一個雷達的例子,不同的廠家生產(chǎn)出不同的類型的激光雷達,每種雷達驅(qū)動方式、掃描速率等等都不相同。
當(dāng)機器人進行導(dǎo)航時,需要激光雷達的掃描數(shù)據(jù),假如沒有統(tǒng)一接口,每次更換一個種類的雷達,都需要重新做程序適配。
于是ROS2中定義了一個統(tǒng)一的接口叫做sensor_msgs/msg/LaserScan
,現(xiàn)在幾乎每個雷達的廠家都會編寫程序?qū)⒆约豪走_的數(shù)據(jù)變成sensor_msgs/msg/LaserScan
格式,提供給用戶使用。
如果雷達的例子不好理解,大家可以把雷達換成手機充電器,USB接口是不是也是一種規(guī)范,所有的廠家都按照這種接口進行充電器和連接線的生產(chǎn)。
1.3. ROS2自帶的接口
前面話題通信時std_msgs
功能包是我們安裝ROS2的時候ROS2為我們自動安裝的,除了std_msgs
之外,ROS2
還定義了很多做機器人常用的接口。
使用
ros2 interface package sensor_msgs
命令可以查看某一個接口包下所有的接口
比如:傳感器類的消息包sensor_msgs
打開終端輸入:ros2 interface package sensor_msgs
sensor_msgs/msg/JointState #機器人關(guān)節(jié)數(shù)據(jù)
sensor_msgs/msg/Temperature #溫度數(shù)據(jù)
sensor_msgs/msg/Imu #加速度傳感器
sensor_msgs/msg/Image #圖像
sensor_msgs/msg/LaserScan #雷達數(shù)據(jù)
......
雖然ROS2為我們定義了大量有手就行,拿來就用
的接口,但有時候還是不能滿足我們的變態(tài)想法,所以我們需要掌握自定義接口的方法。
2. 接口文件內(nèi)容
2.1 可以定義的接口三種類型
小魚提到過,ROS2提供了四種通信方式:
- 話題-Topics
- 服務(wù)-Services
- 動作-Action
- 參數(shù)-Parameters
除了參數(shù)之外,話題、服務(wù)和動作(Action)都支持自定義接口,每一種通信方式所適用的場景各不相同,所定義的接口也被分為話題接口、服務(wù)接口、動作接口三種。
2.2 接口形式
這三種接口定義起來有什么不一樣的地方呢?小魚先帶大家直觀感受一下:
話題接口格式:xxx.msg
int64 num
服務(wù)接口格式:xxx.srv
int64 a
int64 b
---
int64 sum
動作接口格式:xxx.action
int32 order
---
int32[] sequence
---
int32[] partial_sequence
2.3 接口數(shù)據(jù)類型
根據(jù)引用方式不同可以分為基礎(chǔ)類型和包裝類型兩類。
基礎(chǔ)類型有(同時后面加上[]可形成數(shù)組)
bool
byte
char
float32,float64
int8,uint8
int16,uint16
int32,uint32
int64,uint64
string
包裝類型
即在已有的接口類型上進行包含,比如
uint32 id
string image_name
sensor_msgs/Image
2.4 接口如何生成代碼
有的同學(xué)可能會問這樣一個問題,我們只是簡單的寫了一下變量類型和名稱,我們在程序里面怎么調(diào)用呢?
其實這里有一個轉(zhuǎn)換的過程:將msg、srv、action文件轉(zhuǎn)換為Python和C++的頭文件。
通過ROS2的IDL模塊 產(chǎn)生了頭文件,有了頭文件,我們就可以在程序里導(dǎo)入并使用這個消息模塊。
3.自定義接口實踐
3.1 場景定義
給定一個機器人開發(fā)中的常見控制場景,我們設(shè)計滿足要求的服務(wù)接口和話題接口。
設(shè)計兩個節(jié)點
- 一個機器人節(jié)點,對外提供移動指定距離服務(wù),移動完成后返回當(dāng)前位置,同時對外發(fā)布機器人的位置和狀態(tài)(是否在移動)。
- 機器人控制節(jié)點,通過服務(wù)控制機器人移動指定距離,并實時獲取機器人的當(dāng)前位置和狀態(tài)。
假設(shè)機器人在坐標(biāo)軸上,只能前后移動。
3.2 定義接口
服務(wù)接口MoveRobot.srv
# 前進后退的距離
float32 distance
---
# 當(dāng)前的位置
float32 pose
話題接口,采用基礎(chǔ)類型 RobotStatus.msg
uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 1
uint32 status
float32 pose
話題接口,混合包裝類型 RobotPose.msg
uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 2
uint32 status
geometry_msgs/Pose pose
3.3 創(chuàng)建接口功能包編接口
創(chuàng)建功能包
ros2 pkg create example_ros2_interfaces --build-type ament_cmake --dependencies rosidl_default_generators geometry_msgs
注意功能包類型必須為:ament_cmake
依賴rosidl_default_generators
必須添加,geometry_msgs
視內(nèi)容情況添加(我們這里有geometry_msgs/Pose pose
所以要添加)。
接著創(chuàng)建文件夾和文件將3.2中文件寫入,注意話題接口放到msg
文件夾下,以.msg
結(jié)尾。服務(wù)接口放到srv
文件夾下,以srv
結(jié)尾。
.
├── CMakeLists.txt
├── msg
│ ├── RobotPose.msg
│ └── RobotStatus.msg
├── package.xml
└── srv
└── MoveRobot.srv
2 directories, 5 files
接著修改CMakeLists.txt
find_package(rosidl_default_generators REQUIRED)
find_package(geometry_msgs REQUIRED)
# 添加下面的內(nèi)容
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/RobotPose.msg"
"msg/RobotStatus.msg"
"srv/MoveRobot.srv"
DEPENDENCIES geometry_msgs
)
接著修改package.xml
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rosidl_default_generators</depend>
<depend>geometry_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group> #添加這一行
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
保存即可編譯
colcon build --packages-select example_ros2_interfaces
編譯完成后在chapt3_ws/install/example_ros2_interfaces/include
下你應(yīng)該可以看到C++的頭文件。在chapt3_ws/install/example_ros2_interfaces/local/lib/python3.10/dist-packages
下應(yīng)該可以看到Python版本的頭文件。
接下來的代碼里我們就可以通過頭文件導(dǎo)入和使用我們定義的接口了。
@TODO 講一下為什么要source
4.ROS2接口常用CLI命令
最后給大家講一下ROS2接口相關(guān)的常用命令有哪些。
4.1查看接口列表
ros2 interface list
文章來源:http://www.zghlxwxcb.cn/news/detail-754757.html
4.2 查看某一個接口詳細(xì)的內(nèi)容
ros2 interface show std_msgs/msg/String
文章來源地址http://www.zghlxwxcb.cn/news/detail-754757.html
到了這里,關(guān)于【ROS2機器人入門到實戰(zhàn)】ROS2接口介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!