我在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。
我在网上找不到任何其他东西,这是一个已知的错误吗?还有其他人有这个问题吗?有人可以提供有关为什么会发生这种情况的见解吗?谢谢。
完全披露:我是一名研究生,这是一个课程项目。
这里的问题不一定是线程。
我们发现Create的内部odometry非常不一致,特别是当上网本位于它上面时。
要获得任何精确读数的相似性,必须将角速度设置得足够高(在我们的情况下高于0.11 rads / s)。
This site帮助解释了一些事情 - 即Creates使用电机功率来确定测距,而不是轮式计数器或任何类型的模拟。
为了获得航位推算任务的准确测距,人们需要建立自己的精确估算器,或者使用一些外部传感器来提供有关位置变化的更好信息。
我们的具体问题是由多线程情况下的阈值处理引起的,该情况将角速度设置为低以记录更改,而顺序代码没有这样的阈值。