ROS2接口介紹
interface环凿,即接口
1.ROS2接口介紹
1.1 什么是接口
接口其實是一種規(guī)范
以下兩種數(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++的頭文件玖媚。
graph LR
A[msg,srv,action] -->B[ROS2-IDL轉(zhuǎn)換器]
B --> C[Python的py,C++的.h頭文件]
通過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)入和使用我們定義的接口了。
4.ROS2接口常用CLI命令
最后給大家講一下ROS2接口相關(guān)的常用命令有哪些桥嗤。
4.1查看接口列表
ros2 interface list
4.2 查看某一個接口詳細的內(nèi)容
ros2 interface show std_msgs/msg/String