导航方案的选择

  早在十七届,逐飞科技就对室外越野组进行了浅析,极速越野组之逐飞演示车模浅析,在逐飞的浅析中,在低速情况下侧重于摄像头的方案,所谓的摄像头方案就是利用摄像头对操场上的跑道进行二值化处理,然后对操场的白色跑道线进行循迹,相对于GPS/北斗,在摄像头导航下,车模行驶更稳定,下面对摄像头方案和GPS/北斗方案进行分析

  摄像头导航方案

 选择摄像头方案就要选取“导航线”,在室内,我们可以选择摄像头对白色赛道进行二值化,拟合中线,我们可以知道车模在赛道中的位置,及时对车模进行处理,同理在室外,我们可以选择操场上的白色跑道线作为我们摄像头的“导航线”,引导我们完成对操场的环绕。下图为操场跑道白线图片和二值化处理后的图片,我们可以看到,处理后的图片可以有效的为我们提供导航

操场跑道
二值化图像
优点

摄像头导航的优势有以下几点

1、操场跑道是连续的,因此图像处理后的跑道也是连续的,在低速情况下,车模运行很稳定,不会出现东歪西扭的现象

2、相对于GPS/北斗,摄像头天气受环境影响较小,调整合理的参数,摄像头仍可正常运行

缺点

1、比赛场地与实际练习场地有所不同,有的比赛场地的操场为蓝色,有的为红色,甚至有些比赛场地的操场没有白色跑道线,如今年的国赛现场,此时摄像头就失去的了作用

2、尽管摄像头在低速情况下表现良好,但是摄像头前瞻距离有限,在高速情况下表现差强人意,而越野组又是最求速度的组别,因此摄像头并不是很好的选择。

GPS/北斗导航方案

 如题,GPS/北斗导航方案即采用GPS/北斗为我们提供导航,GPS/北斗可以为我们实时提供接收机的经度、纬度、高度等信息,在越野组中,主要用到经度和纬度,当我们知道了车模的经纬度后,只需采集目标点的经纬度,经过处理后即可为我们提供导航。下午为大家提供一下导航基本思路

  智能车从片内FLASH实时读取目标点的地理位置信息,根据方位角计算公式计算出目标地点的方位角,并将目标地方位角与智能车本身的方位角的数据传回给舵机方向PID控制程序,将目标方位角作为车身方位角的期望值,通过内部10ms定时器将控制值输出给舵机进行方向控制,内部20ms定时器实时监测目标点与智能车当前地理坐标信息,一但进入目标点附近,将及时切换下一个目标点,当片内FLASH读取完成,导航结束。

  我以实际生活中的例子来给大家讲清楚是如何利用GPS进行导航的。

   

  如图,小学二年级的一天早上,你从家去往学校,假设,你家与学校之间没有任何阻碍,于是你选择了最短路径前往学校,首先你要知道学校的方位,如图,学校在你家的东南方向,然后你要确定自己的方向,比如说你现在是面向正北,那么你就要调整自己的方向,使自己面向东南,然后可以开始走了,此时你还缺少一个确定方向的东西--指南针,因为在去往学校的途中,你可能会被路上的某些因素所影响,从而使你的方向逐渐偏离学校的方向,所以你需要一个指南针去纠正你的方向,使你成功到达学校。

从上面这个例子带入到智能车中去,首先你要确定自己的位置home_position,学校的位置school_positing,这两个数据可以通过GPS去获得,通过GPS可以获得当前位置的经纬度信息,(值得注意的是由于地球是圆形,由GPS获取到的经纬度并不是平面坐标系,想获得平面坐标系要通过转换,后续将为大家提供转换代码)知道位置信息后,之后需要通过方位角计算函数去获取目标方位角angle,逐飞开源库已提供方位角计算函数

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     计算从第一个点到第二个点的方位角
// 参数说明     latitude1       第一个点的纬度
// 参数说明     longitude1      第一个点的经度
// 参数说明     latitude2       第二个点的纬度
// 参数说明     longitude2      第二个点的经度
// 返回参数     double          返回方位角(0至360)
// 使用示例     get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2);
// 备注信息     逐飞科技开源库
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth (double latitude1, double longitude1, double latitude2, double longitude2)
{
    latitude1 = ANGLE_TO_RAD(latitude1);
    latitude2 = ANGLE_TO_RAD(latitude2);
    longitude1 = ANGLE_TO_RAD(longitude1);
    longitude2 = ANGLE_TO_RAD(longitude2);

    double x = sin(longitude2 - longitude1) * cos(latitude2);
    double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
    double angle = RAD_TO_ANGLE(atan2(x, y));
        return ((angle > 0) ? angle : (angle + 360));
}

此时我们已经知道,车身当前位置,以及目标点方位角,还需知道车头面向方向,车头面向方向利用车身IMU获取,至此,以获取车身方位角,目标方位角,通过舵机闭环控制,使车头方位角跟踪目标方位角即可完成GPS导航。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐