ROS学习——(三)ROS的通信机制(上)

下面介绍ros中最重要的组成部分——通信。ros的通信将各个孤立的节点联系在一起,进行相应的数据传输和交流,可以说是ros运行的核心。

文章目录

  • 概述
  • 话题通信
    • 实现过程
      • 角色
      • 流程
      • 注意
      • 应用
    • 发布者创建
      • 示例:
    • 订阅方实现
      • 示例
      • ros的消息类型
        • 1. 标准消息(std_msgs)
        • 2. 几何消息(geometry_msgs)
        • 3. 传感器消息(sensor_msgs)
        • 4. 导航消息(nav_msgs)
        • 5. 行为消息(actionlib_msgs)
        • 6. 可视化消息(visualization_msgs)
        • 7. 诊断消息(diagnostic_msgs)
        • 8. 其它常见消息包
    • 自定义消息类型
    • 1.创建 msg 文件及文件夹
    • 2.更改配置文件
    • 3.编译

概述

四种核心通信方式:

  1. Topic(话题 / 发布-订阅)

    • 模式:基于发布-订阅(Publish-Subscribe),一对多、多对多均可。
    • 用法
      • 节点 A 发布(Publish)某个话题,例如 /scan,消息类型是 sensor_msgs/LaserScan
      • 节点 B、C 等可以订阅(Subscribe)此话题,异步接收消息。
    • 特点:适合 连续数据流(如传感器数据、状态信息),节点间松耦合,无需知道对方具体是谁。
  2. Service(服务 / 客户端-服务端)

    • 模式:基于请求-响应(Request-Response),一对一。
    • 用法
      • 一个节点提供(advertise)服务,如 add_two_ints
      • 另一个节点作为客户端调用(call)此服务,发送请求并等待响应。
    • 特点:适合 短时、同步 的指令或计算请求(比如执行某一次性动作、返回一次性结果)。
  3. Action(动作 / 异步带反馈)

    • 模式:基于异步请求-反馈,可以在执行过程中持续发送进度,并可进行取消操作。
    • 用法
      • 一个节点提供 Action 服务(Action Server),支持目标命令、取消命令、周期性反馈和最终结果。
      • 客户端(Action Client)发送目标任务,如“导航到坐标 (x, y)”,并可实时获取执行进度,必要时可取消。
    • 特点:适合 长时任务(如移动、抓取)且需周期性反馈、可中断。
  4. Parameter Server(参数服务器)

    • 模式:集中式的键值数据库,存储在 roscore(Master)端。
    • 用法
      • 使用 rosparam set/get 或在节点中通过 C++/Python API(nh.setParam(), nh.getParam())读写参数。
    • 特点:适合在系统中 共享全局配置,如算法参数、阈值、校正系数等。

话题通信

实现过程

角色

  1. master
  2. talker
  3. listener

流程

  1. talker 提供信息—>话题+手机号(RPC)
  2. listener 提供信息—>话题
  3. master 把 talker 的信息提供给 listener
  4. listener 打电话给 talker
  5. talker 响应,给微信号(TCP)
  6. listener 加了微信
  7. talker 发消息

注意

  1. 使用的协议:RPC(0-4) 和 TCP(5-6)[[RPC和TCP]]
  2. 0 和 1 没有顺序关系
  3. talker 和 listener 可以存在多个
  4. 加了微信之后 master 就没用了
  5. 流程已经封装好了

应用

  1. 话题设置
  2. 发布者实现[[发布者创建]]
  3. 订阅者实现
  4. 消息载体

ROS学习——(三)ROS的通信机制(上)_第1张图片

发布者创建

示例:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include 
 
int main(int argc, char *argv[])
{   
    //2.初始化 ROS 节点
    ros::init(argc,argv,"ljy");
    //3.创建节点句柄
    ros::NodeHandle nh;
    // 4.创建发布者对象
    ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);
    // 5.编写发布逻辑并发布数据
 
    //先创建被发布的消息   
    std_msgs::String msg;
    ros::Rate rate(10);
    int count =0;
    ros::Duration(3).sleep();//延迟发送,给发布者时间去rosmaster中注册
    //编写循环,循环中发布数据
    while(ros::ok())
    {
        count++;
        //创建字符串流
        std::stringstream ss;
        //输入字符串流中
        ss <<"chill"<<count;
        //字符串流整合成字符串给消息赋值
        msg.data = ss.str();
        //发布消息
        pub.publish(msg);
        //打印日志
        ROS_INFO("%s",ss.str().c_str());
        //发布速度
        rate.sleep();
    }

    return 0;
}

订阅方实现

示例

'#include "ros/ros.h"
'#include "std_msgs/String.h"
'#include <sstream>
 
void domsg(const std_msgs::String::ConstPtr &msg)//接收 msg 这个对象,并以引用的方式接收
{
    ROS_INFO("rjy_%s",msg->data.c_str());//获取 msg 中的 data 成员,并转换成 C 风格字符串
}

int main(int argc, char *argv[])
{   
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点
    ros::init(argc,argv,"rjy");
    //3.创建节点句柄
    ros::NodeHandle nh;
    // 4.创建发布者对象
    ros::Subscriber pub = nh.subscribe("fang",10,domsg);
    // 5.编写发布逻辑并发布数据
 
    ros::spin();//回头,循环上一行代码
    return 0;
}

ros的消息类型

1. 标准消息(std_msgs)

std_msgs 提供了一些最基础的数据类型,通常用来表示数值、布尔量、字符串等简单数据结构。常见的消息包括:

  • Bool:布尔类型(true/false)。
  • Int8/Int16/Int32/Int64,以及对应的无符号类型 UInt8/UInt16/UInt32/UInt64:不同位宽的整型。
  • Float32/Float64:浮点数类型。
  • String:字符串。
  • Header:常被用于其他消息内,包含时间戳和坐标系 frame_id 等信息。

2. 几何消息(geometry_msgs)

geometry_msgs 用于描述几何相关信息,如坐标、姿态、向量等。常见消息包括:

  • Point:描述一个点的三维坐标 (x, y, z)。
  • Quaternion:四元数形式的姿态 (x, y, z, w)。
  • Vector3:三维向量 (x, y, z)。
  • Pose:包含位置 (Point) 和姿态 (Quaternion)。
  • Twist:包含线速度 (Vector3) 和角速度 (Vector3)。
  • PoseStampedTwistStamped 等:在 Pose、Twist 的基础上增加了消息头 (Header)。

3. 传感器消息(sensor_msgs)

sensor_msgs 针对常见传感器数据做了统一的消息定义,如激光雷达、摄像头、IMU 等。常见消息包括:

  • Image:图像数据(包含像素格式、分辨率等元数据)。
  • CameraInfo:摄像头的标定信息(内参矩阵、畸变系数等)。
  • LaserScan:二维激光扫描数据(激光角度范围、测距数组等)。
  • PointCloud/PointCloud2:点云数据。
  • Imu:惯性测量单元数据(线加速度、角速度、姿态等)。
  • JointState:机器人关节状态(关节名称、位置、速度、力矩等)。

4. 导航消息(nav_msgs)

nav_msgs 包含机器人导航和定位所需要的常见数据结构。主要包括:

  • Odometry:里程计信息(Pose、Twist 等,用于描述机器人位姿与速度)。
  • Path:一系列位姿(PoseStamped)组成的路径。
  • MapMetaData:地图的元数据(分辨率、尺寸等)。
  • OccupancyGrid:占据栅格地图,用于描述环境中的占用情况。

5. 行为消息(actionlib_msgs)

actionlib_msgs 与 ROS 的 ActionLib(动作库)相关,定义了一些动作交互需要使用的消息类型,如 Goal、Feedback、Result 等,用于实现节点间的异步任务处理。


6. 可视化消息(visualization_msgs)

visualization_msgs 提供了在 RViz 等可视化工具中进行可视化标记(marker)所用的消息类型,比如:

  • Marker:可绘制的可视化标记,如箭头、立方体、文本等。
  • MarkerArray:包含多个标记。

7. 诊断消息(diagnostic_msgs)

diagnostic_msgs 用于向调试工具(如 rqt_console)发送系统状态和诊断信息,比如错误、警告、正常状态等。


8. 其它常见消息包
  • trajectory_msgs:机器人关节或运动轨迹相关(JointTrajectory、JointTrajectoryPoint 等)。
  • control_msgs:常用于机器人手臂或关节控制(跟 actionlib 结合)。
  • shape_msgs:用于描述几何形状,如网格(Mesh)、立方体、球等。
  • tf2_msgs:用于坐标变换系统 (tf) 的消息类型。

自定义消息类型

1.创建 msg 文件及文件夹

内容:

string name
int32 age
float32 height

2.更改配置文件

  • package.xml

添加:

<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>
  • CMakeLists.txt

更改:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
## Generate messages in the 'msg' folder
add_message_files(
  FILES
  person.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)
#编译时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES topic
 CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#运行时依赖

3.编译

在devel 中生成.h 文件

你可能感兴趣的:(学习,c++,python,linux,ubuntu)