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的轮子(为什么?折磨自己呗!),奈何自己水平有点差,拖到现在才算写完底层的大数运算.在实现欧几里得算法的时候,我开始 ...
随机推荐
- createRange表示文档中的一个范围——用于js判断文字添加省略号情况
document.createRange() 是 JavaScript 中的一个方法,用于创建一个 Range 对象,表示文档中的一个范围.Range 对象通常用于选择文档中的一部分内容,然后对其进行 ...
- 程序编译流程与 GCC 编译器
目录 文章目录 目录 GUN 计划 GCC 编译器 Clang 和 LLVM GCC 的常用指令选项 GCC 所遵循的部分约定规则 GCC 的编译流程 GCC 的编译流程示例 编译多个文件 GUN 计 ...
- 京东面试:SpringBoot同时可以处理多少请求?
Spring Boot 作为 Java 开发中必备的框架,它为开发者提供了高效且易用的开发工具,所以和它相关的面试题自然也很重要,咱们今天就来看这道经典的面试题:SpringBoot同时可以处理多少个 ...
- ShardingJDBC使用不当引发的线上事故
本文讲述一个由 ShardingJDBC 使用不当引起的悲惨故事. 一. 问题重现 有一天运营反馈我们部分订单状态和第三方订单状态无法同步. 根据现象找到了不能同步订单状态是因为 order 表的 t ...
- CSS——3D转换
- Android 12(S) MultiMedia Learning(六)NuPlayer Decoder
接下来将会从4个角度来记录NuPlayerDecoder部分 相关代码路径: http://aospxref.com/android-12.0.0_r3/xref/frameworks/av/medi ...
- 微信小程序预约视频号直播
一.概述 微信小程序提供了可以唤起预约视频号直播弹窗的接口 reserveChannelsLive,该接口接收一个参数 noticeId,通过 getChannelsLiveNoticeInfo 接口 ...
- NOIP模拟63
T1 电压机制 解题思路 先找出这个图的一个生成树,然后没有称为树边的边就都是返祖边了. 对于一个边是合法的当且仅当它属于所有的奇数环并且不属于任何一个偶数环. 可以利用树上差分进行修改,更改一个返祖 ...
- js 表格的添加和删除操作
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国 ...
- windows报错
如果说你dns没有权威的话1.先去long.com上面右键属性把"区域传送给所有服务器打勾"2.右键属性,在名称分析器中,输入要添加为辅助dns的服务器的ip显示解析成功就可以了