ROS话题通信(自定义消息)

项目场景:

编写发布者和订阅者,实现话题通信
需要通信的消息类型定义如下 (Robotvel.msg):
std msgs/Header header
string name
int16 id
geometry_msgs/Twist velocity


实现步骤:

  1. 新建功能包,添加依赖(roscpp rospy std_msgs geometry_msgs),CtrlShiftB编译无误;ROS话题通信(自定义消息)_第1张图片
  2. 新建msg文件夹,编写RobotVel.msg文件;
std_msgs/Header header
string name
int16 id
geometry_msgs/Twist velocity

     3.配置Package;ROS话题通信(自定义消息)_第2张图片


     4.配置CMakeLists;ROS话题通信(自定义消息)_第3张图片

 ROS话题通信(自定义消息)_第4张图片

ROS话题通信(自定义消息)_第5张图片


     5.编译后生成头文件,在c_cpp_properties.json中添加头文件路径; ROS话题通信(自定义消息)_第6张图片


     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("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;ROS话题通信(自定义消息)_第7张图片

 


     9.运行;ROS话题通信(自定义消息)_第8张图片

 完成项目。

你可能感兴趣的:(vscode,机器人)