下面介绍ros中最重要的组成部分——通信。ros的通信将各个孤立的节点联系在一起,进行相应的数据传输和交流,可以说是ros运行的核心。
四种核心通信方式:
Topic(话题 / 发布-订阅)
/scan
,消息类型是 sensor_msgs/LaserScan
。Service(服务 / 客户端-服务端)
add_two_ints
;Action(动作 / 异步带反馈)
Parameter Server(参数服务器)
roscore
(Master)端。rosparam set/get
或在节点中通过 C++/Python API(nh.setParam()
, nh.getParam()
)读写参数。#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;
}
std_msgs
提供了一些最基础的数据类型,通常用来表示数值、布尔量、字符串等简单数据结构。常见的消息包括:
geometry_msgs
用于描述几何相关信息,如坐标、姿态、向量等。常见消息包括:
sensor_msgs
针对常见传感器数据做了统一的消息定义,如激光雷达、摄像头、IMU 等。常见消息包括:
nav_msgs
包含机器人导航和定位所需要的常见数据结构。主要包括:
actionlib_msgs
与 ROS 的 ActionLib(动作库)相关,定义了一些动作交互需要使用的消息类型,如 Goal、Feedback、Result 等,用于实现节点间的异步任务处理。
visualization_msgs
提供了在 RViz 等可视化工具中进行可视化标记(marker)所用的消息类型,比如:
diagnostic_msgs
用于向调试工具(如 rqt_console)发送系统状态和诊断信息,比如错误、警告、正常状态等。
内容:
string name
int32 age
float32 height
添加:
<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>
更改:
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
#运行时依赖
在devel 中生成.h 文件