我通过观察我车的HUD发现,定速巡航就是自适应巡航的一部分,同时自适应巡航其实就是定速巡航的升级版本。当我们启动巡航是,给车辆一个固定的速度,当车辆检测到前方没有车辆是,那就按照我们给定的速度行驶,这时就是定速巡航,如果检测到前方有车辆,那么这时就是自适应巡航,自适应巡航就是按照前方的车速跟车行驶,当前方车辆大于我们给定速度是,按照我们给定的速度行驶。
车道偏离检测,我观察看来就是在我前风挡玻璃的前面有一个摄像头,通过摄像头拍摄路面情况解析算出车道线的位置,并判断车辆是否压线。当车辆压线是,对应的方向的车道线消失,这个功能在60Km/h的时候才会被激活或者是显示。
车距检测,这个现在大家的做法应该都一样,可能每个车安装的设备都是一家的,就是通过车前方的一个雷达来实时检测前车与我们的位置,并根据当前车数和车身自身参数给定一个安全的距离,HUD上面的分为三个档,即上图中中间那三个矩形。随着我们与前车距离的虽小而减少并至消失。
先来实现我们的定速巡航与自适应巡航。当定数巡航被激活是,HUD上面显示“[ ]”,当车辆检车到前方车辆切换自适应巡航时,图中[]中小汽车图标出现,表示当前工作模式为自适应巡航。当前车消失是,小汽车图标消失,表示切换为定速巡航模式,以我们给定的速度定速实行。实现方式简单,这里就不画流程图了,还是补上流程图吧
首先定义三个宏定义,用来标记巡航的工作模式如下
1.#define ADAPTIVICRUISECONTROL_OFF 0 //巡航关闭 #define ADAPTIVICRUISECONTROL_NOCAR 1 //定速巡航 #define ADAPTIVICRUISECONTROL_CAR 2 //自适应巡航
不定义也可以,自己能分的清楚就可以
实现接口如下
void HUD::set_AdaptiveCruiseControl(int controlModel) { switch (controlModel) { case ADAPTIVICRUISECONTROL_OFF: ui->label_car->hide(); ui->label_constSpeed->hide(); break; case ADAPTIVICRUISECONTROL_NOCAR: ui->label_car->hide(); ui->label_constSpeed->show(); break; case ADAPTIVICRUISECONTROL_CAR: ui->label_car->show(); ui->label_constSpeed->show(); break; default: break; } }
以上就是定速巡航和自适应巡航的显示部分,逻辑部分后面再说。
车道偏离与上面实现方类似,定义三个混定义表示那个车道线
#define LANEDEPARTTURE_L 1 //左车道线 #define LANEDEPARTTURE_R 2 //右车道线 #define LANEDEPARTTURE_DOUBLE 3 //双车道线
实现接口如下
void HUD::set_LaneDeparture(int position, bool isOn) { switch (position) { case LANEDEPARTTURE_L: { if(isOn) { ui->label_runLine_L->show(); } else { ui->label_runLine_L->hide(); } break; } case LANEDEPARTTURE_R: { if(isOn) { ui->label_runLine_R->show(); } else { ui->label_runLine_R->hide(); } break; } case LANEDEPARTTURE_DOUBLE: { if(isOn) { ui->label_runLine_L->show(); ui->label_runLine_R->show(); } else { ui->label_runLine_L->hide(); ui->label_runLine_R->hide(); } break; } default: break; } }
车距保持,同理定义三个宏定义用来表示当前的距离等级,这里我试用了距离等级这个东西,HUD上面的三个矩形表示的是三个范围,而不是三个具体的值,所以我用了距离等级,呵呵呵。
#define CARDISTANE_1 1 //距离1离前车太近 #define CARDISTANE_2 2 //距离2离前车存在隐患 #define CARDISTANE_3 3 //距离3离前车安全
实现接口如下
void HUD::set_CarDistance(int level) { switch (level) { case CARDISTANE_1: ui->label_scale_1->show(); ui->label_scale_2->hide(); ui->label_scale_3->hide(); break; case CARDISTANE_2: ui->label_scale_1->show(); ui->label_scale_2->show(); ui->label_scale_3->hide(); break; case CARDISTANE_3: ui->label_scale_1->show(); ui->label_scale_2->show(); ui->label_scale_3->show(); break; default: break; } }
以上就是今天要实现的内容