ROS自学笔记12--topic_demo实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16481211/article/details/82190887

topic_demo
功能描述:两个node,一个发布模拟的GPS消息(格式为自定义,包括坐标和工作状态),另一个接收并处理该信息(计算到原点的距离)。
处理步骤:
1、package源代码

$cd ~/catkin_ws/src
$catkin_creat_pkg topic_demo roscpp rospy std_msg

2、定义好msg

$cd topic_demo/
$mkdir msg
$cd msg
$vi gps.msg

gps.msg

float32 x
float32 y
string state

编译完成会生成一个 ~/catkin_ws/devel/include/topic_demo/gps.h

3、talker.cpp

#include<ros/ros.h>
#include<topic_demo/gps.h>
int main(int argc,char **argv)
{
    ros::init(argc,argv,"talker"); //解析参数,命名节点
    ros::NodeHandle nh;//创建句柄,实例化node
    topic_demo::gps msg;//创建gps消息
    msg.x = 1.0;
    msg.y = 1.0;
    msg.state = "working";
    ros::Publisher pub = nh.advertise<topic_demo::gps>("gps_info",1);//创建publisher
    ros::Rate_loop_rate(1.0);//定义循环发布的频率
    while(ros::ok())
    {
        mag.x = 1.03 * msg.x;
        msg.y = 1.01 * mag.y;
        ROS_INFO("Takler:GPS:x = %d,y = %d",msg.x,msg.y);//输出当前的msg
        pub.publish(msg);
        loop_ratesleep();//根据定义的发布频率,sleep
    }
    return 0;
}

4、listener.cpp
接收和处理消息

#include<ros/ros.h>

void gspCallback(const topic_demo::gps::ConstPtr &msg)
{
    std_msgs::Float32 distance;ros自带的类型
    distance.data = sqrt(pow(msg->x,2),pow(msg->y,2));
    ROS_INFO("Listener:Distance to orign = %f,state = %s",distance.data,msg->state.c_str()); 
}

int main(int argc,char** argv)
{
    ros::init(argc,argv,"listener");//为当前这个节点命名
    ros::NodeHandler n;
    ros::Subscriber sub = n.subscribe("gps_info",1,gpsCallback);//创建subscribes topic名称:gps_info 消息队列=1 回调函数:gpsCallback回调处理函数
    ros::spin();//反复调用当前可触发的回调函数,阻塞
    return 0;
}

5、修改CMakeLists.txt&package.xml,告诉编译系统去编译这些文件

下图是要修改的CMakeLists,黑色是自动生成的,红色是默认的。生成两个可执行文件,添加依赖和链接。
这里写图片描述
在package.xml中添加运行时所需依赖。
这里写图片描述

6、上述文件完成后执行catkin_make,然后运行相应的可执行程序即可。

猜你喜欢

转载自blog.csdn.net/qq_16481211/article/details/82190887