ROS学习笔记(六)

目录

前言

 一、发布方实现

1、包含头文件

2、初始化ROS节点

3、创建节点句柄 

4、创建发布者对象

5、编写发布逻辑,发布数据

6、运行结果


前言

主要是实现自定义消息的话题通信,发布方的实现,其实相关流程与前面的没啥区别。

在编程之前,要先对vscode配置以下,主要是为了避免抛出异常,主要的目的就是让vscode知道头文件的位置。将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:

{
  "configurations": [
    {
      "browse": {
        "databaseFilename": "",
        "limitSymbolsToIncludedHeaders": true
      },
      "includePath": [
        "/opt/ros/noetic/include/**",
        "/home/liuxin/liuxin/src/helloworld/include/**",
        "/home/liuxin/DEMON3_WS/src/plumbing_pub_sub/include/**",//新添加的
        "/usr/include/**"
      ],
      "name": "ROS"
    }
  ],
  "version": 4
}

怎么知道他(person.h编译自动生成的)的具体文件呢?

Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。

执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。

 

 一、发布方实现

流程:1、包含头文件

           2、初始化ROS节点

           3、创建节点句柄

           4、创建发布者对象

           5、编写发布逻辑、发布数据


1、包含头文件

 //1.包含头文件;
 #include "ros/ros.h" //必须有的
 #include "plumbing_pub_sub/Person.h" //自定义消息的头文件

2、初始化ROS节点

    setlocale(LC_ALL,"");//防止乱码
//2.初始化 ROS 节点
    ros::init(argc,argv,"BanZhuRen");

3、创建节点句柄 

//3.创建节点句柄
    ros::NodeHandle nh;

4、创建发布者对象

//4.创建发布者对象
    ros::Publisher pub = nh.advertise<plumbing_pub_sub::Person>("liaotian",10);
    plumbing_pub_sub::Person person;

5、编写发布逻辑,发布数据

//5.编写发布逻辑,发布数据
    //先创建发布的消息
    person.name = "张三";
    person.age = 1;
    person.height = 1.73;
    //发布的频率
    ros::Rate rate(1);
    //编写循环,循环中发布消息,这个循环相当于对消息的一个处理。
    while (ros::ok())
    {   person.age +=1; //person.age = person.age+1 其实和++没区别,但是换成2就有区别了
        pub.publish(person); //发布这个消息,消息包含name,age,height三个消息
        rate.sleep();
        ros::spinOnce();
    }
    
    return 0;
}

逐行解析

    //先创建发布的消息
    person.name = "张三";
    person.age = 1;
    person.height = 1.73;

类似于自定义消息的各个属性的初始值 

    //发布的频率
    ros::Rate rate(1);

发布的频率

while (ros::ok())
    {   person.age +=1; //person.age = person.age+1 其实和++没区别,但是换成2就有区别了
        pub.publish(person); //发布这个消息,消息包含name,age,height三个消息
        rate.sleep();
        ros::spinOnce();
    }
    
    return 0;
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

消息的处理,节点不死,循环不结束。这个消息的处理只是处理了age。ros::spinOnce() 后者在调用后还可以继续执行之后的程序。

总的程序如下:

/*
  发布方实现
     1.包含头文件;
     2.初始化 ROS 节点
     3.创建节点句柄
     4.创建发布者对象
     5.编写发布逻辑,发布数据
*/

 //1.包含头文件;
 #include "ros/ros.h" //必须有的
 #include "plumbing_pub_sub/Person.h" //自定义消息的头文件

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");//防止乱码
//2.初始化 ROS 节点
    ros::init(argc,argv,"BanZhuRen");

//3.创建节点句柄
    ros::NodeHandle nh;

//4.创建发布者对象
    ros::Publisher pub = nh.advertise<plumbing_pub_sub::Person>("liaotian",10);
    plumbing_pub_sub::Person person;

//5.编写发布逻辑,发布数据
    //先创建发布的消息
    person.name = "张三";
    person.age = 1;
    person.height = 1.73;
    //发布的频率
    ros::Rate rate(1);
    //编写循环,循环中发布消息,这个循环相当于对消息的一个处理。
    while (ros::ok())
    {   person.age +=1; //person.age = person.age+1 其实和++没区别,但是换成2就有区别了
        pub.publish(person); //发布这个消息,消息包含name,age,height三个消息
        rate.sleep();
        ros::spinOnce();
    }
    
    return 0;
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

6、运行结果

这里涉及了一个函数rostopic。 

  • rostpic echo 指定话题

    获取指定话题当前发布的消息

特别注意

系统内置的msg可以直接用这个语句,因为系统可以自动找到他的一些依赖文件,比如头文件一类的。

但是我们自定义的msg,系统是没办法直接找到的,所以我们需要先进入功能包然后 source以下再运行这个指令。cd  功能包名

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lbuera

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值