自动驾驶控制算法之车辆横向控制(project)

news/2023/6/9 19:59:58

本文为深蓝学院-自动驾驶控制与规划-第三章作业

目录

1 projection introduction

2 思路提示

2.1 ComputeControlCmd

2.2 ComputeLateralErrors

3 Corer Case

3.1 Low speed operation

3.2 Extra damping on heading

3.3 Steer into constant radius curve

4 ROS+LGSVL联合仿真

5 深蓝学院-自动驾驶控制与规划-第三章-完整代码


1 projection introduction

本项目希望大家根据Stanley算法实现车辆的横向控制,结合上一章的PID算法实现轨迹跟踪。基本的系统框架已经给出,仅需要完成stanley_control.cpp中todo部分。

给定的系统框架如下

#include "stanley_control.h"#include <algorithm>
#include <iomanip>
#include <utility>
#include <vector>
#include "Eigen/LU"
#include <math.h>using namespace std;namespace shenlan {
namespace control {double atan2_to_PI(const double atan2) {return atan2 * M_PI / 180;
}double PointDistanceSquare(const TrajectoryPoint &point, const double x,const double y) {const double dx = point.x - x;const double dy = point.y - y;return dx * dx + dy * dy;
}void StanleyController::LoadControlConf() {k_y_ = 0.5;
}// /** to-do **/ 计算需要的控制命令, 实现对应的stanley模型,并将获得的控制命令传递给汽车
// 提示,在该函数中你需要调用计算误差
void StanleyController::ComputeControlCmd(const VehicleState &vehicle_state,const TrajectoryData &planning_published_trajectory, ControlCmd &cmd) {}// /** to-do **/ 计算需要的误差,包括横向误差,纵向误差void StanleyController::ComputeLateralErrors(const double x, const double y,const double theta, double &e_y,double &e_theta) {}TrajectoryPoint StanleyController::QueryNearestPointByPosition(const double x,const double y) {double d_min = PointDistanceSquare(trajectory_points_.front(), x, y);size_t index_min = 0;for (size_t i = 1; i < trajectory_points_.size(); ++i) {double d_temp = PointDistanceSquare(trajectory_points_[i], x, y);if (d_temp < d_min) {d_min = d_temp;index_min = i;}}// cout << " index_min: " << index_min << endl;//cout << "tarjectory.heading: " << trajectory_points_[index_min].heading << endl;theta_ref_ = trajectory_points_[index_min].heading;return trajectory_points_[index_min];
}}  // namespace control
}  // namespace shenlan

2 思路提示

从掌握stanley算法到用C++实现还需要思考不少问题

2.1 ComputeControlCmd

ComputeControlCmd是计算控制命令的函数,因此调用计算误差的函数,得到航向误差与横向误差,通过如下公式即可计算出车辆前轮转角

 但是这里还需要考虑车辆转向角有范围,当超过范围则需要取边值

//计算需要的控制命令, 实现对应的stanley模型,并将获得的控制命令传递给汽车
void StanleyController::ComputeControlCmd(const VehicleState &vehicle_state,const TrajectoryData &planning_published_trajectory, ControlCmd &cmd) {
trajectory_points_=planning_published_trajectory.trajectory_points;
double e_y=0.0;
double e_theta=0.0;
cout<< "vehicle_state.heading:" <<vehicle_state.heading <<endl;
ComputeLateralErrors(vehicle_state.x,vehicle_state.y,vehicle_state.heading,e_y,e_theta);
cout<< "e_y:" <<e_y <<endl;
cout<< "e_theta:" <<e_theta <<endl;
cmd.steer_target=e_theta+std::atan2(k_y_*e_y,vehicle_state.velocity);
if (cmd.steer_target>M_PI/4.0){
cmd.steer_target=M_PI/4.0;
}
else if(cmd.steer_target<-M_PI/4.0){
cmd.steer_target=-M_PI/4.0;
}
}

我还把 vehicle_state.heading、e_y、e_theta 输出,便于观察误差是否能快速收敛到0并且稳态误差较小,同时设定最大转角为45度(根据实际车辆可以调整该参数

2.2 ComputeLateralErrors

这一部分需要计算航向误差与横向误差

航向误差:离车辆前轮中心最近点的切线与车辆纵轴之间的夹角,但是我们需要小心此处的正负

横向误差:离车辆前轮中心最近点与车辆前轮中心之间的距离,同时这里也会涉及到正负

在理解算法时可能没有关注到上述两个量的正负,但是用代码实现时,这是非常重要的问题

横向误差:因为当一辆车在参考轨迹的右侧和左侧,转向角必须做出相反的反应,这里通过向量叉乘判断车在参考轨迹的哪一侧

航向误差:会涉及到的问题就是需要把两角之差限制到-pi~pi,因为原始角度会出现差2*k*pi是代表一样的角度,导致把多出来的2*k*pi附加到转向角中

//计算需要的误差,包括横向误差,纵向误差
void StanleyController::ComputeLateralErrors(const double x, const double y,const double theta, double &e_y,double &e_theta) {
TrajectoryPoint target_point=QueryNearestPointByPosition(x,y);e_y=sqrt((target_point.x-x)*(target_point.x-x)+(target_point.y-y)*(target_point.y-y));
double judge=(target_point.y-y)*cos(target_point.heading)-(target_point.x-x)*sin(target_point.heading);
if (judge>0){
e_y=-e_y;
}
e_theta=theta-target_point.heading;
if(e_theta>M_PI){
e_theta-=2.0*M_PI;
}
else if(e_theta<-M_PI){
e_theta+=2.0*M_PI;
}
return;
}

3 Corer Case

3.1 Low speed operation

不适用于停车场景,当倒车时,相反的速度会导致横向误差变化大,使得转向角不够连续变化,不稳定,同时当速度中噪声占比较大,也会对此产生较大影响

因此常常在分母加上一个 soft 项,让分母恒正同时受噪声干扰小

3.2 Extra damping on heading

为了使系统更稳定,可以考虑给航向误差加上一个PD控制

3.3 Steer into constant radius curve

当轨迹追踪一个曲率较大的曲线时,往往需要增加前馈项去增加轨迹跟踪的效果

4 ROS+LGSVL联合仿真

这里是联合仿真的链接

自动驾驶stanley控制(ROS+LGSVL联合仿真)_哔哩哔哩_bilibili

5 深蓝学院-自动驾驶控制与规划-第三章-完整代码

链接自取

百度网盘链接:https://pan.baidu.com/s/1fZEUzXlCGs4bY1oF9Mlp_w?pwd=wotf 
提取码:wotf 

深蓝学院-自动驾驶控制与规划-第三章作业-完整代码-深度学习文档类资源-CSDN文库

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

论文笔记:COCO-CN for Cross-Lingual Image Tagging, Captioning, and Retrieval

COCO-CN用于跨语言图像标记、标题和检索摘要介绍COCO-CN结构应用结论补充摘要 本文从数据和基线方法两方面对跨语言图像标注和检索做出了贡献。我们提出了一种新的中文句子和标记丰富MS-COCO的数据集coco - cn。为了有效的标注获取&#xff0c;我们开发了一个推荐辅助的集体标…

科研快报|二代加三代扩增子测序探究苏铁植物根部复杂微生物群落组成

背景介绍苏铁俗称铁树&#xff0c;是地球上现存最古老的活化石植物&#xff0c;也是种子植物中最原始的种群。我国是世界上苏铁植物资源最丰富的国家之一&#xff0c;本文对我国的特有种德保苏铁&#xff08;Cycas debaoensis&#xff09;和仙湖苏铁&#xff08;Cycas fairylak…

谷歌开发者机器学习词汇表:纵览机器学习基本词汇与概念

选自Google Developers 机器之心编译 机器之心曾开放过人工智能术语集 &#xff0c;该术语库项目目前收集了人工智能领域 700 多个专业术语&#xff0c;但仍需要与各位读者共同完善与修正。本文编译自谷歌开发者机器学习术语表项目&#xff0c;介绍了该项目所有的术语与基本解…

【软考】系统集成项目管理工程师(十五)项目采购管理

一、项目采购管理概述二、项目采购管理子过程1. 编制采购管理计划2. 实施采购3. 控制采购4. 结束采购三、招投标1. 招标人的权利和义务2. 招标代理机构的权利和义务3. 招标方式和招投标程序4. 相关的法律责任一、项目采购管理概述 采购意味着从外界来源获得商品或服务,采购一…

MyBatis一级缓存 二级缓存

MyBatis一级缓存 二级缓存什么是缓存?一级缓存一级缓存失效的四种情况二级缓存怎样开启二级缓存使二级缓存失效的情况二级缓存相关配置缓存查询的数据顺序整合第三方缓存EHCache&#xff08;代替二级缓存&#xff09;什么是缓存? 这是一个地图软件上的根据城市查询模块,对于那…

怎么将微博图片中的水印去掉

微博是活跃比较大的一个社交平台&#xff0c;很多明星都在微博宣传自己的新作&#xff0c;活动等等&#xff0c;我们都知道发布的微博图片都会带有自己的微博账号的昵称&#xff0c;也就是平时所说的水印&#xff0c;很多朋友是不是会经常在微博中保存一些图片来发朋友圈&#…

想方便快捷的分享/收藏图片?试试免费好用的微博/b站图床

苏生不惑第130 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。最近我整理了几个专辑&#xff08;就是文章开头那个来自专辑&#xff0c;收录了我整理的一系列文章&#xff09;&#xff0c;可点击下面链接进入&#xff0c;欢迎在看收藏。玩转微信系…

程序员实习期馒头加酸菜,转正后月薪10K起步:走路都带风!

刚进去职场的新人都不可避免的有试用期一说&#xff0c;试用期基本工资都是不高的&#xff0c;想起小编刚开始入职做第一份工作的时候&#xff0c;还有培训期、试用期、审核期&#xff0c;前期那点工资交了房租吃饭都不够&#xff0c;自己又倔&#xff0c;不愿意开口跟家人找钱…