1.易航智能——专注量产的源码自动驾驶解决方案供应商
2.开源|HDR-ISP开源项目介绍
3.Apollo EM中path_assesment_task相关细节的讨论
易航智能——专注量产的自动驾驶解决方案供应商
北京易航远智科技有限公司自年成立以来,致力于自动驾驶系统的源码自主研发,成为中国首批自动驾驶创业公司之一。源码公司获得了包括经纬中国、源码源码资本、源码明势资本等知名创投机构的源码贴吧引流源码支持,以及北汽产投、源码广汽资本和理想汽车等主机厂的源码战略投资。
易航智能自年起便涉足自动驾驶Tier1量产项目,源码至今已拥有万辆整车量产经验,源码积累了超过亿公里的源码驾驶数据。公司拥有感知、源码决策规划控制、源码软硬件开发、源码测试标定等全栈自研能力,源码并率先实现了NOA行泊一体、城市全场景FSD等高阶功能。
易航智能团队在感知、决策、控制、故障诊断等核心算法方面拥有深厚的技术实力。公司主营自动驾驶解决方案(ADAS、个人直播源码NOA、FSD)、域控制器、摄像头模组、驾驶算法与软件等产品,并在北京、苏州设有研发中心和工厂,固安设有测试基地。主要客户包括理想汽车、北汽集团、江铃雷诺、上汽大通、一汽大众、威马汽车等主机厂。
易航智能汇集了汽车行业精英和计算机视觉、深度学习领域专家,硕士及以上学历人员占比超过一半。团队成员主要来自国内外主机厂、Tier 1供应商、国内外顶尖科研机构和伯克利、剑桥、三码源码清华、北大、北航等知名院校。
苏州平方米的一期生产工厂已建成并投入使用,拥有全球领先的智能化、自动化自动驾驶专用摄像头及域控制器生产线,产品已在多款车型中前装量产。
公司还建立了全球领先的摄像头调试和测试实验室,产线可进行AA和内参标定,已量产1M、2M、8M前视、侧视、环视摄像头,FOV覆盖°-°。
易航智能已通过IATF 、ISO、ISO 、ISO等国际认证。
开源|HDR-ISP开源项目介绍
开源HDR-ISP项目提供了一个用于HDR相机的ISP Pipeline,旨在帮助入门开发者快速学习ISP技术。移码和源码项目使用C++编写,旨在解决ISP学习资料匮乏的问题,为新手提供一个参考的demo。
项目默认配置了一个Pipeline,包括支持和准备支持的ISP模块。用户可以通过修改json配置文件来调整ISP模块的基本参数,如sensor参数和rgb gamma等。
在Linux和Windows系统上,项目提供了详细的开发环境和编译、运行指南。用户可以通过修改json配置文件来调试运行结果,并与fastOpenIsp进行对比,进一步优化ISP性能。
项目支持HDR相机ISP功能,并提供运行结果示例。通过对比其他ISP,用户可以更好地理解项目的优势和局限性。项目还规划了后续工作,包括支持更多ISP模块和优化性能。
项目地址:github.com/JokerEyeAdas...
该项目提供了快速访问GitHub的链接:HDR-ISP。如果您对ADAS感兴趣,fps辅助源码欢迎关注公众号“ADAS之眼”,以及知乎、CSDN等平台的同步更新。同时,所有使用的源码都在我的GitHub上进行开源。
感谢以下仓库及作者,他们的贡献对项目起到了重要作用。
Apollo EM中path_assesment_task相关细节的讨论
网上已有关于本task流程的详细注释,本文主要探讨Apollo EM中path_assesment task的内部算法细节。
首先,我们来看SetPathPointType函数。函数中,ego_center_shift_distance代表车体几何中心距离后轴中心的距离。初始化过程中,以车体后轴中心点为基准获取整个车体Box。ego_box所调用的Shift函数将后轴中心点前移至车体几何中心点并计算box四个角的位置。这样做的原因是,Control使用后轴中心点跟踪每一个pathpoint,而本车SLboundary依据其几何中心点在参考线上进行投影,因此这一步转化是必不可少的。
Shift函数内所调用的InitCorners()如上图所示,其中cos_heading,sin_heading_,half_length_,half_width_,center_,是在Box2d初始化时进行赋值。简单用图示介绍一下含义:X-Y用于表示地图坐标系,x-y用于表示将地图坐标系平移至车体几何中心点之后的坐标系,[公式] 用于表示heading。特别解释一下:此处的使用 [公式] 来表示长度half_width x[公式]。
获取到本车box的四个角的坐标之后,再将依靠参考线将box转化到SL坐标系下的boundary。之后遍历SL坐标系下每个pathpoint,计算自车位于每个pathpoint的时候所对应的车体的边界。将边界与车道线比较,判断每个pathpoint的类型(在lane_borrow/lane_change决策下是在旁车道还是本车道)。此处不粘贴源码,直接用图示进行说明各种情况。
需要注意:由于要在统一的坐标系下进行比较,所以,采用-right_width。所以对应上图的情况,即处于车道边界之外还没换道的情况:start_l>lane_left_width || end_1<-lane_right_width此时type为IN_LANE。对应上图情况,即严格处于本车边界之内的车辆,需要考虑将车道边界添加buffer:所以本车实际处于虚线之内,此时的type为IN_LANE,表示已经换道完成。其它状态下为lane_change的过渡状态,type为OUT_ON_FORWARD_LANE。
需要注意的是:由于借道其实是拐入别的车道一点点之后再拐回来,所以需要添加动态的迟滞边界in_and_out_lane_hysteresis_buffer,来对pathpoint进行严格地区分。类似的做法在量产ADAS功能中也用到,主要用于对前方动态Target的识别,目的是为了防止障碍车辆沿车道线来回画龙或压线行驶的情况。扯远了~
如上述,因为借道只是占据旁车道一点点,所以判断条件与lane_change略有不同,此处的判断条件使用end_l与lane_left_width相比较,start_l与-lane_right_width相比较。
如上图所示,当前一个路径点在车道内(is_prev_point_out_lane = false),即绿点所在位置,则判断lane_borrow的条件:此时,in_and_out_lane_hysteresis_buffer = 0.2;当前一个路径点在车道内(is_prev_point_out_lane = true),即红点所在位置,此时,in_and_out_lane_hysteresis_buffer = 0;
接下来讨论path与静态障碍物collision的问题:具体流程图参见下图:IsCollidingWithStaticObstacles中流程概述:过滤掉虚拟障碍物,高速运动障碍物等,按照固定距离的pathpoint建立VehBox,所有点转化为Frenet坐标系,调用函数IsPointIn检验所有点是否处于障碍物的内部。
下面开始详细讲解IsPointIn函数:首先判断本车的Corner点是否在障碍物边界上,如果不在,则进行下一步取Corner点在与轴方向异侧的两个点,分别于Corner点构成向量,之后做叉乘,叉乘结果若大于0,则比较两个点的y值,若y值结果小于0,则看向量正旋转到目标向量的实际角度是否小于度,若小于,则c由零变为1;若y值结果为大于,则看向量正旋转到目标的实际角度是否大于度,若大于,则c由零变为1。同理再构建另外两个向量,若与上述情况相同,则c由1变为2。最后判断C为奇数还是偶数,如果为奇数,则返回true,表示Corner点处于Obstacle内部。如果为偶数,则表示Corner点在Obstacle外部。
下面举个栗子:对于左图A点的这种情况,0点与3点在Y轴方向上位于A点异侧,0.y<3.y,side>0(即比较向量A-0正旋转到目标向量A-3是否小于度),实际大于度(蓝色箭头),结果为否,则c值仍为0;2点与1点在Y轴方向上位于A点异侧,side<0(即比较向量A-2正旋转到目标向量A-1是否大于度),实际大于度(红色箭头),结果为是,则c值变为1。最终c&1为奇数,表示A点在obstacle之内。
对于右图A点情况,0点与3点在Y轴方向上位于A点异侧,0.y<3.y,side>0(即比较向量A-0正旋转到目标向量A-3是否小于度),实际小于度(红色箭头),结果为是,c值由0变为1;2点与1点在Y轴方向上位于A点异侧,side<0(即比较向量A-2正旋转到目标向量A-1是否大于度),实际大于度(蓝色箭头),结果为是,则c值变为2。最终c&1为偶数,表示A点在obstacle之外。
正旋转相关的知识:叉乘几何含义:须注意:本算法所有的坐标系为上图所示,所以正旋转方向为X轴沿绿三色箭头转到Y轴。
最后依旧借用M星云男神女神镇楼。。