参考于ROS Wiki🐺
在 src 文件夹里面新建功能包
roscatkin_creat_package roscpp rospy std_msgs geometry_msgs
编写测试 Demo 测试发布者和订阅者的消息连接【hpp,cpp】
- msg 消息类型(新建文件夹 msg 内新建文件 turtle.msg)控制 turtle 的,其中 RoboMode 只是为声明名称,可以自己定义
string name
int32 RoboMode
string tail
头文件
- 类头文件
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include "study_one/serial_rp.h"
#include <std_srvs/Trigger.h>
#include "std_msgs/String.h"
class TurtleCt
{
private:
/* data */
public:
explicit TurtleCt();
~TurtleCt();
public:
// 必须含有节点的 msg 对象指针
void InfoCallBack(const study_one::serial_rp::ConstPtr& serial_msg); // 订阅者的回调函数
void InforPub(); // 发布函数
private:
ros::NodeHandle nd_turtle_pub; // 发布者者 nodehandle
ros::NodeHandle nd_turtle_sub; // 订阅者 nodehandle
ros::Subscriber turtle_vel_sub; // 订阅者对象订阅
ros::Publisher turtle_vel_pub; // 发布者对象订阅
geometry_msgs::Twist vel_msg; // turtle message test
private:
int move_store{0}; // 订阅者消息存储变量
};
- 发布者函数编写
void TurtleCt::InforPub()
{
ros::Rate rate(1);
study_one::serial_rp robo_rp; // 定义 msg 消息对象
robo_rp.RoboMode = 0x02; // 变量赋值
while (ros::ok())
{
turtle_vel_pub.publish(robo_rp);
ROS_INFO("RoboMode:%d",robo_rp.RoboMode);
ros::spinOnce();
rate.sleep();
}
}
源文件
- 回调函数
void TurtleCt::InfoCallBack(const study_one::serial_rp::ConstPtr& serial_msg)
{
move_store += serial_msg->RoboMode;
ROS_INFO("the sub RoboMode:{%d}\n",move_store);
}
- 初始化构造函数
TurtleCt::TurtleCt(){
ROS_INFO("TurtleCt\n");
turtle_vel_pub = nd_turtle_pub.advertise<study_one::serial_rp>("serial_info",10);
turtle_vel_sub = nd_turtle_pub.subscribe<study_one::serial_rp>("serial_info",10,&TurtleCt::InfoCallBack,this);
}
- rosrun 运行 node 节点就可以看到发布消息和订阅消息
- 运行 Plojuggler 查看 turtle 的位置姿态的曲线图
Plotjuggler 运行之后可以点击开始接受 master 上的节点名称,并且将获取到的消息例如 turtle1 节点 msg 内容使用坐标图显示出来
🌸🌸🌸完结撒花🌸🌸🌸
🌈🌈@FAE🌈🌈