【ROS参数详解】——ros应用中的常见的ros语法参数详解


前言

在ROS应用中,常见的ROS语法参数包括话题(topic)、服务(service)、参数(parameter)、消息(message)和动作(action)等。话题用于节点之间发布和订阅数据流,通过ros::Publisher和ros::Subscriber接口实现。服务提供一种请求-响应通信机制,使用ros::ServiceServer和ros::ServiceClient来创建和调用服务。参数用于存储和访问全局配置数据,使用rosparam命令或ROS参数服务器进行操作。消息是ROS节点间交换数据的基本单元,通过定义.msg文件来创建自定义消息类型,实现复杂的机器人功能。

1. 关于ros::Rate rate()和rate.sleep()的使用和理解

这两个函数是用来控制发布频率的,控制的是循环的频率,不是消息和服务的发布频率,通过控制循环频率从而可以控制发布频率。Rate的功能是设定一个频率,让循环按照这个频率执行,然后通过睡眠度过一个循环中剩下的时间
例如:

ros::Rate rate(50)       //定义一个频率,中间参数是50hz,相当与0.02秒
rate.sleep()             //休眠

往往ros::Rate rate(50)是写在循环外面的,而rate.sleep()是在循环内的,来控制话题发布的频率。
这个频率是指运行上一次loop.sleep()到下一次loop.sleep()之间保持的时间,通常情况下,代码运行速度比设定的频率要快,所以如果运行到下一次loop.sleep()后未达到0.02s(1/50Hz),则会开始休眠,等到0.02s后再执行下一句程序。

2. ros::spin()、ros::spinOnce():使用细节、区别

俩兄弟学名叫ROS消息回调处理函数。它俩通常会出现在ROS的主循环中,程序需要不断调用ros::spin()ros::spinOnce()。如果你的程序写了相关的消息订阅函数,那么程序在执行过程中,除了主程序以外,ROS还会自动在后台按照你规定的格式,接受订阅的消息,但是所接到的消息并不是立刻就被处理,而是必须要等到ros::spin()ros::spinOnce()执行的时候才被调用,这就是消息回到函数的原理。
区别:
两者区别在于前者调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而后者在调用后还可以继续执行之后的程序。所以,ros::spin()函数一般不会出现在循环中,因为程序执行到spin()后就不调用其他语句了,也就是说该循环没有任何意义,还有就是spin()函数后面一定不能有其他语句(return 0 除外),有也是白搭,不会执行的。ros::spinOnce()的用法相对来说很灵活,但往往需要考虑调用消息的时机,调用频率,以及消息池的大小,这些都要根据现实情况协调好,不然会造成数据丢包或者延迟的错误。
使用:
这里需要特别强调一下,如果大兄弟你的程序写了相关的消息订阅函数,那千万千万千万不要忘了在相应位置加上ros::spin()或者ros::spinOnce()函数,不然你是永远都得不到另一边发出的数据或消息的,血的教训!!!。
ros::spin()函数用起来比较简单,一般都在主程序的最后,对于ros::spinOnce()的使用,虽说比ros::spin()更自由,可以出现在程序的各个部位,但是需要注意的因素也更多:

(1)对于有些传输特别快的消息,尤其需要注意合理控制消息池大小和ros::spinOnce()执行频率; 比如消息送达频率为10Hz, ros::spinOnce()的调用频率为5Hz,那么消息池的大小就一定要大于2,才能保证数据不丢失,无延迟。

(2)ros::spinOnce()用法很灵活,也很广泛,具体情况需要具体分析。但是对于用户自定义的周期性的函数,最好和ros::spinOnce并列执行,不太建议放在回调函数中;

3. 时间戳和浮点格式转换

把时间戳转化成浮点型格式

double time =ros::Time::now().toSec(); 

把浮点型变成时间戳

terrainCloud2.header.stamp = ros::Time().fromSec(time); 

获取当前时间

ros::Time begin=ros::Time::now();      

4. subsribe的参数详解

例如:

ros::Subscriber subOdometry =nh.subscribe<nav_msgs::Odometry>("/state", 5, odometryHandler);

其中
/state :订阅的话题
odometryHandler :消息处理的回调函数
数字“5”是 :消息缓存队列message queue大小 ,一般消息占用的空间越大,这个值要越小

5. ROS中NodeHandle nh与NodeHandle nh(“~“)区别

(1) 句柄NodeHandle nh(“~”)
例如:

ros::init (argc, argv, "ply_load");
ros::NodeHandle nh("~");
ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info);
readParameters(nh);
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);

使用该句柄:则发布话题节点为/ply_load/pcl_output。
话题形式为:节点名字+话题名字。

(2) 句柄NodeHandle nh
例如:

ros::init (argc, argv, "ply_load");
ros::NodeHandle nh;
ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info);
readParameters(nh);
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);

使用该句柄:则发布话题节点为/pcl_output。
话题形式为:话题名字。

6. ros中的param参数服务器说明

ROS提供了参数服务器来满足有些参数需要动态改变(特别是在调试的时候)这一需求。我们可以将参数设置在参数服务器。需要时从launch文件中读取即可。
<param>标签可用于直接设置参数,也可以从文件中读取
<rosparam>标签用于从yaml文件中读取并设置参数,也可以设置多个参数
roslaunch发现和标签后会调用rosparam包来实现设置
例如:
在launch中<!-- setodstacleleftvel参数设置为0.15 -->

 <param name="setodstacleleftvel" type="double" value="0.15" />   

在.cpp文件中的使用
获取参数“setodstacleleftvel”的value,写入到setodstacleleftvel上:

nhPrivate.getParam("setodstacleleftvel", setodstacleleftvel);  

7. PCL的点云数据的各种转换

(1) ROS转PCL数据格式
sensor_msgs::PointCloud2转pcl::PCLPointCloud2
例如:

pcl_conversions::toPCL(sensor_msgs::PointCloud2, pcl::PCLPointCloud2);

sensor_msgs::PointCloud2转pcl::PointCloud<pcl::PointXYZ> ,
例如:

 pcl::fromROSMsg (sensor_msgs::PointCloud2, pcl::PointCloud<pcl::PointXYZ>);

(2) PCL转ROS数据
pcl::PCLPointCloud2转sensor_msgs::PointCloud2
例如

pcl_conversions::fromPCL(pcl::PCLPointCloud2, sensor_msgs::PointCloud2);

pcl::PointCloud<pcl::PointXYZ>转sensor_msgs::PointCloud2
例如

pcl::toROSMsg (pcl::PointCloud<pcl::PointXYZ>,sensor_msgs::PointCloud2);

(3) PCL中数据互转
pcl::PCLPointCloud2转pcl::PointCloud <pcl::PointXYZ>
例如:

pcl::fromPCLPointCloud2(pcl::PCLPointCloud2,pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>转pcl::PCLPointCloud2
例如:

 pcl::toPCLPointCloud2(pcl::PointCloud<pcl::PointXYZ>, pcl::PCLPointCloud2);

总结

以上就是ros应用中的常见的ros语法参数的作用和使用方法的介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啥也不会的研究僧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值