Timer 如何改进ROS定时器
我在program中使用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定时器的替代方法 我
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我想是墙时间。