ROS话题、服务、动作(自定义)

本文详细介绍了如何在ROS环境中使用话题(Topic)、服务(Service)和动作(Action)进行消息传递。首先展示了如何自定义话题消息并编写发布者和订阅者的C++代码,然后阐述了服务的定义及客户端和服务端的实现,最后提到了动作的自定义和服务器、客户端的编写,所有示例都包含了详细的代码实现和运行流程。

一.话题消息自定义和使用

以一个例题为例演示

使用 ROS 话题(Topic) 机制实现消息发布与订阅

要求:编写代码实现 ROS 中消息的发布与订阅: 创建一个发布者,每隔 100ms 依次发送斐波拉契数列的数字到话题/fibonacci 中;创建一个订阅者,订阅该话题,输出订阅结果。如,订阅者依次输出: 1 1 2 3 5 8 ··

1.如何自定义话题消息

·定义msg文件

#发送到话题内的数字
int32 number

在工作空间homeworkws/src内的homeworkpkg功能包内创建文件夹msg,并在msg内创建文件number.msg文件,在把上面的文件内容复制进文件。

·在package.xml中添加动态生成message的功能包依赖

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

·在CMakeLists.txt添加编译选项

1.在findpacksge(…..)结尾添加messagegeneration

2.在写有关于message内容下面添加

add_message_files(
  FILES
  number1.msg
)
generate_messages(
  DEPENDENCIES
  std_msgs
)

·在catkinpackage(….)结尾添加messageruntime

·回到工作空间的根目录下编译生成相应的头文件

cd homework_ws
catkin_make

2.创建发布者和订阅者代码实现(C++)

在工作空间homeworkws/src内的homeworkpkg功能包src内创建文件编写代码

发布者

cd homework_ws/src/homework_pkg/src
touch number_publisher.cpp
vim number_publisher.cpp
i(进入编辑模式)
写代码
esc键
:wq!(强制保存退出)

具体代码

#include<ros/ros.h>
#include"homework_pkg/number1.h"
int f(int count) {
    if (count == 1 || count == 2) {
        return 1;
    }
    else {
        return f(count - 2) + f(count - 1);
    }
}
int main(int argc, char** argv) {
     setlocale(LC_ALL,"");
    //ROS节点初始化
    ros::init(argc, argv, "number_publisher");
    //创建节点句柄
    ros::NodeHandle n;
    //创建一个publisher,发布名为/fibonacci的topic,消息类型为std_msgs::Int32,队>列长度为10
    ros::Publisher fibonacci_pub = n.advertise<homework_pkg::number1>("/fibonacci", 100);
    //设置循环频率
    ros::Rate loop_rate(10);
    int count = 1;
  while (ros::ok()) {
        //初始化geometry_sgs::Twist类型消息
        homework_pkg::number1 msg;
        msg.number = f(count);
        //发布消息
        fibonacci_pub.publish(msg);
        ROS_INFO("%d",msg.number);
        //按循环频率延时
        loop_rate.sleep();
        count++;
    }
    return 0;
}

订阅者

touch number_subscriber.cpp
vim number_subscriber.cpp
i(进入编辑模式)
写代码
esc键
:wq!(强制保存退出)

具体代码

#include<ros/ros.h>
#include"homework_pkg/number1.h"
void poseCallback(const homew
### 实现自定义消息在 `ros1_bridge` 中的转换与通信 为了使 `ros1_bridge` 支持自定义消息类型的转换,需要遵循特定的过程来确保 ROS1 和 ROS2 能够互相理解这些新类型的消息。 #### 安装必要的工具和依赖项 首先,确认已经安装了支持自定义消息所需的开发环境。对于基于 Debian 的系统来说: ```bash sudo apt-y \ python3-colcon-common-extensions \ ros-noetic-gencpp \ ros-noetic-genlisp \ ros-noetic-geneus \ ros-noetic-roslint \ ros-noetic-catkin-tools \ ros-foxy-ros1-bridge ``` 这一步骤确保了所有必需的编译器和其他辅助程序都已就绪[^3]。 #### 创建并配置工作空间 创建一个新的 Catkin 工作区用于存放自定义消息文件,并初始化该目录结构: ```bash mkdir -p ~/custom_ros_ws/src cd ~/custom_ros_ws/ catkin_init_workspace src/ ``` 接着,在此工作区内添加包含自定义消息定义的新包: ```bash cd ~/custom_ros_ws/src catkin_create_pkg custom_messages std_msgs message_generation ``` 编辑 `package.xml` 文件以声明对 `message_runtime` 的运行时依赖关系;同时修改 `CMakeLists.txt` 来指定要处理哪些 `.msg` 文件。 #### 编写自定义消息定义 进入刚刚创建好的包内编写新的消息格式。假设有一个名为 `CustomAction.msg` 的动作消息: ```plaintext # CustomActionGoal.msg Header header actionlib_msgs/GoalID goal_id CustomActionGoal action_goal # CustomActionResult.msg Header header actionlib_msgs/Status status CustomActionResult result # CustomActionFeedback.msg Header header actionlib_msgs/Status status CustomActionFeedback feedback # CustomAction.action uint8[] data --- bool success string message --- float64 progress ``` 保存上述内容到相应位置后返回顶层构建整个项目树: ```bash cd ~/custom_ros_ws/ catkin_make source devel/setup.bash ``` 此时应该能看到生成的目标语言绑定以及更新后的环境变量设置。 #### 配置 `ros1_bridge` 进行动态映射 为了让 `ros1_bridge` 正确识别新增加的消息类型,需重启动态桥梁服务端并传入额外参数指明待同步的话题列表及其对应的数据格式: ```bash ros2 run ros1_bridge dynamic_bridge __params:='{"ros__parameters": {"topics": [{"topic_1": "/chatter", "type_1": "std_msgs/msg/String"}, {"topic_2": "/my_custom_topic", "type_2": "custom_messages/action/CustomAction"}], "services": [], "actions": []}}' ``` 注意这里替换实际存在的主题名称 `/my_custom_topic` 及其关联的动作消息路径 `"custom_messages/action/CustomAction"` 给定值。 通过以上步骤可以成功建立带有自定义消息的支持机制,使得不同版本之间的ROS节点能够无缝协作交流复杂的信息流[^1][^2].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值