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
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++的语法还远远不够。



