ROS2开发BUG记录:在将 use_sim_timer 置为 true 时,节点的 Timer_Callback 行为“异常”
问题:
在将 use_sim_timer
置为 true
时,节点 Timer_Callback 行为 “异常” 。在回调函数中,使用 self.get_logger().info("xxxx")
输出信息,希望通过查看 Info 中的时间戳(如下),测试 Timer_Callback 回调频率是否正常。发现该时间戳与预期回调频率不符。
[target_server-7] [INFO] [1720427228.138427518] [target_server]: timer callback
[target_server-7] [INFO] [1720427228.278225224] [target_server]: timer callback
[target_server-7] [INFO] [1720427228.537763996] [target_server]: timer callback
[target_server-7] [INFO] [1720427228.661480401] [target_server]: timer callback
解决:
debug的方式有错。即使将
use_sim_timer
置为true
, Info 中的时间戳依旧与现实时间同步。这意味着如果要通过 Info 时间戳估计回调函数的调用频率,需要根据仿真时间因子进行换算。换算方式。查看运行中的Gazebo的参数
real_time_factor
,确定仿真时间与现实时间的比率。举一个简单的例子:当回调函数的频率设置为 5Hz 时,Gazebo参数real_time_factor
为 0.8,则Info时间戳下的频率应该为 5 * 0.8 = 4 Hz 。所以当受限于电脑性能,Gazebo参数real_time_factor
不稳定时,Info时间戳也将会变得不稳定。当然,如果早知道 Info 时间戳不会随之改变,我们也可以直接读取时钟,将其放入Info中检查回调频率,这种方式免去了换算的必要 : ) 例如:
self.get_logger().info("timer callback at " + str(self.get_clock().now().to_msg()))
一些在Debug中额外的发现:
当将 use_sim_timer
置为 true
后,ROS将通过话题 /clock
获取当前时间。我们可以通过修改仿真速率或是话题的发布频率来设置ROS收到的时间的分辨率,以此保证ROS的timer callback的行为符合预期。
举一个例子:如果在ROS中存在一个 20Hz 的 timer callback,则时间分辨率要至少为 0.05s。如果仿真时间分辨率小于 0.05s,则在仿真时间的 1s 内,该callback的回调次数将小于20次。
设置时间分辨率的方法:假设仿真速率,也就是 Gazebo参数 real_time_factor
为 0.1,话题 \clock
的发布频率为 0.1,则预期的时间分辨率为 0.01s。但是时间分辨率需要大于Gazebo的运算步长 max_step_size
,当时间分辨率小于该步长时,经测试话题 \clock
的发布频率将会自适应的减小,只有计算完一步后才会向 /clock
发布最新时间。
调整 Gazebo参数 real_time_factor
的方法:
在Gazebo的
world.model
的文件中,设置仿真运行速率real_time_update_rate:每秒期望迭代次数(实际受到计算资源的约束,可能达不到)
max_step_size:迭代时间步长
real_time_factor:与实际时间的比率 (为real_time_update_rate * max_step_size) ,大于1则比实际时间运行的快
调整话题 \clock
的发布频率的方法:
- 通过参数文件设置,设置gazebo节点的参数
publish_rate
。 - 参考链接:https://github.com/cpslabor-education/robotwiki/wiki/[Simulation][Gazebo]-Gazebo-simulation-in-ROS-2
ROS2开发BUG记录:在将 use_sim_timer 置为 true 时,节点的 Timer_Callback 行为“异常”的更多相关文章
- 项目开发bug记录
项目开发中遇到了一个问题,类中出现未知属性 ‘ $jacocoData ’,准确的来说,实际上在集成测试阶段,系统自动运行测试用例时,抛出来的异常提示信息,但是在开发阶段是不存在的.这个问题是以前没有 ...
- 微信小程序bug记录与解决
微信小程序bug记录 textarea textarea在模拟器上没有padding,可是在真机上会自带padding,而且在外部改不了,并且在安卓和IOS上padding还不一样 第一张图是在开发工 ...
- [技术博客]Android 开发 Bug Log
[技术博客] Android 开发 Bug Log 大大小小的bug,聪明的愚蠢的都有, 持续记录中...... java.lang.IllegalArgumentException: The sty ...
- iOS开发之记录用户登录状态
iOS开发之记录用户登录状态 我们知道:CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登陆状态.例如微信 ...
- 开发错误记录8:Unable to instantiate application com
开发错误记录8:Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication 这是因为在And ...
- Arduino单片机使用和开发问题记录(转)
源:Arduino单片机使用和开发问题记录 1.将程序上传到板子时Arduino IDE提示“avrdude: stk500_getsync(): not in sync: resp=0x00” 网上 ...
- IOS开发之记录用户登陆状态,ios开发用户登陆
IOS开发之记录用户登陆状态,ios开发用户登陆 上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreDa ...
- 【bug记录】OS Lab3 踩坑记
OS Lab3 踩坑记 Lab3在之前Lab2的基础上,增加了进程建立.调度和中断异常处理.其中测试包括进程建立以及进程调度部分. 由于是第一次做bug记录,而且是调试完bug后再做的记录,所以导致记 ...
- 在SublimeText3中搭建Verilog开发环境记录(二)
接上文 SublimeText3中搭建Verilog开发环境记录(一) 在实现了基础功能后,继续添加插件,让功能更为完善: 快速创建代码模块(snippet) Ctrl+鼠标左键实现模块跳转 通过iV ...
- BUG 记录:移位运算与扩展欧几里得算法
BUG 记录:移位运算与扩展欧几里得算法 起因 上个月就开始打算用C++写一个ECC的轮子(为什么?折磨自己呗!),奈何自己水平有点差,拖到现在才算写完底层的大数运算.在实现欧几里得算法的时候,我开始 ...
随机推荐
- Android开发环境配置 JDK及SDK
已经搭建过无数次开发环境,今天把搭建环境记录下,下次不用去搜索别人博客,有些博客都是复制粘贴,有些关键信息都缺失了. 1.首先第一步:下载JDK,配置JDK环境变量.JDK可以在Oracle官网下载, ...
- QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台.在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他 ...
- Java 创建/识别条形码
项目刚好需要用到就记录一下 -- 依赖 <!-- 条形码生成 --><dependency> <groupId>net.sf.barcode4j</group ...
- Swift 排查引用循环
------------恢复内容开始------------ 一.最近使用RxSwift在多次信号的嵌套中,发现一个对象始终始终无法释放 开始想通过Memory Graph验证是否没有释放,一直报错, ...
- 深度学习论文翻译解析(二十二):Uniformed Students Student-Teacher Anomaly Detection With Discriminative Latent Embbeddings
论文标题:Uniformed Students Student-Teacher Anomaly Detection With Discriminative Latent Embbeddings 论文作 ...
- 基本定时器TIM6实现精确延时
1.基本定时器的特点 (1).16位自动重装载累加计数器 (2).16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1-65536之间的任意数值 !!!注意基本定时器只有向上计数模式,不要被 ...
- .net formwork WebApi 跨域问题
背景: ASP.NET Formwork Api / ASP.Net Core Api 做比较. 有关 Global.asax.FilterConfig.cs 和 RouteConfig.cs ...
- 新手入门html 表格 表单 超链接 图片
超链接标签 <a></a> A里面的html属性 href="所要跳转到的目标连接" <a href="http:是必须加的"&g ...
- liquibase常用操作
1.概述 Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. 本文旨在将平时工作中常用的一些操作进 ...
- SpringBoot系列(三)元注解
元注解,注解的注解,SpringBoot有四个元注解,分别是@Target.@Retention.@Documented.@Inherited.下面就是对元注解的详细讲解和源码展示. @Taget 该 ...