首页 > 其他分享 >【ROS参数详解】——ros应用中的常见的ros语法参数详解

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

时间:2024-05-31 18:58:08浏览次数:28  
标签:nh ros 详解 参数 pcl ROS spinOnce

文章目录


前言

在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

相关文章

  • ICDE’24|中国企业首获最佳论文,详解PolarDB Serverless如何在0.5秒内实现跨机迁移
    以下文章来源于阿里云开发者作者陈浩、章颖强引言数据库领域顶会ICDE2024于5月13-17日在荷兰乌特勒支(Utrecht,Netherlands)举办。ICDE(TheInternationalConferenceonDataEngineering) 与VLDB、SIGMOD被公认为是国际数据管理领域三大顶级学术会议,此次在荷兰召开......
  • 一键云部署:资源编排 ROS 轻松部署 LLM 应用开发平台 Dify
    介绍Dify是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(BackendasService)和LLMOps的理念,使开发者可以快速搭建生产级的生成式AI应用。即使你是非技术人员,也能参与到AI应用的定义和数据运营过程中。资源编排服务(ResourceOrchestrationService,ROS)......
  • 一键云部署:资源编排 ROS 轻松部署 LLM 应用开发平台 Dify
    介绍Dify是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(BackendasService)和LLMOps的理念,使开发者可以快速搭建生产级的生成式AI应用。即使你是非技术人员,也能参与到AI应用的定义和数据运营过程中。资源编排服务(ResourceOrchestrationService,ROS)是阿里......
  • Shell阶段07 退出循环指令(示例:分发主机公钥), 函数应用(参数传参)
    退出循环的语句#1.exit退出循环,退出脚本#2.break结束当前循环,或者跳出本地循环,继续执行循环外面的命令#3.continue忽略本次循环剩余的代码,直接执行下一次循环#4.案例先扫描内网网段的所有主机,存活的主机进行发放本机的公钥1.本机是否要有公钥,创建密钥对rm2.......
  • 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注
    为什么会突然想到写这么一个大杂烩的博文呢,必须要从笔者几年前的一次面试说起当时的我年轻气盛,在简历上放了自己的博客地址,而面试官应该是翻了我的博客,好几道面试题都是围绕着我的博文来提问其中一个问题,直接使得空气静止了五分钟,然后面试官结束了这次面试,那就是:如何手写一个简......
  • k8s--service详解
    1:service详解1、每次访问pod的时候,ip地址都不是固定的2、service有一个虚拟ip和端口,可以使用这个来进行访问3、kube-proxy,apiserver将service的信息存入到etcd中,kube-proxy将其转换为一个访问规则,这个就是本质4、表象,就是标签,本质就是规则,通过标签,来进行要管理哪些pod,5......
  • 函数的参数与返回值
    //必选参数letsum=function(a,b){returna+b;}console.log(sum());//可选参数sum=function(a=1,b=2){returna+b;}console.log(sum());现在计算五个参数相加//常规方法sum=function(a,b,c,d,e){......
  • springboot aop 通过参数名称来修改 get请求值
    引入aopimplementation'org.springframework.boot:spring-boot-starter-aop'代码实现`packagecom.photo.photoking.interceptor;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Asp......
  • Vue3-路由详解
    文章目录路由对路由的理解安装VueRouter基本切换效果两个注意点路由器工作模式to的两种写法命名路由嵌套路由路由传参query参数params参数路由的props配置replace属性编程式导航重定向更多相关内容可查看路由附git地址:https://gitee.com/its-a-little-bad/vue......
  • Nginx企业级负载均衡:技术详解系列(15)—— 一篇文章教你如何自定义错误日志
    你好,我是赵兴晨,97年文科程序员。在今天的文章中,我将带你深入了解Nginx的一个强大功能——自定义错误日志。无论是对于运维人员还是开发者,掌握这一技能都是提升工作效率、优化系统监控的关键。主要是能装13。图片自定义错误日志在Nginx中,自定义错误日志的设置可以让你更......