Webots舵轮使用纯追踪算法


前言

对于AGV小车,利用路径规划算法在规划好路径以后,全局路径由一系列路径点构成,这些路径点只要包含空间位置信息即可,也可以包含姿态信息。在上一篇文章中,我们在webots中创建了舵轮小车,在本文中,我们将利用纯追踪算法(Pure Pursuit)来对舵轮小车进行路径点追踪。


一、自行车模型

在这里插入图片描述

上图为几何学自行车模型,假设我们的自行车模型仅在平面上行驶。我们将四轮模型简化为两轮模型,我们可以计算出前轮转向角度δ与轴距L之间的关系:
在这里插入图片描述
R为在给定的转向角δ下后轴遵循着的圆的半径。

二、纯追踪算法

在这里插入图片描述
纯跟踪算法以车后轴为切点,车辆纵向车身为切线,通过控制前轮转角,使车辆可以沿着一条经过目标路点的圆弧行驶,如上图所示。上图中(g_x,g_y )是我们下一个要追踪的路点,它位于我们已经规划好的全局路径上,现在需要控制车辆的后轴经过该路点,表示车辆当前位置(即后轴位置)到目标路点的距离,表示目前车身姿态和目标路点的夹角,那么更具正弦定理我们可以推导出如下转换式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将上式变形可得:
在这里插入图片描述
K为圆弧的曲率,前轮的转向角δ:
在这里插入图片描述

将以上两个式子结合,并且把时间考虑进来可得:

在这里插入图片描述

t时刻车身和目标路点的夹角 α(t)和距离目标路点的前视距离ld的情况下,由于车辆轴距L固定,我们可以利用上式估计出应该作出的前轮转角δ,为了更好的理解纯追踪控制器的原理,我们定义el 为车辆当前姿态和目标路点在横向上的误差,由此可得夹角正弦:

在这里插入图片描述

此时,圆弧弧度为:

在这里插入图片描述

上式可知纯追踪控制器其实是一个横向转角的P控制器,其P系数为l_d^2,这个P控制器受到参数 ld(即前视距离)的影响很大,如何调整前视距离变成纯追踪算法的关键,通常来说,ld 被认为是车速的函数,在不同的车速下需要选择不同的前视距离。

三、Webots中对舵轮使用纯追踪算法

在Webots中新建一个控制器,代码如下:
代码如下(示例):

import time
import numpy as np
from controller import *
import math

robot = Robot()

timestep = int(robot.getBasicTimeStep())

lf_dir = robot.getMotor('lf_dir_motor')
lf_val = robot.getMotor('lf_run_motor')

lb_dir = robot.getMotor('lb_dir_motor')
lb_val = robot.getMotor('lb_run_motor')

rf_dir = robot.getMotor('rf_dir_motor')
rf_val = robot.getMotor('rf_run_motor')

rb_dir = robot.getMotor('rb_dir_motor')
rb_val = robot.getMotor('rb_run_motor')

gps = robot.getGPS("gps")
gps.enable(timestep)

pen = robot.getPen("pen")

k = 0.00001
Lfc = 0.1
Kp = 1.0
dt = 0.032
L = 0.5

# tr_ = 180/3.1415926

def rotation(angle):
    lf_dir.setPosition(angle)
    lb_dir.setPosition(angle)
    rf_dir.setPosition(angle)
    rb_dir.setPosition(angle)


def translation():
    lf_val.setPosition(float('inf'))
    lf_val.setVelocity(leftSpeed)

    lb_val.setPosition(float('inf'))
    lb_val.setVelocity(leftSpeed)

    rf_val.setPosition(float('inf'))
    rf_val.setVelocity(rightSpeed)

    rb_val.setPosition(float('inf'))
    rb_val.setVelocity(rightSpeed)


class VehicleState:

    def __init__(self, x=0.0, y=0.0, yaw=0.0, v=0.0):
        self.x = x
        self.y = y
        self.yaw = yaw
        self.v = v


def update(state, a, delta):
    state.x = state.x + state.v * math.cos(state.yaw) * dt
    state.y = state.y + state.v * math.sin(state.yaw) * dt
    state.yaw = state.yaw + state.v / L * math.tan(delta) * dt   
    # 航向角=后轴瞬时速度*tan前轮转角/轴距
    state.v = state.v + a * dt

    return state

def PControl(target, current):
    a = Kp * (target - current)

    return a


def calc_target_index(state, cx, cy):
    dx = [state.x - icx for icx in cx]
    dy = [state.y - icy for icy in cy]
    d = [abs(math.sqrt(idx ** 2 + idy ** 2)) for (idx, idy) in zip(dx, dy)]
    ind = d.index(min(d))  
    L = 0.0
    Lf = k * state.v + Lfc  

    while Lf > L and (ind + 1) < len(cx):
        dx = cx[ind + 1] - cx[ind]
        dy = cx[ind + 1] - cx[ind]
        L += math.sqrt(dx ** 2 + dy ** 2)
        ind += 1

    return ind


def pure_pursuit_control(state, cx, cy, pind):
    ind = calc_target_index(state, cx, cy)

    if pind >= ind:
        ind = pind

    if ind < len(cx):
        tx = cx[ind]
        ty = cy[ind]
    else:  
        tx = cx[-1]
        ty = cy[-1]
        ind = len(cx) - 1

    alpha = math.atan2(ty - state.y, tx - state.x) - state.yaw  # 计算当前点到目标点的方向角差

    if state.v < 0:  
        alpha = math.pi - alpha

    Lf = k * state.v + Lfc  
    delta = math.atan2(2.0 * L * math.sin(alpha) / Lf, 1.0)  # 计算转向角

    return delta, ind

cx = np.arange(0, 50, 1)
cy = [math.sin(ix / 5.0) * ix / 2.0 for ix in cx]

target_speed = 2.0 / 3.6

T = 1000.0

state = VehicleState(x=-0.0, y=-0.0, yaw=0.0, v=2.0)
lastIndex = len(cx) - 1
time = 0.0 
# print(state.x)
# print("Hello World")

x1= [state.x]
y1 = [state.y]
yaw1 = [state.yaw]
v1 = [state.v]
t1 = [0.0]

target_ind = calc_target_index(state, cx, cy)
    
while robot.step(timestep) != -1:
        
    ai = PControl(target_speed, state.v)
    di, target_ind = pure_pursuit_control(state, cx, cy, target_ind)
    print("di:", di)
    state = update(state, ai, di)
    print("yaw:", state.yaw)
    time = time + dt

    x1.append(state.x)
    y1.append(state.y)
    yaw1.append(state.yaw)
    v1.append(state.v)
    t1.append(time)

    values = gps.getValues()
    e_node = [-100000000000000, 60000000000000]
    x = values[0]
    y = values[1]
    if x > e_node[0] and y < e_node[1]:
        leftSpeed = 20.0
        rightSpeed = 20.0
    else:
        leftSpeed = 0.0
        rightSpeed = 0.0
    
    rotation(di)
    translation()
    pen.write(True)
    print("MY_ROBOT is at position: %g %g %g" % (values[0], values[1], values[2]))

更多内容请关注微信公众号:深度学习与路径规划
在这里插入图片描述

参考文献:https://blog.csdn.net/AdamShan/article/details/80555174

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 仿真单舵轮AGV控制算法可以分为两个主要部分:导航控制和轮速控制。 导航控制主要包括路径规划和数据处理两个子任务。路径规划是将给定的任务目标转换为规划路径的过程,常见的算法包括A*算法、Dijkstra算法等。数据处理则是对传感器数据进行处理,包括地图构建、障碍物检测和定位等。通过综合考虑路径规划和数据处理,可以实现AGV的导航功能。 轮速控制主要控制AGV的速度和方向,在仿真环境中主要通过控制左右单舵轮的转速来实现。AGV的整体速度可以通过控制两个单舵轮的转速达到期望速度。同时,根据预先规定的轮间角度和仿真环境中的实时位置信息,可以控制轮速差和转向角度,从而实现AGV的转弯和转向。 在实际控制过程中,可以采用PID控制算法对轮速进行控制。PID控制算法通过测量系统偏差(例如:期望速度与实际速度之差),根据比例、积分和微分三个分量对输出信号进行调整,实现对系统的控制。PID控制算法可以通过在线调整各个参数来适应不同的控制需求。 总结起来,仿真单舵轮AGV控制算法主要包括导航控制和轮速控制两个部分。导航控制是通过路径规划和数据处理实现AGV的导航功能,轮速控制是通过控制单舵轮的转速实现AGV的速度和方向控制。在实际控制中,可以采用PID控制算法对轮速进行控制。这些算法的实现可以提高AGV在仿真环境中的导航和控制性能。 ### 回答2: 仿真单舵轮AGV控制算法是一种通过模拟环境中的单舵轮AGV运动特性,实现对AGV路径规划和轨迹跟踪算法。 首先,路径规划是指根据AGV的起始点和目标点,确定AGV应该遵循的最佳路径。常见的路径规划算法包括A*算法、Dijkstra算法和深度优先搜索算法等。这些算法可根据AGV运动约束和环境地图,计算最短路径或最优路径,使AGV能够高效地到达目标点。 其次,轨迹跟踪是指根据路径规划算法得到的路径,控制AGV按照指定的速度和方向进行运动。在单舵轮AGV的控制中,通常采用PID控制算法。PID控制算法可以根据当前位置与目标位置的差异,实时调整AGV的速度和方向,使其能够沿着规划好的路径稳定地移动。通过对PID参数的调整和优化,可以提高AGV的运动性能和控制精度。 此外,在仿真中还可以考虑一些实际场景中的问题,如碰撞回避和动态障碍物避让等。对于碰撞回避,可以采用避障算法,通过AGV周围的传感器检测到障碍物,并进行相应的避让操作,以避免碰撞。对于动态障碍物避让,可以根据障碍物的运动状态进行实时调整和规避。 综上所述,仿真单舵轮AGV控制算法需要结合路径规划和轨迹跟踪算法,通过PID控制实现AGV的运动控制,并考虑碰撞回避和动态障碍物避让等实际场景的问题,从而实现对AGV的准确控制和安全运动。 ### 回答3: 仿真单舵轮AGV控制算法是指通过仿真软件模拟单舵轮AGV的运动控制过程。具体而言,该算法涉及到了AGV的路径规划、位置估计、姿态控制和碰撞回避等方面。 首先,路径规划是仿真单舵轮AGV控制算法的基础。通过输入目标位置和地图信息,算法可以生成一条从起始位置到目标位置的最优路径。常用的路径规划算法有A*算法和Dijkstra算法等。 其次,位置估计是算法中的一个重要环节。通过融合多个传感器的信息,如激光传感器和编码器等,可以实时估计AGV在地图中的位置和方向。 在获取到位置信息后,姿态控制算法会根据目标位置和当前位置的差异计算出控制量,进而控制AGV的转向和速度。单舵轮AGV的转向控制通常采用PID控制算法,通过根据误差信号调节舵轮的转向角度。速度控制可以根据路径规划的结果以及位置信息来调整AGV的速度,使其在路径上保持合适的行驶速度。 此外,碰撞回避是确保AGV安全运行的重要策略。当AGV检测到障碍物时,碰撞回避算法会根据障碍物的位置和运动信息,以及AGV的当前速度和方向等因素,综合判断最佳的避让策略。 综上所述,仿真单舵轮AGV控制算法包括路径规划、位置估计、姿态控制和碰撞回避等多个方面,通过模拟和优化这些步骤,可以实现单舵轮AGV的高效、安全的运动控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值