首页 > 编程语言 >ROS话题通信C++(附launch启动方式)

ROS话题通信C++(附launch启动方式)

时间:2023-03-17 13:33:34浏览次数:43  
标签:std src ROS launch C++ topic ros

ROS话题通信C++(附launch启动方式)

创建工作空间

mkdir -p topic_ws/src
cd topic_ws
catkin_make

设置环境变量

source ./devel/setup.bash
source $ROS_PACKAGE_PATH

效果图

未使用launch

使用launch

结构总览

友情提醒

每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误

准备工作

第一步:创建工作空间

配置:roscpp rospy std_msgs

src/topic/CMakeLists.txt

src/topic/src/talker.cpp

// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    //设置编码
    setlocale(LC_ALL,"");

    //2.初始化 ROS 节点:命名(唯一)
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

    //4.实例化 发布者 对象
    //泛型: 发布的消息类型
    //参数1: 要发布到的话题
    //参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;
    std::string msg_front = "Hello 你好!"; //消息前缀
    int count = 0; //消息计数器

    //逻辑(一秒10次)
    ros::Rate r(1);

    //节点
    while (ros::ok())
    {
        //使用 stringstream 拼接字符串与编号
        std::stringstream ss;
        ss << msg_front << count;
        msg.data = ss.str();
        //发布消息
        pub.publish(msg);
        //加入调试,打印发送的消息
        ROS_INFO("发送的消息:%s",msg.data.c_str());

        //根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;
        r.sleep();
        count++;//循环结束前,让 count 自增
        //暂无应用
        ros::spinOnce();
    }


    return 0;
}

src/topic/src/listener.cpp

// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("接收的消息:%s",msg_p->data.c_str());
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"listener");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
    //5.处理订阅的消息(回调函数)

    //6.设置循环调用回调函数
    ros::spin();//循环读取接收的数据,并调用回调函数处理

    return 0;
}

启动指令

1、第一个终端执行 roscore

2、第二个终端进入topic_ws的路径

3、执行 source ./devel/setup.bash

4、执行 rosrun topic talker

5、第三个终端进入topic_ws的路径

6、执行 source ./devel/setup.bash

7、执行 rosrun topic listener

使用launch

src/topic/launch/start_topic.launch

<launch>
    <node pkg="topic" type="talker" name="talker" output="screen"/>
    <node pkg="topic" type="listener" name="listener" output="screen"/>
</launch>

启动指令

1、roscore

2、进入topic_ws的路径

3、source ./devel/setup.bash

4、roslaunch topic start_topic.launch

made by zyl

标签:std,src,ROS,launch,C++,topic,ros
From: https://www.cnblogs.com/zylyehuo/p/17226438.html

相关文章

  • C++中的HashTable性能优化
    C++中的HashTable性能优化-知乎https://zhuanlan.zhihu.com/p/614105687C++中的HashTable性能优化腾讯技术工程​编程话题下的优秀答主​关注 72......
  • c++调用.so库
    参考:https://blog.csdn.net/weixin_45024226/article/details/120156687https://blog.csdn.net/weixin_40437821/article/details/110671132......
  • 点集从上到下,从左到右进行Z字型排序(C++与python实现,自写)
    C++实现:voidPointDisgus(vector<Point>&Points){Pointt;intn=Points.size();inti,j;vector<Point>OutPoints;vector<Point>Points_......
  • hive kerberos
      前提准备:需krb5.conf和keytab文件,hive和kerberos的ip及hostname,hive数据库1、 dockerload-iactions.tar重新加载actions镜像2、 进入/data/datainsight......
  • C++11lambda表达式精讲
    lambda表达式的概念和基本用法lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。lambda表达式的语法形式可简单归纳如下:[capture](params)opt->......
  • Microsoft.NET和Windows应用程序调试 读书笔记
    WhyIsn'tThereaChapteron.NETDebuggers?Youmightbewonderingwhythereisn'tacorrespondingchapterinthisbookonhowMicrosoft.NETdebuggerswork.O......
  • 黑马阶段三 C++篇 02day
    2day1.引用是什么:给变量空间取别名intmain(){inta=0;int&b=a;b=100;cout<<a<<endl;return0;}2.引用的注意使用引用类型可以像指针那样访问只......
  • 68.C++中的const
      编写程序过程中,我们有时不希望改变某个变量的值。此时就可以使用关键字const对变量的类型加以限定。初始化和const  因为const对象一旦创建后其值就不能再改变,所......
  • C/C++ 宏 ##和#和#@
    ##:起到字面拼接的作用#definef(a,b)a##b f(1,2)等价于12,f(str,1)等价于变量str1 #:把字符串加双引号#defineg(a)#ag(str)等价于"str" #@:把字符串加单引号......
  • 【并发编程十七】c++实现一个线程池
     【并发编程十七】c++实现一个线程池一、线程池原理二、实现重点三、个人理解四、实验 简介:大多数系统上,若因某些任务可以与其他任务并行处理,就分别给他们......