• 五、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
    
    • 1

    进入interfaces文件夹使用tree命令可以看到如下结构
    在这里插入图片描述

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

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

    cd village_interfaces
    mkdir msg
    cd msg
    touch Novel.msg
    cd ..
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3、编写Novel.msg内容
    #原始数据类型
    string content
    #调用已有的消息类型
    sensor_msgs/Image imge
    
    • 1
    • 2
    • 3
    • 4
    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
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    5、修改package.xml

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

      sensor_msgs
      rosidl_default_generators
      rosidl_default_runtime
      rosidl_interface_packages
    
    • 1
    • 2
    • 3
    • 4
    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 #查看属性
    
    • 1
    • 2
    • 3
    • 4

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

  • 相关阅读:
    【JVM】双亲委派模型
    【数据结构】队列实现+层序遍历详解+一些练题
    VS生成动态库(VS2022、CUDA、Lib)
    计算机操作系统学习(六)设备管理
    白话文解析LiteFlow的理念是什么?什么时候用该怎么用?干货满满
    Java8 Stream生成流 generate iterate IntStream
    【FreeRTOS-----笔记(基础)】
    python学习笔记——file(文件)、OS模块操作、random模块
    鸿蒙Harmony应用开发—ArkTS声明式开发(组件可见区域变化事件)
    【解决】elasticsearch:Could not parse aggregation keyed as [%s]问题
  • 原文地址:https://blog.csdn.net/weixin_44014982/article/details/128041947