1.【自动驾驶】笛卡尔坐标系和frenet坐标系相互转换
2.Apollo perception源码阅读 | fusion之D-S证据理论
3.分享Apollo全局规划(Routing)模块最全教程
4.无人驾驶技术入门(十一)| 无人驾驶中的源码CAN消息解析
5.规划控制之轨迹拼接
6.Apollo 8.0 配置参数读取源码解析:以 Planning 模块为例
【自动驾驶】笛卡尔坐标系和frenet坐标系相互转换
自动驾驶中的车辆运动在笛卡尔坐标系和Frenet坐标系之间转换是关键。在笛卡尔系统中,源码车辆运动通过航向角[公式]和曲率[公式]描述,源码而在Frenet坐标(S-L坐标)下,源码车辆运动则用[公式]表示,源码其中下标[公式]和[公式]分别代表车辆和参考点,源码模特 源码对时间求导用点表示,源码对自变量求导用撇表示。源码 Frenet坐标系常用于路径规划,源码通过先在S-L坐标系规划轨迹得到[公式]关系,源码再在S-T图规划速度得到[公式]。源码参考线通常用散点表示,源码包含位置[公式]、源码切线方向[公式]、源码曲率[公式]等信息。源码在Apollo源码中,涉及如下转换:从笛卡尔的[公式]和[公式]转换到S-L的[公式]和[公式]
从S-L的[公式]到笛卡尔的[公式]
例如,从笛卡尔到S-L,首先找到最近的参考点,通过向量关系推导出[公式],然后利用速度关系式[公式],结合向心力类比的Frenet公式推导出[公式]。整个过程涉及速度的定义、链式求导法则和Frenet公式的应用。 在S-L坐标到笛卡尔坐标转换时,通过参考点的几何位置和车辆与参考线的关系,可以计算速度、加速度等参数,从而完成坐标间的转换。这些转换公式确保了自动驾驶系统在不同坐标系间的Xbox源码泄漏运动描述和控制的灵活性和准确性。Apollo perception源码阅读 | fusion之D-S证据理论
本文为Apollo感知融合源码阅读笔记,建议参照Apollo6.0源码阅读本文,水平有限,有错误的地方希望大佬多加指正!
理解D-S证据理论原理,重点在于对交集的乘积求和,关键概念包括mass函数、信度函数和似真度函数。其中,Dempster-Shafer合成公式将单个交集的乘积除以所有交集的乘积,Bel(A)表示找A的子集mass相加,Pl(A)表示找A的交集mass相加。
在Apollo的融合-D-S证据理论中,存在和类型使用D-S证据理论进行更新,详细实现包括Dst、DstManager和DSTEvidenceTest等类。Dst类是核心实现,计算mass函数、信度函数、似真度函数和概率值、不确定性值。DstManager类负责假设空间元素处理,便于Dst类计算。DSTEvidenceTest类提供测试案例。
存在概率融合(existence_fusion)主要在UpdateWithMeasurement函数中实现,根据传感器数据计算当前概率值,然后对观测和航迹概率值进行D-S证据理论融合,得到融合后的概率值。类型融合(type_fusion)同样在UpdateWithMeasurement函数中,pip安装源码假设空间和观测的mass函数初始化后直接合成。
形状更新(fusion-形状更新)部分简单明了,优先使用lidar形状,然后是camera形状,最后使用radar形状进行更新。中心点的更新也直接透传。
结语,文章内容涉及D-S证据理论原理、Apollo源码实现细节以及存在、类型和形状的融合部分。文章结构清晰,深入浅出地介绍了Apollo融合部分的核心算法和实现逻辑。通过理解D-S证据理论及其在Apollo中的应用,读者可以更好地掌握感知融合的原理和实现方法。
分享Apollo全局规划(Routing)模块最全教程
本文提供Apollo全局规划(Routing)模块的全面解读,旨在帮助学习全局路径规划及理解Apollo框架。资料内容丰富,覆盖源代码注释(包含详尽代码注释)、流程图(使用思维导图及各种框架流程图)、核心算法解读(每个涉及算法均有解析及推导)、相关软件工具链学习(如C++、Python、ROS、Ubuntu、Git等)、行业现状及报告等多个方面。此套资料颗粒度极高,总结整理不易。 如需获取资料,伪装定位源码请私聊或访问链接:mbd.pub/o/m/author-aWuU... 获取资料后,后续有任何问题可随时咨询。 以下是学习资料列表概览: 资料数量众多,每份文档通常超过几十页,内容详细深入。部分资料截图如下: 扩展学习资源: 欲了解Apollo其他模块,推荐以下资源:分享Apollo决策规划(planning)模块最全教程 - 知乎 (zhihu.com)
分享Apollo预测(prediction)模块最全教程 - 知乎 (zhihu.com)
分享Apollo控制(control)模块最全教程 - 知乎 (zhihu.com)
无人驾驶技术入门(十一)| 无人驾驶中的CAN消息解析
前言
本文聚焦于无人驾驶技术中至关重要的CAN总线机制。在无人驾驶系统中,CAN总线扮演着不可或缺的角色,不仅用于传输VCU信号,还涉及雷达、Mobileye等传感器的数据交换。
实现一个完整的无人驾驶系统需涉及感知、融合、规划与控制等多个层级。在这篇分享中,重点探讨了“驱动层”相关的CAN总线内容。
正文
作为高效可靠的通信机制,CAN总线在汽车电子领域广泛应用。本文着重于解释在无人驾驶系统接收到CAN消息后,如何利用CAN协议解析出所需数据,解析传感器信息是自动驾驶工程师的核心技能。
认识CAN消息
以Apollo开源代码为例,剖析CAN消息结构,包括ID号、长度、数据和时间戳。ID号用于确认节点间通信,扩展帧和普通帧的凝思内核源码区分依据于此。长度表示数据量,最多8个无符号整数或8*8个bool类型数据。数据部分是消息的核心,通过8*8方格可视化,解析变得直观。时间戳记录接收时刻,用于判断通信状态。
认识CAN协议
业界使用后缀为dbc的文件存储CAN协议,Vector公司的CANdb++ Editor软件专门用于解析dbc文件。Mobileye的车道线信息通过dbc文件格式传递,以ID号0x的LKA_Left_Lane_A为例,解析信号包括类型、质量、曲率等物理量。通过软件界面直接关联彩色图与data,解析过程变得清晰。
解析CAN信号
解析过程基于彩色图与data的一一对应关系,通过叠加图表,揭示数据结构。对于Factor为1的物理量,解析直接。Factor为小数的物理量则需运用位移运算。以Apollo源码为例,通过移位和位运算解析出完整物理量。
与CAN类似的通信协议
虽然传感器采用不同通信方式,如雷达、激光雷达、GPS和惯导,但解析方法保持一致。解析的关键在于理解信号的类型、值和单位。
结语
本篇分享全面解析了CAN总线消息的解析过程,涵盖了无人驾驶系统驱动层的基本理论。解析ID不同的CAN消息结构要求高度细致,避免后续处理中的意外错误。如有疑问,欢迎在评论区互动。赞赏与关注是对文章价值的直接体现。
获取相关软件和文件的方法,请关注公众号:自动驾驶干货铺,后台回复“CAN”获取。更多Mobileye资料和技术支持,值乎平台提问。
规划控制之轨迹拼接
自动驾驶系统中,planning模块输出轨迹信息作为control模块输入。这些信息包括一系列点的位置(x, y, θ)、曲率(κ)、时间(t)、速度(v)和加速度(a)。control模块频率通常高于planning频率,因此,平滑的轨迹转换至关重要以避免控制抖动。
规划起点的选取直接影响控制稳定性。通常,一些同学可能直接使用当前车辆位置作为起点。理论上,如果控制跟踪和定位完美,这种方法可行。然而,实践中,由于各种定位误差和控制误差/滞后问题的累积,使用当前位置作为起点会导致控制抖动。
考虑如图所示的情况。pos_last为上一帧车辆的实际位置,红线为规划轨迹。在下一帧,车辆移动到pos_cur,若规划起点选择pos_cur,轨迹终点保持不变,规划的轨迹变为蓝色曲线。两条曲线在起点附近存在差异,这将引起控制抖动,导致轨迹不连续。
此外,使用实际位置作为起点还可能导致车辆发散,跟踪误差逐渐增加,偏离初始参考线。以一维速度跟踪为例,假设当前为减速过程。如果使用上一帧的实际速度规划减速曲线,经过一帧,由于实际速度跟踪或解算存在误差,目标速度m/s变为m/s;使用实际速度作为起点,下一帧将按照m/s速度重规划轨迹;若目标速度进一步变为m/s,实际自车将加速,而非预期的减速效果。
引入实际速度导致了这一问题,实际速度包含了跟踪误差和定位误差。如果以实际速度重规划,可能导致误差进一步发散,产生相反效果。因此,规划起点在允许的跟踪误差范围内不应选择实际位置。
理想的实践方式是,在终点(参考线)不变的情况下,无障碍等场景下,规划输出的轨迹线保持不变(至少位置不变)。在经过一帧后,从pos_last到pos_cur,为了保证轨迹连续性,当前帧规划起点应选择在last_traj与pos_cur最近的投影点上,一般需增加dt的向前预测量。得到投影点信息后,即可规划出与上一帧轨迹完全重合的cur_traj曲线。即使当前位置不在轨迹上,但连续性得到保证,使得控制连贯,避免了跳变。
在设置pos_cur和投影点的偏差阈值时,若两者距离过大,说明控制难以跟上规划轨迹。此时,应考虑实际位置进行进一步规划。例如,设定阈值为cm,当车辆位置距离轨迹线cm时,可将起点设定为离投影点cm的位置。这样做主要是为了避免使用投影点规划导致的控制超调,从而产生更大的轨迹偏差。
基于Python的简单实现展示了轨迹拼接算法。实际工程实现时,方法类似,可参考Apollo源码。轨迹规划使用样条曲线设计。初始时,设置起点和终点信息,计算三阶样条曲线系数,规划出S型曲线last_traj。经过一帧,车辆从pos_last移动到pos_cur,在红色last_traj曲线上求得最近点作为当前帧规划起点,终点仍为设定值,使用三阶样条曲线求系数,得到蓝色的cur_traj。last_traj和cur_traj高度重合,实现了上下帧轨迹间的无缝衔接。在实际应用中,需要考虑时间、速度等维度的信息,但该方法的思想保持一致。
Python源码如下:
Apollo 8.0 配置参数读取源码解析:以 Planning 模块为例
目录
在本篇讨论中,我们将剖析 Apollo 8.0 配置参数的读取过程,以 Planning 模块为例进行深入探讨。
1. 配置参数分类
了解 Apollo 中各模块的启动机制,主要通过主文件 mainboard 编译生成的可执行文件以及动态链接库的加载实现。Planning 模块的 DAG 文件 (apollo/modules/planning/dag/planning.dag) 指定了模块的动态链接库和单个组件 PlanningComponent 的配置。
配置参数分为两类:基于 ProtoBuf 的参数和 gflags 命令行参数。Planning 模块的 ProtoBuf 配置文件为 (apollo/modules/planning/conf/planning_config.pb.txt),与之对应的 ProtoBuf 接口文件为 (apollo/modules/planning/proto/planning_config.proto)。而 gflags 命令行参数配置文件为 (apollo/modules/planning/conf/planning.conf)。
1.1 ProtoBuf 参数
ProtoBuf 参数通过 module_config.components.config.config_file_path 指定配置文件路径,文件中的参数在组件初始化时被读入 ProtoBuf 对象。
1.2 gflags 命令行参数
gflags 参数通过 module_config.components.config.flag_file_path 指定,文件中的命令行参数在初始化时由 gflags 解析。
2. 配置参数读取流程
主入口文件 (apollo/cyber/mainboard/mainboard.cc) 的 main 函数负责加载 DAG 文件并启动模块。解析命令行参数、读取 DAG 文件、执行模块加载逻辑。
2.1 加载 DAG 文件
解析命令行参数形成 ModuleArgument,用于存储参数信息。执行主流程时,ModuleController 负责加载所有模块,并处理模块组件的注册、实例化和初始化。
2.2 读取配置参数
ModuleController 通过 LoadModule 方法读取模块配置,具体步骤涉及读取 ProtoBuf 参数和 gflags 命令行参数。
3. 总结
本文通过分析 Planning 模块的配置读取过程,清晰展示了 Apollo 8.0 中配置参数的完整读取流程。通过理解这一过程,开发者能够更深入地掌握 Apollo 的模块启动和配置机制。