问题:

在将 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

解决:

  1. debug的方式有错。即使将 use_sim_timer 置为 true , Info 中的时间戳依旧与现实时间同步。这意味着如果要通过 Info 时间戳估计回调函数的调用频率,需要根据仿真时间因子进行换算。

  2. 换算方式。查看运行中的Gazebo的参数 real_time_factor ,确定仿真时间与现实时间的比率。举一个简单的例子:当回调函数的频率设置为 5Hz 时,Gazebo参数 real_time_factor 为 0.8,则Info时间戳下的频率应该为 5 * 0.8 = 4 Hz 。所以当受限于电脑性能,Gazebo参数 real_time_factor 不稳定时,Info时间戳也将会变得不稳定。

  3. 当然,如果早知道 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 的发布频率的方法:

ROS2开发BUG记录:在将 use_sim_timer 置为 true 时,节点的 Timer_Callback 行为“异常”的更多相关文章

  1. 项目开发bug记录

    项目开发中遇到了一个问题,类中出现未知属性 ‘ $jacocoData ’,准确的来说,实际上在集成测试阶段,系统自动运行测试用例时,抛出来的异常提示信息,但是在开发阶段是不存在的.这个问题是以前没有 ...

  2. 微信小程序bug记录与解决

    微信小程序bug记录 textarea textarea在模拟器上没有padding,可是在真机上会自带padding,而且在外部改不了,并且在安卓和IOS上padding还不一样 第一张图是在开发工 ...

  3. [技术博客]Android 开发 Bug Log

    [技术博客] Android 开发 Bug Log 大大小小的bug,聪明的愚蠢的都有, 持续记录中...... java.lang.IllegalArgumentException: The sty ...

  4. iOS开发之记录用户登录状态

    iOS开发之记录用户登录状态 我们知道:CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登陆状态.例如微信 ...

  5. 开发错误记录8:Unable to instantiate application com

    开发错误记录8:Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication 这是因为在And ...

  6. Arduino单片机使用和开发问题记录(转)

    源:Arduino单片机使用和开发问题记录 1.将程序上传到板子时Arduino IDE提示“avrdude: stk500_getsync(): not in sync: resp=0x00” 网上 ...

  7. IOS开发之记录用户登陆状态,ios开发用户登陆

    IOS开发之记录用户登陆状态,ios开发用户登陆 上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreDa ...

  8. 【bug记录】OS Lab3 踩坑记

    OS Lab3 踩坑记 Lab3在之前Lab2的基础上,增加了进程建立.调度和中断异常处理.其中测试包括进程建立以及进程调度部分. 由于是第一次做bug记录,而且是调试完bug后再做的记录,所以导致记 ...

  9. 在SublimeText3中搭建Verilog开发环境记录(二)

    接上文 SublimeText3中搭建Verilog开发环境记录(一) 在实现了基础功能后,继续添加插件,让功能更为完善: 快速创建代码模块(snippet) Ctrl+鼠标左键实现模块跳转 通过iV ...

  10. BUG 记录:移位运算与扩展欧几里得算法

    BUG 记录:移位运算与扩展欧几里得算法 起因 上个月就开始打算用C++写一个ECC的轮子(为什么?折磨自己呗!),奈何自己水平有点差,拖到现在才算写完底层的大数运算.在实现欧几里得算法的时候,我开始 ...

随机推荐

  1. Spring环境获取Spring的Bean

    一.测试数据准备 /* Navicat Premium Data Transfer Source Server : swp-mysql Source Server Type : MySQL Sourc ...

  2. Vben-admin---ApiSelect Invalid prop: type check failed for prop "onUpdate:value". Expected Function, got Array

    在basicFrom组件里添加一个ApiSelect, <template #localSearch="{ model, field }"> <ApiSelect ...

  3. iceoryx源码阅读(三)——共享内存通信(一)

    目录 0 导引 1 整体通信结构 2 RelativePointer 2.1 原理 2.2 PointerRepository 2.3 构造函数 2.4 get函数 3 ShmSafeUnmanage ...

  4. ThreadLocal原理详解——终于弄明白了ThreadLocal

    目录 概述 API介绍 ThreadLocal的理解 ThreadLocal的原理分析 总结 概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal ...

  5. pwn杂项之linux命令执行

    通常pwn题目,时常会考到对Linux命令的一些使用,比如当cat被禁用的时候,可以使用tac,或者别的命令代替 下面是buu上的应该题目,考察的就是对liunx命令的理解,以及对程序的分析. 题目地 ...

  6. NOIP模拟90(多校23)

    T1 回文 解题思路 原来 \(n^3\) 可以过 500 ... 先枚举一下路径长度,对于同一路径长度点数最多是 \(n\) 个,我们可以接着枚举从 \((n,m)\) 出发的路径长度相同的点. 然 ...

  7. MySQL学习笔记-存储引擎

    存储引擎 一. MySQL体系结构 MySQL Server 连接层:连接的处理.认证授权.安全方案.检查是否超过最大连接数等. 服务层:SQL接口.解析器.查询优化器.缓存 引擎层:引擎是数据存储和 ...

  8. docker——存储配置与管理

    docker存储配置与管理 查看docker info [root@hmm overlay2]# docker info Client: Docker Engine - Community Versi ...

  9. c# winfrom DataGridView 动态UI下载功能(内含GIF图) || 循环可变化的集合 数组 datatable 等

    Gif演示 分解步骤 1,使用组件DataGridView 2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型) 3,需要用到异步线程.如果是不控制数据源的话 ...

  10. 关于正在开发中的DjangoStarter v3版本

    前言 最近做的这个项目大量使用了 python 及其相关的生态,因此自然而然选择了我的 DjangoStarter 作为后端框架 之前 v2 版本是用 RestFramework 做接口的,后面我试用 ...