NAO高尔夫比赛(python提高版)
比赛规则
场地
一共分为3个球洞,场地是一样的,只是球的起点位置不同。第一关起点离球洞3m处,第二关起点离场地左边界50cm处,第三关起点离场地下边界50cm处。
球洞
球洞由黄杆和landmark组成。
比赛时间及要求
总时长为23min,且击球总次数为10杆。球不可以出界,机器人可以出界。
比赛策略
程序模块
高尔夫比赛主要用到了NAO机器人的视觉和运动模块。视觉模块包括红球、黄杆和landmark的识别。运动模块则包括步态、定位和击球等。
程序逻辑
主逻辑即:行走找球->球洞定位->击球。具体程序逻辑思想可参见python初级版的博客。
提高版的改进
摇头找黄杆和找landmark的改进
在初级版的程序设计中,采用的是先摇头找landmark,找不到则摇头找黄杆的策略。但在考虑到时间缩短的情况下,这样明显会浪费一些时间,因此在提高版的程序中,我们在一次摇头的动作中依次找landmark和黄杆。并将下一次定位时找黄杆或landmark的角度设置为上一个角度的大致范围,而不是从头开始找。
python代码:
1 | def moveheadToFindLandmarkandStick(self, yawAngles): |
程序说明:
首先找landmark,因为landmark的识别精度和返回的信息比黄杆好,如果找到则返回距离和角度信息。由于黄杆无法返回距离信息,所以将其距离设置为很大的负值,以便于后面的球洞定位判断。
行走找球(walkToBall())的改进
当NAO机器人在行走找球时,由于此时是动态的,或者当距离比较远时,摄像头会捕捉不到红球的信息,而初级版的代码是直接摇头再找一次,但此时机器人仍处于运动的状态,因此还是会出现找不到球的情况,甚至会出现走过红球的情况,所以当出现这种情况时,停下来再找一次是很有必要的。
在改进的代码中,当出现这种情况时,首先停止行走,然后在原地找一下球,找到则继续,否则上下左右摇头找一下球。
其次,由于之前的行走步态参数设置过大,当出现球的角度超过最大偏离角而校正时,由于步伐过大,导致机器人离球很近,从而出现球不在视野内的情况。所以我们将行走的步态参数改小了一点,并将最小接近球的距离放大一点,从而避免这种情况的发生。
python代码:
1 | def walkToBall(self, min_ball_d=0.4, max_ball_theta=0.15): |
球洞定位的改进
提高版在球洞定位上面仍然采用初级版的三角定位策略,具体可参见python初级版的博客。但较之前的策略,提高版将依次同时识别landmark和黄杆,即在一次摇头的过程中,先识别landmark,如果识别到,则进入landmark的三角定位,否则识别黄杆,进入黄杆的三角定位。
仍然存在的问题
(1)识别黄杆后,仍然不能返回有效的距离信息,这不利于确定击球的力度。
(2)击球力度应由距离来确定。应对力度和距离进行数据拟合,得到两者的关系,以确保每次击球的有效距离能达到预期值。
(3)应尽量避免反手击球,如果不能在路径规划上解决,可以考虑绕着红球转一个大的圆弧。
(4)设计一个切换比赛关数的函数。