数学在AI-CODE中的应用

三角学的应用
几乎是最简单的机器人都会用到三角学,比方说敌人机器人在(ex,ey)坐标,自己在(mx,my)坐标,要向敌人方向射击,必须用三角学知识求得敌人坐标点到自己坐标点连线的方向,往此方向射击就是往敌人方向射击。这里有必要先介绍一下AIRobot的坐标系统,如下图所示,一个标准的笛卡尔坐标(国内数学教学通用的坐标系统),场地左下角坐标为(0,0),右下角为(地图宽,0),左上角为(0,地图高),右上角伟(地图宽,地图高),场地中水平向右为0度方向,水平向上为90度方向等。
(图1,坐标系统)
现在我来示范一下在AIRobot中怎样用到三角知识,当机器人扫描到敌人后会触发onScannedRobot事件函数,并传入一个ScannedRobotEvent作为参数,此ScannedRobotEvent包含了敌人的坐标,按照上面提到的方法,我们利用此坐标和自己机器人的坐标计算射击方向,如下:
double heading = Math.atan2(event.getY()-getBody().getY(),event.getX()-getBody().getX());
由此我们计算到了敌人所在方向,调用fire(heading, fire_power)即可向敌人方向射击。是的这里的确应用了三角知识,但这几乎是最简单的应用,也许你认为这算不上什么,好的,为了说服你我只好举更多的例子。
 上个例子是关于瞄准射击的,这个例子将应用在机器人的运动上面,在古代战舰的战斗中,由于战舰的炮都是装在战舰的侧身,于是战斗的时候总是要侧对着敌人才能达到最佳的攻击效果,那么在AIRobot坦克对战的时候此效果会有好处吗?虽然AIRobot机器人可以向任何方向发射炮弹,但是假如你侧对着敌人,自己躲避子弹的范围会增加(你要知道AIRobot中的炮弹是对一个方向有效而不仅仅是对一个点有效),因此为了减少自己被击中的机会,我让自己的机器人始终侧对着敌人运动。好,我们现在来实现这个运动吧,AIRobot机器人的运动控制函数很简洁,只有两个,其中turn()控制转动速度,move()控制移动速度,这里我们关注turn,我们要让自己的机器人始终转向侧对敌人的方向就达到目的了,为了使说明更直观我这作了一幅图,见图2,假如敌人在P1点,自己在P0点,此时自己的车身方向为L0方向( 熟悉AIRobot API的应该知道这总是已知的,可以通过getBody().getHeading()得到),通过上面刚刚介绍的方法可以得到敌人相对自己的方向L1(L1就等于上面第一个例子中的heading),要想侧身对着敌人,那么自己需要转动到垂直于L1的方向,如图中的L2方向或者L2的反方向,这里我们选择L2方向(当然你也可以选择它的反方向),L2的计算就又要用到三角数学知识了,由于L2垂直于L1可以得出L2 = L1-90度(L1+90度得到L2的反方向),得到了L2之后就好办了,从目前的车身方向转到目的方向,须转动的角度等于目的方向减去目前的方向,因此需要转动的角度disAngle = L2 – L0,如果使用机器人快车,模块库中就包含了这样的模块,直接使用即可以让自己的机器人转到L2方向,如果直接写机器人代码,可以使用每周期连续的计算disAngle并使用turn(disAngle)(算法原理这里留给读者思考)。由此每次获得敌人新的坐标后都用此方法转动自己的机器人就可以使自己的机器人始终保持侧身对着敌人了,这里共用了三次三角学计算。
(图2,侧身运动)
上面是否只是简单的一次方向计算,两次角度差计算而已,实际上不止这些,当你实际编写机器人的时候你会发现,角度的加减会涉及角度范围超过0到360度的情况,还有L2和L2反方向那个更好,可能转向L2方向会比转向L2反方向需要更多的时间等等与三角数学有关的问题你都会涉及到,等你真正实现了一个这样的机器人的时候,你会发现你重温了基本三角学的大多数知识。
现在举个非常经典的正弦定理的运用的例子,直线提前量瞄准方法。看下图图3,敌人机器人目前在B点,它往BC方向作匀速直线运动,现在我们要射击它,假设我们往C点射击经过n个周期后正好能击中它( 由于子弹运动速度总大于机器人运动速度,所以这一假设能够成立),由于我们目的是射击,因此我们这里不需要求到C点坐标,只需要求得射击角度就够了,通过第一个例子我们知道我们能求到AB的方向,BC方向为机器人运动方向,由getBody().getHeading()结合速度的正负也可以求得(如果速度为负BC方向为getBody().getHeading()的反方向)。通过AB方向,BC方向我们可以求得∠ABC,敌人运动速度ev,自己子弹运动速度bv已知,那么:
上表中我们利用正弦定理求出了∠ABC,AB方向角度减去∠ABC即得到AC的方向,由此得到射击方向。
可见,多么简洁,利用有效的三角学知识能够非常方便的实现我们的策略,也许你能找到更多的方法,利用不同的三角学公式,也许比这里的方法更方便更简洁。我想,这三个例子足够证明三角学在AIRobot机器人设计中的地位和作用了。当然,我自己也用此机会又重温了一下初高中所学的三角数学,那个解几何题常用到的正弦定理,想不到在这里起到了精确射击敌人的效果。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值