阿克曼转向车型导航末段位姿调整控制

1目标

分析RPP算法时控制器算法学习1-RPP受控纯追踪算法发现,在终点时如果角度还有较大偏差,该算法无法进行很好的调整,故开始尝试在末端接近目标点时,用自己的控制算法去调整位姿,姑且命名为TEA算法(Target-End-Adjust Algorithm for Ackermann)
前提 本算法基于自己项目的整体控制策略参见Nav2hunter的控制软件结构设计。 简要说就是采用RPP控制器让小车到达目标正后方一定距离的点(目前设置为2米),把许可误差放得比较大,这样容易到达目标;到达后再用本算法精调位姿进入最终目标。故小车的位置和角度与目标的差值是在一定的范围内的,以此为前提考量设计下面的所有控制策略和控制方法。

2控制思路

2.1 坐标转换

在这里插入图片描述

图1 坐标转换

step1.

将小车当前坐标转换到目标点为原点,目标方向为x轴的坐标系(CSgoal)下,如上图所示。

step2.

末端调整算法的目标就是:在终点前面一小段空间内(红线标记范围),把小车位置点调整到Y=0(或直线误差许可范围内:<=XY tolerance),yaw为0(或yaw误差许可范围内,<=yaw tolerance)

step3.

由调整区间(红线标记)可以大致得到倒车位置和前进位置(两个X值:Xrev和Xfwd)。如果step2的目标没有满足,而小车当前坐标的Xcur>Xrev就开始倒车去调整;而如果Xcur<Xfwd就开始前进去调整;在Xrev和Xfwd之间就按原来行进方向加速到正常行进Vxmax。

step4.

如果满足了step2的要求,则直行进入终点,速度随着距离接近而减慢,直到Xcur=0(或直线误差许可范围内:<=XY tolerance)。

3 算法重点(Step3的调整控制)

3.1问题paraphrase:

  • 已知当前位置 X c u r X_{cur} Xcur Y c u r Y_{cur} Ycur Y a w c u r Yaw_{cur} Yawcur(坐标系CS g o a l _{goal} goal下);当前前进速度 V x c u r Vx_{cur} Vxcur ,前进速度的加速度α固定,忽略角速度的加速度,即不考虑当前的车轮内转角inner-steering-angle,认为需要内转角是多少马上可以切换到(这个简化需要再议)。
  • 控制目标两个:1是位置目标Y=0,2是方向目标Yaw=0。
  • 控制量有两个:前进速度Vx和角速度ω。

3.2 调整策略

为避免来回走重复的路线,故借鉴开车时侧方位停车(或者往侧面挪动)的方法,走S型路线。

  • 在前进的时候,如果还没到Reverse line,期望速度是Vxmax,期望Yaw指向中心线
  • 前进到Reverse line时,开始减速,到后退,期望速度是-Vxmax。但在速度为负之前,期望的Yaw是0(拉直)。
  • 开始后退(Vx为负数)后,期望速度还是-Vxmax,但在到达Foward line之前的期望Yaw是指向中心线。
  • 到达Foward line后,开始减少后退速度(或者叫正向加速吧),逐步到速度为0,再到正向前进,期望的速度都是+Vxmax,但在速度为正之前,期望的Yaw为0。
    整个过程就像往侧面挪车,前进先往侧面打方向,再拉直,后退也是一样需要往里面打方向一段距离后拉直车身,否则就会相同路线来回倒腾,不往侧面靠。网上只找到这个图示,也懒得做动图,就这么看吧
    网络上只找到这个,也懒得做动图,就这么看吧
图2 驾驶移库
  • 从上面的描述,可以估算出橙色线(开始减速)与红色线(极限位置)的距离
    即从Vxmax按固定加速度减速到0的距离:
    Δ x = s = 1 2 v x m a x t 2 = 1 2 v x m a x 2 α \Delta x=s=\frac{1}{2}v_{xmax}t^{2}=\frac{1}{2}\frac{v_{xmax}^{2}}{\alpha} Δx
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在ROS中控制阿克曼转向底盘,可以使用现成的ros-ackermann-msgs和ros-ackermann-drive软件包来实现。以下是基于这两个软件包的阿克曼转向底盘控制程序示例: 1. 安装ros-ackermann-msgs和ros-ackermann-drive软件包 ```bash sudo apt-get install ros-melodic-ackermann-msgs ros-melodic-ackermann-drive ``` 2. 编写控制程序 ```python #!/usr/bin/env python import rospy from ackermann_msgs.msg import AckermannDriveStamped def ackermann_drive(speed, steering_angle): # 初始化AckermannDriveStamped消息 ackermann_cmd = AckermannDriveStamped() # 设置线速度和转向角度 ackermann_cmd.drive.speed = speed ackermann_cmd.drive.steering_angle = steering_angle # 发布AckermannDriveStamped消息 pub.publish(ackermann_cmd) if __name__ == '__main__': try: # 初始化ROS节点 rospy.init_node('ackermann_controller') # 创建AckermannDriveStamped消息发布者 pub = rospy.Publisher('/ackermann_cmd', AckermannDriveStamped, queue_size=10) # 设置速度和转向角度 speed = 1.0 # 线速度 steering_angle = 0.2 # 转向角度 # 循环发送AckermannDriveStamped消息 rate = rospy.Rate(10) while not rospy.is_shutdown(): ackermann_drive(speed, steering_angle) rate.sleep() except rospy.ROSInterruptException: pass ``` 这个程序使用了ros-ackermann-msgs和ros-ackermann-drive软件包来控制车辆的阿克曼转向底盘。在程序中,创建了一个AckermannDriveStamped消息发布者,通过设置线速度和转向角度来控制车辆的运动。同时,程序还需要在ROS中设置好运动控制相关的参数,如车辆的轴距、转弯半径、线速度和角速度等。通过这个程序,可以实现对阿克曼转向底盘的控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值