项目场景:
编写发布者和订阅者,实现话题通信
需要通信的消息类型定义如下 (Robotvel.msg):
std msgs/Header header
string name
int16 id
geometry_msgs/Twist velocity
实现步骤:
- 新建功能包,添加依赖(roscpp rospy std_msgs geometry_msgs),CtrlShiftB编译无误;
- 新建msg文件夹,编写RobotVel.msg文件;
std_msgs/Header header
string name
int16 id
geometry_msgs/Twist velocity
3.配置Package;
4.配置CMakeLists;
5.编译后生成头文件,在c_cpp_properties.json中添加头文件路径;
6.在src下编写发布者RoborVel_pub.cpp文件;
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Header.h"
#include "header_msg_0922/RobotVel.h"
int main(int argc, char *argv[])
{
ros::init(argc, argv, "vel_pub");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<header_msg_0922::RobotVel>("RobotVel",100);
header_msg_0922::RobotVel rv;
ros::Duration(3).sleep();
ros::Rate rate(10);
while (ros::ok())
{
rv.header.seq = 1;
rv.header.frame_id = "earth";
rv.header.stamp = ros::Time::now();
rv.id = 1;
rv.name = "robot";
rv.velocity.angular.x = 0.2;
rv.velocity.angular.y = 0;
rv.velocity.angular.z = 0;
rv.velocity.linear.x = 0;
rv.velocity.linear.y = 0;
rv.velocity.linear.z = 0.3;
pub.publish(rv);
ROS_INFO("Robot's name is %s,frame_id is %s,now : %f",rv.name.c_str(),rv.header.frame_id.c_str(),rv.header.stamp.toSec());
rate.sleep();
ros::spinOnce();
}
return 0;
}
7.在src下编写订阅者RoborVel_sub.cpp文件;
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Header.h"
#include "header_msg_0922/RobotVel.h"
void doVel(const header_msg_0922::RobotVel &rv)
{
ROS_INFO("Getting name:%s,now:%f,angular velocity(%f,%f,%f),linear velocity(%f,%f,%f)",
rv.name.c_str(),rv.header.stamp.toSec(),
rv.velocity.angular.x,rv.velocity.angular.y,rv.velocity.angular.z,
rv.velocity.linear.x,rv.velocity.linear.y,rv.velocity.linear.z);
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "vel_sub");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("RobotVel",100,doVel);
ros::spin();
return 0;
}
8.配置CMakeLists.xml;
9.运行;
完成项目。