我目前正在为模拟器编写代码以与ROS时间同步。
基本上,问题变成"写一个get_time和睡眠按照ROS时间进行缩放"?这样做不会改变代码库,只需要链接到自定义get_time和sleep。 get_time
似乎完美无缺;但是,我一直无法让睡眠准确地运行。
我目前的设计是这样的(代码附在底部):
然而,似乎观察者线程不够准确(我看到0~50ms的差异),这意味着睡眠调用有时使线程睡眠时间过长。我还明显地注意到模拟器中的滞后/锯齿状行为,如果我用睡眠替换睡眠(1000 * ms)。
不幸的是,我对这些类型的设计没有太多经验,我觉得有很多方法可以优化/重写它以使其更准确地运行。 所以我的问题是条件变量是正确的吗?我甚至正确使用它们吗?以下是我尝试的一些事情:
代码: Watcher(这是在启动时运行)
void watcher()
{
while (true)
{
usleep(1);
{
std::lock_guard<std::mutex> lk(m_queue);
if (prio_queue.empty())
continue;
if (get_time_in_ms() >= prio_queue.top())
{
cv.notify_all();
prio_queue.pop();
}
}
}
}
睡眠
void sleep(int ms)
{
int wakeup = get_time_in_ms() + ms;
{
std::lock_guard<std::mutex> lk(m_queue);
prio_queue.push(wakeup);
}
std::unique_lock<std::mutex> lk(m_time);
cv.wait(lk, [wakeup] {return get_time_in_ms() >= wakeup;});
lk.unlock();
}
任何帮助将不胜感激。