当前位置:首页 > 显示光电 > 显示光电
[导读]HUD不是“把屏内容投到玻璃”就行。挡风玻璃是曲面、光机有自由曲面镜、装配还有公差,直出图像到人眼会桶形扭曲、位置偏移、左右眼不一致。 正确做法是标定阶段算好预畸变表,运行期按表反向变形源图;AR信息叠加则走“世界坐标→眼点投影”的映射链,不然箭头永远贴不到车道上。


HUD不是“把屏内容投到玻璃”就行。挡风玻璃是曲面、光机有自由曲面镜、装配还有公差,直出图像到人眼会桶形扭曲、位置偏移、左右眼不一致。 正确做法是标定阶段算好预畸变表,运行期按表反向变形源图;AR信息叠加则走“世界坐标→眼点投影”的映射链,不然箭头永远贴不到车道上。

一、畸变从哪来

挡风玻璃曲率非平面 → 几何拉伸

自由曲面反射镜 → 桶形/枕形畸变

HUD安装角偏差 → 虚像上下左右偏

眼盒位置变化 → 左右眼视差畸变

温度形变 → 长期漂移

WHUD虚像距离2~3米放大倍率小,轻微畸变能忍;AR-HUD虚像10米+,倍率一上来不校正就晕。

二、标定生成预畸变表

工程上不做运行时实时求解,而是下线标定:

HUD投网格点阵到标定板/挡风玻璃

相机放在眼盒位置拍投影图

提取原图网格点 (u,v) 与拍摄点 (u',v') 的对应关系

拟合像素映射函数 f

求逆映射 f⁻¹,写入HUD预畸变表

运行期渲染时先对源图做逆变形:

dst = WarpInverse(src)

投出去经玻璃再扭曲一次,人眼看到的就是正图。

预畸变表两种存法:

网格位移表:存每个网格顶点的dx/dy偏移,双线性插值

分块仿射:每块小区域一个变换矩阵,适合MCU算力低

typedef struct {

   int16_t dx, dy;

} warp_vec_t;


static const warp_vec_t warp_lut[MESH_H][MESH_W];


void hud_remap_pixel(int sx,int sy, int*dx,int*dy){

   /* 双线性取网格偏移 */

   int gx = sx * (MESH_W-1) / SRC_W;

   int gy = sy * (MESH_H-1) / SRC_H;

   const warp_vec_t*v = &warp_lut[gy][gx];

   *dx = sx + v->dx;

   *dy = sy + v->dy;

}

PGU输出前把每个像素按表搬到新位置,空白区填黑。

三、运行期不要每帧重算畸变

标定参数固定后预畸变表是常量,只在这些时候更新:

产线标定写入

驾驶员眼位大幅变化(DMS触发)

温度跨越阈值做动态补偿

普通帧刷新别碰畸变模型,只做查表重采样,RGB565下用邻近或双线性都行,AR-HUD才上GPU纹理映射。

四、信息分层:基础层 + AR层

别把所有内容塞进同一套坐标。

基础层(VID 2~3m)

车速、限速、挡位、电量、简单图标

固定HUD逻辑坐标

过预畸变表输出

不跟车道动

AR层(VID 8~15m)

导航箭头、车道引导线、前车框、FCW预警

输入来自ADAS:车道线、目标框、自车姿态

世界坐标→车辆坐标→眼点投影→PGU像素

/* 车道点(本车坐标 x,y) → HUD像素 */

void lane_to_hud(float x_m, float y_m, int*px,int*py){

   float yaw = imu_yaw();

   float X = x_m*cos(yaw) - y_m*sin(yaw);

   float Y = x_m*sin(yaw) + y_m*cos(yaw);

   *px = (int)(IMG_CX + X * PIX_PER_M);

   *py = (int)(IMG_BOT - Y * PIX_PER_M * DEPTH_SCALE);

   /* 再走预畸变表 */

   int wx,wy; hud_remap_pixel(*px,*py,&wx,&wy);

   *px=wx; *py=wy;

}

五、延时补偿防漂移

感知→融合→渲染→PGU输出有几十ms延迟,弯道里箭头会拖尾。按车速+转向角往前推:

void predict_lane_point(float*fx,float*fy, float dt){

   float v = speed_kmh()/3.6;

   float yaw_rate = steer_rate();

   *fx += v*dt;

   *fy += 0.5*yaw_rate*v*dt*dt;

}

车道线用二次曲线拟合再按dt外推,弯道贴合度直接决定晕不晕。

六、姿态补偿

过减速带、加速制动时车身俯仰,AR层不补就上下漂:

IMU加速度积分得俯仰角

转向角算横移

眼盒DMS跟踪做水平偏移补偿

hud_y_offset = (int)(imu_pitch() * PITCH_TO_PIX);

arrow_py += hud_y_offset;

七、落坑清单

源图直接投不校正→曲面拉伸

每帧跑畸变模型→CPU爆、掉帧

AR层用基础层坐标→箭头不跟路

不补延时→弯道箭头滞后

不设眼盒补偿→司机一偏头就歪

左右眼畸变差无视→AR-HUD眩晕

基础文字放AR层→远处字糊

标定值写死不存NVM→换车重标

八、落地顺序

光学定型后做网格标定,出预畸变LUT

PGU渲染管线末尾接重映射

基础层固定坐标过LUT

AR层建车辆坐标→HUD像素映射

接ADAS车道线+目标框

加延时补偿(车速/转向)

IMU姿态补偿

DMS眼位微调(高端)

标定参数存NVM,OTA可更新

HUD显示编程的本质是两件事:静态畸变交给标定表,动态叠加交给坐标链。预畸变不是算法炫技,是一次标定、长期查表;AR箭头贴不贴路也不靠“画准”,靠世界坐标到眼点投影的映射加延时/姿态补偿。基础信息稳、AR信息跟路、畸变表离线算——这三层收住,HUD才不像贴膜,像真投在路面上。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭