文章目录
前言
在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语法参数的作用和使用方法的介绍。
标签:nh,ros,详解,参数,pcl,ROS,spinOnce From: https://blog.csdn.net/2401_82458959/article/details/139040718