ROS通信

2023-05-16

1.话题通信
话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。
用于不断更新的、少逻辑处理的数据传输场景。
ROS Master (管理者)
Talker (发布者)
Listener (订阅者)
ROS Master 负责保管 Talker 和 Listener 注册的信息,并匹配话题相同的 Talker 与 Listener,帮助 Talker 与 Listener 建立连接,连接建立后,Talker 可以发布消息,且发布的消息会被 Listener 订阅。
上述实现流程中,RPC协议,TCP协议
(发布者)
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc, argv, "pub");//初始化ROS节点,命名唯一
    ros::NodeHandle nh;//实例化ROS句柄
    ros::Publisher pub = nh.advertise<std_msgs::String>("hellotopic", 10);//实例化发布者对象,第3参数为true时保留最后的msg
    std_msgs::String msg;
    ros::Rate rate(5);//5Hz
    int count = 0;
    ROS_INFO("pub start");
    while(ros::ok())
    {
        ++count;
        std::stringstream ss;
        ss << "hello --- " << count;
        msg.data = ss.str();
        pub.publish(msg);//发布消息
        ROS_INFO("pub data: %s", ss.str().c_str());
        rate.sleep();//5Hz, 0.2s
        ros::spinOnce();//处理回调
    }
    ROS_INFO("pub end");
    return 0;
}
(订阅者)
void doMsg(const std_msgs::StringConstPtr &msgptr)//处理订阅消息回调
{
    ROS_INFO("sub data: %s", msgptr->data.c_str());
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc, argv, "sub");//初始化ROS节点,命名唯一
    ros::NodeHandle nh;//实例化ROS句柄
    ros::Subscriber sub = nh.subscribe("hellotopic", 10, doMsg);//实例化订阅者对象
    ros::spin();//处理回调
    return 0;
}
自定义消息类型
功能包下新建 msg 目录,添加文件 Person.msg
package.xml中添加编译依赖与执行依赖
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
CMakeLists.txt编辑 msg 相关配置
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation #需要加入 message_generation,必须有 std_msgs
)
# 配置 msg 源文件
add_message_files(
  FILES
  Person.msg
)
# 生成消息时依赖于 std_msgs
generate_messages(
  DEPENDENCIES
  std_msgs
)
#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listener
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
#配置原文件多加一个
add_dependencies(person_talker ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(person_listener ${PROJECT_NAME}_generate_messages_cpp)

2.服务通信
服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。
用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景。
ROS master(管理者)
Server(服务端)
Client(客户端)
ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接,连接建立后,Client 发送请求信息,Server 返回响应信息。
ROS Master 会根据注册表中的信息匹配Server和 Client,并通过 RPC 向 Client 发送 Server 的 TCP 地址信息。
服务通信中,数据分成两部分,请求与响应,在 srv 文件中请求和响应使用---分割,具体实现如下,功能包下新建 srv 目录,添加 xxx.srv 文件
package.xml中添加编译依赖与执行依赖
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
CMakeLists.txt编辑 srv 相关配置
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
add_service_files(
  FILES
  AddInts.srv
)
generate_messages(
  DEPENDENCIES
  std_msgs
)
#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listener
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
#配置原文件多加一个
add_dependencies(AddInts_Server ${PROJECT_NAME}_gencpp)
add_dependencies(AddInts_Client ${PROJECT_NAME}_gencpp)
(服务端)
bool doaddints(plumb_server_client::addintsRequest &request, 
plumb_server_client::addintsResponse &response)
{
    int num1 = request.num1;
    int num2 = request.num2;
    int sum = num1 + num2;
    response.sum = sum;
    ROS_INFO("请求数据: num1 = %d, num2 = %d", num1, num2);
    ROS_INFO("结果: sum = %d", sum);
    return true;
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    ROS_INFO("sever start");
    ros::init(argc, argv, "sever");
    ros::NodeHandle nh;
    ros::ServiceServer sever = nh.advertiseService("addints", doaddints);
    ros::spin();
    ROS_INFO("sever end");
    return 0;
}
(客户端)
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    ROS_INFO("client start");
    ros::init(argc, argv, "client");
    ros::NodeHandle nh;
    ros::ServiceClient client = nh.serviceClient<plumb_server_client::addints>("addints");
    plumb_server_client::addints ai;
    ai.request.num1 = 100;
    ai.request.num2 = 200;
    bool ret = client.call(ai);
    if(ret)
    {
        ROS_INFO("request success\nsum = %d", ai.response.sum);
    }
    else
    {
        ROS_INFO("request error");
    }
    ROS_INFO("client end");
    return 0;
}
在客户端发送请求前添加:client.waitForExistence();或:ros::service::waitForService("AddInts");这是一个阻塞式函数,只有服务启动成功后才会继续执行

3.参数服务器
参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。
ROS Master (管理者)
Talker (参数设置者)
Listener (参数调用者)
ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。
存储一些多节点共享的数据,类似于全局变量。
注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据
//增(2方案)
    nh.setParam("type", "xiaohuang");
    nh.setParam("radius", 0.15);
    ros::param::set("type_param", "xiaobai");
    ros::param::set("radius_param", 0.15);
//改(2方案)
    nh.setParam("radius", 0.2);
    ros::param::set("radius_param", 0.25);
//查(3方案)
    double radius = nh.param("radius", 0.0);
    bool ret = nh.getParam("radius", radius2);
    bool ret2 = nh.getParamCached("radius", radius3);//(性能上有提升)
//查询键
    nh.getParamNames(names);
    nh.hasParam("radius");
    nh.searchParam("radius", key);
//删除(2方案)
    bool ret = nh.deleteParam("radius");
    bool ret2 = ros::param::del("radius_param");

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS通信 的相关文章

  • qt 编译qgc常见问题

    qt LINK warning LNK4098 默认库 MSVCRT 与其他库的使用冲突 xff1b 请使用 NODEFAU 如果以前没有问题 xff0c 突然出现的这个问题 xff0c 绝大可能是中间编译过程太多造成的 清理项目 重新构建

随机推荐

  • VINS-FUSION-GPU在jetson nx上的实现

    需要安装经过修改的Ubuntu18系统 https span class token operator span span class token comment developer nvidia com zh cn embedded do
  • 主机ping通虚拟机,虚拟机ping通主机解决方法(NAT模式)

    主机ping通虚拟机 xff0c 虚拟机ping通主机解决方法 xff08 NAT模式 xff09 有时候需要用虚拟机和宿主机模拟做数据交互 xff0c ping不通是件很烦人的事 xff0c 本文以net模式解决这一问题 宿主机系统 xf
  • 一个基于Matlab的简单Gui设计

    前几日浩子说要编一个基于Matlab的用户图像界面 xff0c 他用GUIDE搭了一个大概的框架 xff0c 大概要实现数据读入 做图分析 图像清除 关闭界面的功能 xff0c 我用函数形式给改编了一个 xff0c 虽然问题比较简单 xff
  • 关于N步相移中相位噪声仿真分析的一点说明

    在条纹投影的三维测量中 xff0c 有这么一个经典的结论 xff1a 假设光强的噪声为方差为 2 xff0c 那么 xff0c 经过N步标准相移求得的相位的方差为2 2 N B 2 xff08 xff09 xff0c 其中 xff0c B为
  • 如何给MFC对话框添加背景图片

    一 创建项目 文件 新建项目 MFC应用程序 该页面使用 基于对话框 完成即可 注意 取消 使用Unicode库 否则在使用AfxMessageBox会报错 xff0c 没有一个可以转换的参数类型 xff0c 要加AfxMessageBox
  • 如何检测应用程序调用了哪些DLL文件?

    之前所用的检测工具是Dllshow xff0c 后来突然不能用了 xff0c VS以前有Depends xff0c 后来高级版本也没了 最近找到一种简单方便的方法 xff0c 利用windowsx系统自带的功能 运行你想知道的应用程序 xf
  • 网络编程懒人入门(一):快速理解网络通信协议(上篇)

    1 写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统 xff0c 很多时候连基本的网络编程理论 xff08 如网络协议等 xff09 都不了解 xff0c 就贸然定方案 写代码 xff0c 显得非常盲目且充满技术风险 即时
  • Matlab中调用C++dll

    利用mex技术可以实现这个功能 xff0c 但是必须例外写一个接口函数 xff0c 比较麻烦 利用dll调用的方法 xff0c 简单方便 下面就以实现加法函数add 为例 xff0c 来详细介绍具体过程 一 利用VS生成dll文件 利用VS
  • 大小端序与端序转换

    最近在做客户项目的时候 xff0c 遇到了不同厂家的安防相机输出的数据大小端序不一致的情况 xff0c 导致在使用同一种方式处理时 xff0c 出现了错误 虽然问题已经解决 xff0c 还是顺手把大小端序的知识简单梳理一下 1 大端序和小端
  • debian ware source

    deb http ftp cn debian org debian jessie main non free contrib deb http ftp cn debian org debian jessie proposed updates
  • debian中文输入法——拼音和五笔的解决方法

    最近安装Debian操作系统 xff0c 但遇到一个重大的困惑 xff0c 那就是为什么Debian菜单里面有一个Fcitx的选项 xff0c 但是为什么就是无法调出前端来实现输入 xff0c 这是个大问题 xff0c 于是就研究 xff0
  • YOLOv5图像分割中的NMS处理

    在上一篇文章YOLOv5图像分割 SegmentationModel类代码详解有讲到图像经过YOLOv5网络后得到的输出形式 xff0c 主要是调用了BaseModel类下的forward得到的输出 xff0c 输出的shape为 batc
  • YOLO之trt推理+Diou/iou目标跟踪以及计数【附代码】

    本篇文章是对之前YOLOv4 tensorrt推理项目的更新 xff0c 在trt推理 xff0c 多进程语音报警的功能中又新添加了目标跟踪 可用于目标计数 采用IOU进行跟踪 也可以选用DIOU yolov4 43 deepsort可以参
  • yolov5_reid【附代码,行人重识别,可做跨视频人员检测】

    该项目利用yolov5 43 reid实现的行人重识别功能 xff0c 可做跨视频人员检测 应用场景 xff1a 可根据行人的穿着 体貌等特征在视频中进行检索 xff0c 可以把这个人在各个不同摄像头出现时检测出来 可应用于犯罪嫌疑人检索
  • src目录和项目路径的联系

    code src目录里面的东西会被eclipse编译 xff0c 编译完了就放到了 bin目录下 xff0c 而bin目录就是我们项目的classPath code
  • 逆向加固分析

    34 libsecexe so 34 34 梆梆加固免费版 34 34 libsecmain so 34 34 梆梆加固免费版 34 34 libSecShell so 34 34 梆梆加固免费版 34 34 secData0 jar 34
  • android之visibility的三个属性

    android visibility 61 34 34 其有三个属性 xff1a visible显示 xff1b invisible显示黑背景条 xff0c 在这种情况下它会占据空间 xff1b gone不显示 在类中 xff0c 可以设置
  • android中的Application类

    在2011年做的一个iptv项目中就接触了这个Application类 xff0c 虽用起来简单 xff0c 但还是有些需要注意的地方 空闲之余 xff0c 总结如下 xff1a android 系统为每个程序运行时创建一个Applicat
  • android混淆

    首先要说的话 xff1a 本文是对好几个博文的摘录再加上我自己的理解 xff0c 以尊重原创为原则 xff0c 下面贴出相关博文的链接 Android有效地减少方法数 http blog csdn net lihenair article
  • ROS通信

    1 话题通信 话题通信是ROS中使用频率最高的一种通信模式 xff0c 话题通信是基于发布订阅模式的 xff0c 也即 一个节点发布消息 xff0c 另一个节点订阅该消息 用于不断更新的 少逻辑处理的数据传输场景 ROS Master 管理