百度Apollo中轨迹的表示方式

news2024/12/26 22:19:17

    本文只是对于初学者的一种直观普及,以及对于规划路径可视化的另外一种体会。对于做规划控制的工程师来说太简单。只是本人初学者,在学习控制模块时候对于模块输入参数有所迷惑。所以记录一下。

    首先明确轨迹表达的方式,以及对于控制模块输入的轨迹表达方式:

message ADCTrajectory
{
    .......
    repeated apollo.common.TrajectoryPoint trajectory_point;
    repeated apollo.common.PathPoint path_point;
    .......
}

message TrajectoryPoint
{
    // path point
    optional PathPoint path_point = 1;
    // linear velocity
    optional double v = 2;  // in [m/s]
    // linear acceleration
    optional double a = 3;
    // relative time from beginning of the trajectory
    optional double relative_time = 4;
    // longitudinal jerk
    optional double da = 5;
    // The angle between vehicle front wheel and vehicle longitudinal axis
    optional double steer = 6;
}
message PathPoint
{
    // coordinates
    optional double x = 1;
    optional double y = 2;
    optional double z = 3;

    // direction on the x-y plane
    optional double theta = 4;
    // curvature on the x-y planning
    optional double kappa = 5;
    // accumulated distance from beginning of the path
    optional double s = 6;
    // derivative of kappa w.r.t s.
    optional double dkappa = 7;
    // derivative of derivative of kappa w.r.t s.
    optional double ddkappa = 8;
    // The lane ID where the path point is on
    optional string lane_id = 9;
    // derivative of x and y w.r.t parametric parameter t in CosThetareferenceline
    optional double x_derivative = 10;
    optional double y_derivative = 11;
}

    可以看到ADCTrajectory表示一次规划的结果,其中的repeated字段表示数组。有多个轨迹点和路径点组成一段规划的路径。

1,这里有个理解的误区:ADCTrajectory也可以用来表示参考线,也可以用来表示EGO的实际运行路径。

2,TrajectoryPoint中既有Frenet坐标系下的参数:方位角以及曲率也有实际的笛卡尔坐标系下的位置。以上所有信息都来自上游的规划模块。

3,这些轨迹点中包含该点的速度加速度以及在该点的距离信息。这个距离后面会分析。

    有了以上信息后,发现控制模块的很多参数是已知的,比如速度,距离等信息。所有后端的控制模块的逻辑只需要更具这些轨迹中的要求去执行。至于规划的路径中各个点的速度,距离,方位角信息就是规划模块计算处理的结果。在做模拟测试的时候可以模拟路径,按照设计来规划,同时预期的结果可以通过数值分析看看是不是正确。

    分析一下control中的

    apollo_baidu-master/modules/control/testdata/lateral_controller_test/1_planning.pb.txt文件。

    这个文件是测试文件,记录了一段完整的规划路径。这个文件是txt文件格式,可以通过protobuf的API解析。【Apollo中的proto消息太多,又相互include。所以编译的时候发现proto转换后的.cc文件太多,编译太费事。其实可以学习百度使用Bazel的编译方式,每个最小化模块都编译为动态库。只要做增量编译就行,缩短了后续编译的时间。

    首先解析的X,Y的笛卡尔坐标:

     发现是一条近似的直线,也验证了这条规划轨迹是做纵向控制的。这个图的坐标单位没有统一,所以无法从图片中获取斜率。斜率的计算比较粗略。应为认为是直线,在线上任取三个点,三个点分别和前一个点(path_point)做delt(x)和delt(y),随后求出delt(y)/delt(x)。计算出斜率:3.681。

    其次看一下速度:

    速度从0时刻到424时刻也为线性增加,后面趋于平稳。可以后面的加速度做一下结合分析。

    加速度:

     V= a(t)的速度公式可以看出:随着时间的增加,只要a>0,么V是增加的。在0-104区间 加速度减小,128-250区间加速度增加。粗略看下速度的变化图:速度变化变得平缓。从区间 410开始到结束,加速度又波动,但是基本在没有加速的数值间震荡。通过速度图我们看到速度区域平缓,没有明显增加。

    这里有两个问题:

    (1)加速度抖动会不会影响直接的控车效果,车辆会不会出现抖动。

    (2)加速度数值和V的计算关系不能完全安V = a(t)来获取。可能要系数用来矫正,或者采样的精度不够。

    最后看下距离图:

    这应该就是S-T,距离的累加呈线性增加关系。表示车辆在坐标系的运动没有横向的的分量。做的直线运动。随着时间的增加,距离在增加。

     最后讲一下Frenet坐标系的理解。公式不推了网上很多。问题在为什么用这个笛卡尔和Frenet转换的公式,以及什么地方使用。

    SL坐标和frenet坐标系没有直接关系。frenet是自然坐标系的一种表示,就是把物体的运动做切向和法线方向的两个分解。在空间中还有第三个分量,垂直于平面的一个分量。和笛卡尔坐标系的关系如图:

    给定一个点,就可以判断这个点在参考线上的投影点之间的距离(法线方向),至于路程距离(S),其实没明白为什么可以通过参考线的frenet坐标推算出车辆行驶距离(S)。车辆完全可以不按照参考路径来行驶。

    XYZ就是笛卡尔坐标系,xyz就是运动轨迹上一点的切线和法线以及垂直这个平面的z向量。这个坐标系通过积分可以计算出曲线上两个点的距离。就是我们说的S。对于S求导可以得到速度,在对于S求二阶导可以得到加速度。

    我们经常看到SL坐标系,这个坐标系仅仅只是和frenet的计算结果有关系(距离)。这里推荐一篇“古月居”的博客,其中的效果图演示了SL的关系。

Frenet坐标系下的无人车轨迹规划详细讲解与ROS实现 - 古月居 (guyuehome.com)

   S代表了路程的的累加,如同前文分析的情况:当车辆直线匀速运动时,S会随时间的增加呈线性增加的关系。这里其实还有一点当车辆沿直线变加速度后,虽然法线方向没有分量,但是单位时间内行驶的距离一定会变化,因此S的斜率会改变。SL坐标中的S变换不能体现出车辆的实际运行情况。只能判断行驶距离。应为ST的横坐标是时间,而SL的横坐标是参考点法线方向的距离。

   L代表了法线方向的位移距离,当法线方向有加速度后。L就会有数值(横向距离)。 这里开始疑惑了:参考线SL的坐标形式是曲线还是直线?希望知道的老师可以回答一下,谢谢。任意一个参考线上的点L的位移是0。

   可以看下这个函数内部如何使用公式。目睹其实求出S L 以及SL各自的导数。

void TrajectoryAnalyzer::ToTrajectoryFrame(const double x, const double y,
													const double theta, const double v,
													const PathPoint &ref_point,
													double *ptr_s, double *ptr_s_dot,
													double *ptr_d,
													double *ptr_d_dot) const 

    文章很多知识点还没有彻底说明白,如果有误欢迎指正交流,谢谢。

    随后推荐一篇文章:

    Frenet坐标系及其与笛卡尔坐标转换(1)原理 - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C# 基础精讲】数组的创建与操作

数组是C#编程中非常重要的数据结构,它是一种用于存储相同类型元素的集合。通过数组,我们可以方便地访问和处理多个相关数据,这在很多编程场景下都是非常有用的。本文将详细介绍C#数组的创建与操作,包括数组的声明、初始化、访问元…

.bit域名调研

.bit域名研究 问题: .bit域名和ENS域名的相同点?不同点?有什么关系? .bit的定义 .bit 是基于区块链的,开源的,跨链去中心化账户系统.bit 提供了以 .bit 为后缀的全局唯一的命名体系,可用于加密…

半导体器件||的学习

电子管的介绍: 到底什么是电子管(真空管)? - 知乎 芯片破壁者(一):从电子管到晶体管“奇迹”寻踪 - 知乎 晶体管: 什么是晶体管?它有什么作用? - 知乎 改…

Fastjson 使用指南

文章目录 Fastjson 使用指南0 简要说明为什么要用JSON?用JSON的好处是什么?为什么要用JSON?JSON好处 1 常用数据类型的JSON格式值的范围 2 快速上手2.1 依赖2.2 实体类2.3 测试类 3 常见用法3.1 序列化操作核心操作对象转换为JSON串list转换J…

CAD练习——绘制房子平面图

首先还是需要设置图层、标注、文字等 XL:构造线 用构造线勾勒大致的轮廓: 使用多线命令:ML 绘制墙壁 可以看到有很多交叉点的位置 用多线编辑工具将交叉点处理 有一部分处理不了的,先讲多线分解,然后用修剪打理&…

一站式印度跨境电商平台开发--多用户购物商城搭建

搭建一个一站式印度跨境电商平台开发,需要考虑以下几个方面:平台设计,技术架构,多用户购物商城搭建。 一、平台设计: 1. 市场调研:了解印度电商市场的特点和需求,确定目标用户群体。 2. 平台功…

【Q-dir】常用设置分享

Q-dir是一个资源管理器,但有些宝藏设置在初始使用时没有展现,后面配合AHK设置快捷键启动更方便,快捷键推荐winq 点击这个小按钮可以展示导航窗格 此处是设置导航窗格,又名树状列表 点击空白出返回上一页 使用颜色过滤器&…

python几岁可以学零基础,python多大的孩子可以学

大家好,小编为大家解答多大的孩子可以学python的问题。很多人还不知道学python多大年龄可以学,现在让我们一起来看看吧! python编程是现在很多孩子接触编程的好选择,它能够给孩子带来容易入门的效果。那么,python编程少…

灰度非线性变换之c++实现(qt + 不调包)

本章介绍灰度非线性变换,具体内容包括:对数变换、幂次变换、指数变换。他们的共同特点是使用非线性变换关系式进行图像变换。 1.灰度对数变换 变换公式:y a log(1x) / b,其中,a控制曲线的垂直移量;b为正…

有哪些免费的mac虚拟机软件?

在当今数字化时代,虚拟机系统成为许多用户在电脑上同时运行多个操作系统的理想选择。虚拟机系统不仅能够提供隔离环境,还可以帮助用户在单一设备上使用多个操作系统和应用程序。然而,有些用户可能会面临安装软件和提高虚拟机性能的挑战。下面…

设计方法编写测试用例---思路分析

测一四年我在YX公司带测试团队,一个用例评审的会议上,一不小心超常发挥,结果卡在了一个用例设计方法上,印象非常深刻,当时的业务场景是支付方式的选择和优惠方案。 在后来的工作中,也曾几次遇到需要选择合…

Games101学习笔记 -光栅化

光栅化 经过MVP矩阵和视口变换后,我们就可以从相机的角度看到一个和屏幕大小一致的二维平面。 那么把这个看到的二维平面应用到我们的屏幕上的过程就是光栅化。在这儿我们需要补充一个概念-像素: 像素: 一个二位数组,数组中每个…

Games101学习笔记 - MVP矩阵

MV矩阵(模型视图变换) 目的,把摄像机通过变换移动的世界坐标远点,并且朝向与Z轴的负方向相同。这个变换就是模型试图变换。 因为移动了相机,如果想保持正确的渲染的话,那么对应的物体需要要和相机保持相对…

【问题解决:在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-遗留问题-开机自启动can】

【问题解决在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-遗留问题-开机自启动can】 1、概述2、实验环境3、问题描述# 1-1、发送可以发送,但是PC发送数据收不到。# 1-2、接收是可以接收,但是发送PC收不到数据 4、解决方式(1&#xff…

常用的负载均衡算法(NGINX篇)

负载均衡算法用于在多个服务器或资源之间分配工作负载,以优化资源利用率、降低延迟、提高吞吐量并确保系统的容错性。 这里介绍并实验4种负载均衡算法(随机的方法理论上也算,但一般不会这么搞),在NGINX上。 目录 轮询…

Vue 插槽 slot

solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。 2.6.0 版本以下的 slot 插槽在,2.x版本将继续支持,但是在 Vue 3 中已被废弃,且不会出现在官方文档中。 作用 插槽 prop 允许我们将插槽转换为可复用的模板,这些模板可以基于…

【第一阶段】kotlin的函数

函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范,先有输入( getMethod(name:String,age:Int))再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

拓扑序练习(一)

题目 LintCode127 给定一个有向图,图节点的拓扑排序定义如下: 对于图中的每一条有向边 A -> B , 在拓扑排序中A一定在B之前. 拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点。 如下图所示: 拓扑排序可以为: [0, 1, 2, 3, 4,…

排序八卦炉之总复习【改良版】

文章目录 1.总结2.总代码2.1Stack.h2.2Stack.c2.3Sort.h2.4Sort.c2.5Test.c 1.总结 2.总代码 点击 排序&#xff08;C&#xff09; 跳转码云获取完整代码 2.1Stack.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include …

以http_proxy和ajp_proxy方式整合apache和tomcat(动静分离)

注意&#xff1a;http_proxy和ajp_proxy的稳定性不如mod_jk 一.http_proxy方式 1.下载mod_proxy_html.x86_64 2.在apache下创建http_proxy.conf文件&#xff08;或者直接写到conf/httpd.conf文件最后&#xff09; 3.查看server.xml文件 到tomcat的安装目录下的conf/serve…