Player在多线程应用程序中无法正确获取Create的odometry数据

问题描述 投票:0回答:1

我在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。

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

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

multithreading robotics robot mobile-robots player-stage
1个回答
0
投票

这里的问题不一定是线程。

我们发现Create的内部odometry非常不一致,特别是当上网本位于它上面时。

要获得任何精确读数的相似性,必须将角速度设置得足够高(在我们的情况下高于0.11 rads / s)。

This site帮助解释了一些事情 - 即Creates使用电机功率来确定测距,而不是轮式计数器或任何类型的模拟。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.