Autoware这边也匆忙正式结项了,这OP也是最后一个flag… 在仿真里进行了测试,但是时间匆忙总觉得没有理解透,看了论文把主要和调参有关的提取出来了
之前的一系列关于Autoware的总结 博文Blog:
b站的一系列操作视频:
至此Autoware的小部分探索可能到此结束了,有关几个问题的回复:
因为… 我对Carla比较熟
应该会 因为… 还有很多东西没总结,但是建议做的同学可以自行多看代码,真的是一个比较好的入门大礼包… 建图、定位、感知、规划一应俱全,就是调参可能有点费劲,如果是带着仿真,有时候和仿真的联合也需要考虑(比如carla的时间同步机制坑了我一上午 看现象以为是规划没跟上)
最后:包括这篇和前面的很多篇,可能都有遗留的一系列问题,欢迎大家评论区自行讨论… 如果有空/我知道的话 我也会尽量留言的,后面主要去准备毕业论文选题啥的去了… 探索其他cs285、carla系列、论文阅读应该还会继续的,以上,谢谢观看了;另外致谢Autoware的整个团队对于这个.ai系列的开源工作!TQL!!!
参考与引用 [reference]:
同时OpenPlanner也在更新第二版
更新日记:
20220523:更新评论区讨论至文中,在轨迹判断时使用更为准确性的描述
20220522:修改markdown 重构文章内容,删除notion外链
界面里进行设置的这两个参数:
为下图中所示的car tip和roll in距离
The closest section to the vehicle is the car tip margin, which is the distance from the center of the robot to the point of lateral sampling, the length of which determines the smoothness of steering when switching between trajectories.
The next section is called the roll-in margin, which is the distance from the outer limit of the car tip margin to the point of parallel lateral sampling, the length of which is proportional to the vehicle’s velocity. The faster the vehicle is traveling, the longer this section should be to generate smooth change.
The section farthest from the vehicle is called the roll-out section, which runs from the outer limit of the roll-in zone to the end of the length of the local trajectory.
原始参数设置是在:op_trajectory_generator这个节点
有待看具体的代码 看看单位是m嘛?如果是m会不会太长了一点
下面这里最大规划距离maximum planning distance应该怎么确定?
在common参数里有Path distance,确定一下是否是这个
这里的垂直路径点是指?垂直于什么的?垂直区域的话就直接指向天了
这里指出了横向距离是0,所以为啥还要写垂直路径点,直接longitudinal不就行了?
使用局部路径规划算法生出roll-outs的时候有三个步骤
利用现在的位置和最大规划距离从全局路径中提取interest区域
sample 新的垂直路径点对应于全局路径中提取的区域,sample的点是从car-tip margin处出发的,但是横向的 lateral距离是0,然后再sample延伸到roll-in区域的边界,再根据有的路径计算roll_out density
使用conjugate gradient平滑每一个sampled的轨迹,conjugate gradient是一种非线性 non-linear iterative optimization technique 消除在sample过程中roll-outs之间的不连续的问题
这同时也improve curvature使得转弯更顺滑
然后trajectory vertices的密度,是通过 piece wise interpolation 计算得到的
很多参数化的插值方法都对input noise非常敏感,从而影响到输出(比如cubic splines 在输入点距离较近时,输出会有随机的较大的震荡现象;所以这里使用的方法是结合piece wise interpolation和conjugate gradient smoothing去得到更为平滑的轨迹。因为我们输入了vectormap,结果的轨迹通常都满足了kinodynamic
这里主要讲的是避障,obstacle avoidance is the process of selecting the best possible trajectory from the roll-outs generated
输入:roll-outs的轨迹 和检测到的障碍物【会对障碍物在vectormap的某个区域有限制吗?】
输出:selected trajectory
所以我们需要additive cost function去评估每个轨迹,normalized cost measurements:
后面写的是center cost,每一个roll-out出来的轨迹都会计算一下到这条路中心线的距离作为cost值
计算每个生成的路径与障碍物contour point的距离,因为最后的轨迹都是平行于中心轨迹的 所以我们不需要对roll-in的轨迹进行测试;测试使用"point inside a circle" 也就是每一个contour edge提高一个测试点,以此点最近的【论文里没说】waypoint作为中心,半径=半个车宽+detection margin error
在roll-in后计算轨迹与检测到的障碍物的距离【咦和上一点有什么区别嘛?】计算检测到的障碍物的contour point到中心轨迹的距离,使用从每个轨迹到中心轨迹的signed distance去得出collision cost
constrains the vehicle from jumping roll-outs 这可以使得转弯更顺滑
计算方法就是normalized perpendicular distance between roll-outs and currently selected trajectory
关于碰撞测试,基于评论区网友的讨论
@ 车辆_小学生
关于文中的Collision cost的计算,我提供我自己的一点理解,不知道理解的对不对,希望共同探讨一下。 原论文的意思好像是这样。 第一阶段,计算roll in部分的cost:使用point inside a circle的方法来计算。每一条轨迹都需要计算
第二阶段:计算roll out部分的cost:首先只计算障碍我的轮廓点到中心轨迹的距离,然后计算其他和中心轨迹平行的轨迹的cost,方法是在利用不同的轨迹和中心轨迹的的signed distance 来计算。这里signed distance 的意思我的理解是:一个带有正负号的距离。例如:定义中心轨迹的左侧距离为正,右侧距离为负数。
补充以下几点:我重新又阅读了一下阅读,基于之前的理解:
第一阶段:使用point inside a circle的方法来计算,不是每条轨迹都算,而是障碍物的边缘边取一点,以此点做车身+探测误差之和为半径作圆,这一条是障碍测试,不算精确cost,即 一旦有轨迹在圆内,此轨迹就直接被排除外
第二阶段,你说的很有道理,即signed distance是带正负的,按原文的意思是仅计算与中心的轨迹的距离值,剩余都按signed distance来正负offset一下就好了
@ 零尾
第一阶段这块感觉不是很准确,“The obstacle test is achieved using a “point inside a circle” test, where each contour edge provides the test points, circles centers are the way-points, and the radius of each circle is half the vehicle width plus a detection margin of error.” 原文这里说的是:(1)每个轮廓提供测试点;(2)圆的中心是路径点way-points;(3)半径是一半车身宽+检测误差;所以感觉应该是以路径上的路径点画很多圆,然后判断轮廓提供的测试点是否落在这个圆里面。
赞同,第一阶段的判断实际是通过轮廓测试点是否落在圆内判断的
关于输入的障碍物,Autoware的实现在core_perception包里,两种类型:bounding boxes 和cluster of point cloud
Bounding boxes的一直没有输出 建议再次检查一下原因 April 28, 2021
直接拿了groud_truth来做的; July 3, 2021 后面做纯点云识别的时候,发现可能是点云的稀疏程度的原因,也就是Autoware本身拿的64线激光雷达,但是我们是16线的(Carla仿真当时用的也是16线的)
为了保证精度和performance
所以trade-off是:使用小部分sample的contour point from cluster,然后每个障碍物最多用16个点来表示【咦咦咦咦!!】
题外话:如果是传统机器人方法是可以直接cluster of point cloud然后走到costmap再到global 是混合A*
这个max number of contour point也是可以调整的一个参数
Max number of contour point: increasing this number we can achieve finer representation, lead more accurate obstacle avoidance
比如这里是8个contour point来构成的【emmm 那为啥我没输出呢!→ 因为filter cluster最后出来只有两个点了 → 很大可能因为激光雷达线束太低,没有进行调参】contour point的计算流程:
其中一些比较浅显的我就不列入表格中了,可以自行到各自代码的调用出查看 使用条件
参数 | 解释 |
---|---|
path density | 两个waypoint点之间的距离,如果是0.5的话 就是生成的点之间距离0.5m |
Plan Distance | 局部规划的最远距离(默认是80m 但是 因为传感器的限制 其实40m 估计都足以) |
Rollouts Number | 也就是第一部分提到的lattice分出来的支干有多少,在视频里我设置的是8,不然不好切换道路 |
Follow Distance | 跟随距离 但是我没用到 没感觉的一个参数(因为会超车) |
Avoiding Distance | 躲避距离 用了 设的比较远(15-20m)这样可以早一点开始避障 |
Avoidance Limit | |
Lateral Safety | 横向安全距离 建议设大一点 比如1m-2m 不过不用太大了 不然开出车道外面去了 |
Longitudinal Safety | 纵向安全距离 没感觉的一个参数(因为会躲避) |
Distance to closest lane | 也就是多近之内的waypoint算数 |
Prediction distance | 预测的距离 25m其实算远的了 一般看激光雷达的最远测距(但是我仿真直接用的直值) |
Enable Particle Filter prediction | 开启粒子滤波预测?具体代码我没找对应(可以找一下)TODO (但是需要勾选) |
注意是在CARLA内的仿真测试截图,并不是实车测试,相关视频及碎碎念【Autoware与Carla】OpenPlanner 仿真示意 带避障