Timer 如何改进ROS定时器

Timer 如何改进ROS定时器,timer,ros,Timer,Ros,我在program中使用ROS计时器,并将预期事件时间和实际事件时间之间的差异绘制如下:event.current\u real-event.current\u expected。然而,我绘制了数据,发现ROS计时器根本不准确。在我的程序中,计时器周期设置为0.002秒,但最大的错误(0.01152秒)可能大到该时间的5.7倍以上。图如图所示 我从ROS维基上了解到,ROS定时器并不打算精确,而是受系统负载和其他因素的影响。所以我想知道的是如何使它尽可能准确?是否有替代ROS定时器的替代方法 我

我在program中使用ROS计时器,并将预期事件时间和实际事件时间之间的差异绘制如下:
event.current\u real-event.current\u expected。然而,我绘制了数据,发现ROS计时器根本不准确。在我的程序中,计时器周期设置为0.002秒,但最大的错误(0.01152秒)可能大到该时间的5.7倍以上。图如图所示

我从ROS维基上了解到,ROS定时器并不打算精确,而是受系统负载和其他因素的影响。所以我想知道的是如何使它尽可能准确?是否有替代ROS定时器的替代方法

我正在使用RosIndigo和Ubuntu 14.04。源代码如下所示:

#include "ros/ros.h"
#include <fstream>

using namespace std;
std::ofstream time_file;

void callback1(const ros::TimerEvent& event)
{
    ros::Duration error_dur = event.current_real - event.current_expected;
    time_file<<error_dur.toSec()<<endl;
}

int main(int argc, char **argv)
{
    time_file.open("time_file.txt");
    time_file<<"error_dur"<<endl;
    ros::init(argc, argv, "talker");
    ros::NodeHandle n;

    ros::Timer timer1 = n.createTimer(ros::Duration(0.002), callback1);

    ros::spin();
    if(!ros::ok())
        time_file.close();

    return 0;
}
#包括“ros/ros.h”
#包括
使用名称空间std;
std::流时间文件;
无效回调1(const ros::TimerEvent&event)
{
ros::持续时间错误\u dur=event.current\u real-event.current\u预期;

时间文件根据运行时上下文,ROS时间(速率、计时器等)基于:

  • 挂钟时间 或
  • 分析
    /clock
    主题
例如,这允许在重放行李时根据模拟数据设置ROS::Time

缺点是该过程可能缺乏精度(尤其是在开始时,直到收到第一条
/clock
消息)

因此,如果您仅将时间数据用于内部目的(例如计算较短的持续时间),您可能会决定使用系统调用/库来提高精度,但您需要检查它在模拟期间是否运行良好


来源:

根据运行时上下文,ROS时间(速率、计时器等)基于:

  • 挂钟时间 或
  • 分析
    /clock
    主题
例如,这允许在重放行李时根据模拟数据设置ROS::Time

缺点是该过程可能缺乏精度(尤其是在开始时,直到收到第一条
/clock
消息)

因此,如果您仅将时间数据用于内部目的(例如计算较短的持续时间),您可能会决定使用系统调用/库来提高精度,但您需要检查它在模拟期间是否运行良好


来源:

也许你可以考虑重构,并使用ROS::如上面提到的那样,速率更好吗?但是它说:“注意:通常推荐使用定时器而不是速率。参阅定时器教程详细说明。”你在例子中使用了墙壁时间还是模拟时钟?@ Tik0,我认为它是墙时间。也许你可以考虑重构,并使用ROS::如上面提到的那样,速率更好吗?但是它说:“注意:通常建议使用定时器而不是速率。参见Times教程详细信息。”在你的例子中,你使用的是墙时间还是模拟时钟?@Tik0我想是墙时间。