0

我在 iRobot Create 上使用 Player(播放器/舞台)。从机器人获取里程数据的接口相当简单:调用 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。

我在网上找不到其他东西,这是一个已知的错误吗?有没有其他人有这个问题?有人可以提供有关为什么会发生这种情况的见解吗?谢谢你。

全面披露:我是一名研究生,这是一个班级项目。

4

1 回答 1

0

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

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

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

这个网站帮助解释了一些事情——即 Creates 使用电机功率来确定里程计,而不是车轮计数器或任何类型的模拟。

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

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

于 2012-04-17T21:48:58.503 回答