播放器无法正确获取在多线程应用程序中创建的大小数据



我在iRobot Create上使用Player(Player/Stage)。从机器人获取测程数据的界面相当简单:调用playerc_client_read,然后如果您正确订阅了playerc_position2d代理,您应该能够访问代理的成员 px、py、pa 以 x 和 y 为单位的行进距离(以米为单位);和旋转(以弧度为单位)。

我在单线程应用程序中执行此操作没有问题 - 所有测程数据都完美地位于我需要的位置。

但是,当我尝试将机器人控制器移动到它自己的线程(使用 pthreads)时,我遇到了一些问题。问题是似乎只有 px 被更新了。py 和 pa 始终保持 0

这是机器人线程的要点

//declare everything (including the playerc_client_t* object and playerc_position2d_t* object)
//connect to server (in pull mode or push mode, it doesn't seem to matter)
//subscribe to position2d proxy
while(!should_quit) {
playerc_client_read(client)
double xPosition = position2d->px;
double yPosition = position2d->py;
double radians = position2d->pa;
//do some stuff
sleep(10 milliseconds)
}
cleanup and unsubscribe

果然,无论机器人如何移动,只有 xPosition 被设置,而 yPosition 和弧度都保持为 0。

我在网上找不到任何其他内容,这是一个已知的错误吗?还有其他人遇到过这个问题吗?有人可以提供关于为什么会发生这种情况的见解吗?谢谢。

完全披露:我是一名研究生,这是一个课堂项目。

这里的问题不一定与线程有关。

我们发现,Create的内部测程非常不一致,尤其是当上网本放在它上面时。

为了获得任何准确的读数,必须将角速度设置得足够高(在我们的例子中高于0.11 rads/s)。

这个网站帮助解释了一些事情 - 即创造者使用电机动力来确定里程计,而不是车轮计数器或任何类型的模拟物。

为了获得航位推算任务的精确里程计,人们要么需要构建自己的精确估计器,要么使用一些外部传感器来提供有关位置变化的更好信息。

我们的具体问题是由多线程情况下的阈值引起的,该阈值将角速度设置为低以记录更改,而顺序代码没有这样的阈值。

最新更新