五、ROS2接口及其使用

接口,即interface,其实是一种规范。
举个例子,不同厂家生产出不同类型的激光雷达,每种雷达的驱动方式,扫描速率都不相同。
当机器人进行导航时,需要激光雷达的扫描数据,假如没有统一接口,每换一个雷达就需要重新适配。ROS2针对这种情况就定义了统一的接口。
可以使用ros2 interface package xxx命令查看某一个接口包下的所有接口。
虽然ROS2为我们定义了大量拿来即用的接口,我们还可以使用自定义接口。
之前提到过ROS2提供四种通信方式:话题、服务、动作、参数。除了参数之外,其他三个都支持自定义接口,故所定义的接口也分为话题接口、服务接口、动作接口
话题接口格式 xxx.msg
服务接口格式 xxx.srv
动作接口模式 xxx.action

ROS2接口常用的命令行指令

查看接口列表ros2 interface list
查看所有接口包ros2 interface packages
查看某一个包下的所有接口ros2 interface package std_msgs
查看某一个接口详细的内容 ros2 interface show std_msgs/msg/String
输出某一个接口所有属性 ros2 interface proto sensor_msgs/msg/Image

自定义话题接口

话题是一个单向通信接口,同一个话题只能由发布者将数据传递给订阅者,所以定义话题接口也只需要定义发布者所要发布的类型即可。
先新建一个village_interfaces的功能包,有了功能包之后,我们就可以新建话题接口了。新建方法如下:
1、新建msg文件夹,并在文件夹下新建xxx.msg
2、在xxx.msg下编写消息内容并保存
3、在CmakeLists.txt添加依赖和msg文件目录
4、在package.xml中添加xxx.msg所需的依赖
5、编译功能包即可生成python与C++头文件

1、新建一个工作空间

在town_ws的src文件夹下,运行下面的指令,即可完成village_interfaces功能包的创建

ros2 pkg create village_interfaces --build-type ament_cmake

进入interfaces文件夹使用tree命令可以看到如下结构
五、ROS2接口及其使用_第1张图片

2、新建msg文件夹和Novel.msg(小说消息)

ps:msg文件首字母一定要大写,ROS2强制要求

cd village_interfaces
mkdir msg
cd msg
touch Novel.msg
cd ..

3、编写Novel.msg内容

#原始数据类型
string content
#调用已有的消息类型
sensor_msgs/Image imge

4、修改CMakeLists.txt

添加如下代码到CmakeLists.txt文件即可

#添加对sensor_msgs的
find_package(sensor_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
#添加消息文件和依赖
rosidl_generate_interfaces(${PROJECT_NAME}
	"msg/Novel.msg"
	DEPENDENCIES sensor_msgs
)

5、修改package.xml

修改village_iinterfaces目录下的package.xml ,添加下面三行代码,为工程添加一下所需依赖

  sensor_msgs
  rosidl_default_generators
  rosidl_default_runtime
  rosidl_interface_packages

6、编译

回到town_ws目录
运行colcon build --packages-select village_interfaces进行编译

测试验证

source install/setup.bash
ros2 interface package village_interfaces #查看包下所有接口
ros2 interface show village_interfaces/msg/Novel #查看内容
ros2 interface proto village_interfaces/msg/Novel #查看属性

如果能看到成功输出结果,即编译成功

你可能感兴趣的:(ROS2,ROS2)