栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

我的linux与ROS的不眠不休:从入门到入土(五)——topic机制学习遇到的一些函数与变量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我的linux与ROS的不眠不休:从入门到入土(五)——topic机制学习遇到的一些函数与变量

一、回顾

1、网页下载的VScode的插件支持更多一些,当有一些小插件不能使用的时候,有可能是应用商店的VScode不支持。

2、VScode不自动补全代码的时候,打开文件c_cpp_properties.json,将C++14改成C++17

3、VScode默认使用C/C++编译,更换CMake方式,按下ctrl+shift+B,即可看见CMake编译选项,前提是安装了CMake tools工具包。

二、代码遇到的新成员和一些奇怪的写法 1、std_msgs

本次topic话题服务中添加了全新的依赖包std_msgs。

std_msgs是一种ROS中专用的通讯消息类型,作为一个封装好的库,它几乎包含了所有的数据类型,使用的时候,在cpp文件开始时加入

那么,这个库究竟支持多少中数据类型呢?在roscore环境下,终端输入命令如下命令:

rosmsg list

可以看到专属与std_msg命名空间(std_msg开头的)下的数据类型有许许多多

        同时还能看到,ROS提供的数据类型也不仅仅是std_msgs,还有tf2_msgs,stero_msgs等等。

        此外,每一个数据类型下的数据变量门,又有独特的用法。他们是被封装好的一个个类。

例如std_msgs::String 字符串消息类型,他的用法则是 对他的属性data赋值

       如 std_msgs::String msg;

            msg.data =" [s] ";

       也就是说,std_msgs下的消息类们,都用独特的用法,作为一个类,有属性,有行为,那,当使用其他std_msgs的消息类型的时候,如何查看他们的用法呢?

        可在终端输入

rosmsg show std_msgs/消息类型查看

例如:

如此,可以查看他们需要赋值的属性以及属性的数据类型了。

2、ros::init()

         ros::init(argc,argv," 节点名称")用于为这个cpp文件建立一个节点名称,

通过参数3,用户可以自定义节点的名称。而参数二和一,则是固定的写法。由于init函数存在函数重载,因此这三个参数缺一不可。初学时,记住只需要定制参数三,其他都是模板即可。有能力可以查查前两个参数的效果。

3、ros::NodeHandle

        节点句柄创建。节点句柄则控制节点的行为,可以理解为节点的代行者,节点句柄可以不止一个,当节点消失时,句柄也将跟着消失。

        例如在topic中,节点希望发布话题,则通过节点句柄的 (类) 行为代行,那,通过节点句柄能够控制节点的多少行为呢?

       NodeHandle::advertisehttp://docs.ros.org/jade/api/roscpp/html/classros_1_1NodeHandle.html#a6b655c04f32c4c967d49799ff9312ac6     发布

        NodeHandle::subscribehttp://docs.ros.org/jade/api/roscpp/html/classros_1_1NodeHandle.html#a317fe4c05919e0bf3fb5162ccb2f7c28   订阅

        NodeHandle::serviceClienhttp://docs.ros.org/jade/api/roscpp/html/classros_1_1NodeHandle.html#aa3376eeca609c4985255cecfaadcbcc5  请求

NodeHandle::advertiseServicehttp://docs.ros.org/jade/api/roscpp/html/classros_1_1NodeHandle.html#a0262cf4028324bbcd896b6909ab867ae

服务

        这四位成员函数,控制着节点的发布、订阅、请求、服务行为。

        其行为本质都是函数,并且是存在返回值的。

其实,行为还有更多的参数,目前学习就暂时学习前两个。

4、句柄行为的返回值类型

        topic测试中,句柄行为 advertise的返回值类型为一个完全没有见过的数据类型

        ros::Publisherhttp://docs.ros.org/jade/api/roscpp/html/classros_1_1Publisher.html本次使用的Publiser的publish行为将数据发布到节点创建的话题上。通过查阅资料,可知NodeHanldle为这些类的友元类。

因此二者的大致用法为:

 返回值类型 返回值变量  = 节点变量. 发布/服务行为<传递类型>(“话题/服务名”,队列大小)

返回值类型 返回值变量  = 节点变量. 订阅/请求行为<传递类型>(“话题/服务名”,队列大小,回调函数)

5、关于回调函数参数为什么那么复杂。

const std_msgs::String::ConstPtr & msg

一个参数又臭又长

       ROS中的回调参数返回的是参数的地址指针,因此指向发布者发布消息的第一个字符的首地址,要完整的获取到这个首地址,C++中存在string库中的一些函数能够做到,c_str().

c_str()的原型是:const char*c_str() const,由于这个参数用在程序中,导致了使用这个函数的参数必须和这个函数的类型对应。

        那结尾的ConstPtr真么来的?

        官方说法:

When messages are automatically generated into C++ code, there are several typedefs defined. One of them is ::Ptr, which is typedef-ed to be a boost::shared_ptr, and another is ::ConstPtr which is boost::shared_ptr.

By passing a const pointer into the callback, we avoid doing a copy. While this might not make much difference for std_msgs::String, it can make a huge difference for sensor_msgs::PointCloud2.

ConstPtr,c_str()都是C++,boost中的知识,如今自知学会C++的语法还远远不够。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/977003.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号