Webots控制两轮差速机器人从一个点到另一个点

新建一个控制器,命名为get_to_goal.py

Webots运行视频如下:

Webots编写控制程序使二轮差速小车导航至目标点

控制器代码如下

from controller import Supervisor
import math
import random

robot = Supervisor()
# get the time step of the current world.
timestep = int(robot.getBasicTimeStep())

#获取电机
motor_right = robot.getDevice("motorRight")
motor_left = robot.getDevice("motorLeft")

#设置电机模式与电机初始速度
motor_right.setPosition(float("inf"))
motor_right.setVelocity(0.0)
motor_left.setPosition(float("inf"))
motor_left.setVelocity(0.0)


name = robot.getFromDef("car")

# 格式化x和z,保留小数点后四位
# robot_x = float("{:.4f}".format(x))
# robot_z = float("{:.4f}".format(z))
# print("X坐标:", robot_x)
# print("Z坐标:", robot_z)


# 假设机器人当前在原点且朝向与y轴负方向一致
CURRENT_ANGLE = -math.pi / 2

# 定义移动速度和角速度
LINEAR_SPEED = 3.14  # 线性速度,单位:米/秒

def get_to_goal(name, target_x, target_z, CURRENT_ANGLE):
    robot_x, robot_z = car_position(name)
    # 目标点与机器人之间的相对角度
    # math.atan2返回值的范围是从 -π 到 π(不包括π),表示的是 (x, y) 点与原点的连线与正x轴之间的夹角(以弧度为单位)
    target_angle = math.atan2(target_z - robot_z, target_x - robot_x)
    print("目标点与机器人之间的相对角度:", target_angle)
    angle_difference1 = target_angle - CURRENT_ANGLE
    # 到达目标点所需的角度差, 未考虑angle_difference1=NaN
    if angle_difference1 > math.pi:
        angle_difference = angle_difference1 - 2 * math.pi
        print("到达目标点所需的角度差:", angle_difference)
    else:
        angle_difference = angle_difference1
        print("到达目标点所需的角度差:", angle_difference)
    rotate_to_target_angle(name, -angle_difference) # 仿真方向与正常方向相反
    move_to_target(name, target_x, target_z)


def car_angle(name):
    rotation = name.getField("rotation")
    WorldRot = rotation.getSFRotation()
    qx, qy, qz, qw = WorldRot
    # theta = 2 * math.acos(qw)
    return qw
def car_position(name):
    trans = name.getField("translation")
    WorldCoord = trans.getSFVec3f()
    x, _, z = WorldCoord
    return x, z

# 首先旋转到目标角度
def rotate_to_target_angle(name, target_angle):
    # 对应仿真左转
    if target_angle - car_angle(name) > 0:
        motor_left.setVelocity(LINEAR_SPEED/8)
        motor_right.setVelocity(-LINEAR_SPEED/8)
        while robot.step(timestep) != -1:
            if car_angle(name) >= target_angle:
                motor_left.setVelocity(0.)
                motor_right.setVelocity(0.)
                return
    # 对应仿真右转  car_angle为负
    if target_angle - car_angle(name) < 0:
        motor_left.setVelocity(-LINEAR_SPEED/8)
        motor_right.setVelocity(LINEAR_SPEED/8)
        while robot.step(timestep) != -1:
            # print("car_angle" + str(car_angle(name)))
            if car_angle(name) <= target_angle:
                print("car_angle" + str(car_angle(name)))
                print("target_angle" + str(target_angle))
                motor_left.setVelocity(0.)
                motor_right.setVelocity(0.)
                return

# 旋转到目标角度后,直线移动到目标点
def move_to_target(name, TARGET_X, TARGET_Y):
    left_speed = LINEAR_SPEED
    right_speed = LINEAR_SPEED

    # 负号对应仿真前进直线移动
    motor_left.setVelocity(-left_speed)
    motor_right.setVelocity(-right_speed)
    while robot.step(timestep) != -1:
        x, z = car_position(name)
        dis = math.sqrt((TARGET_X - x) ** 2 + (TARGET_Y - z) ** 2)
        # print("dis:", dis)
        if dis <= 0.01:
            print("x:" + str(x))
            print("z:" + str(z))
            motor_left.setVelocity(0)
            motor_right.setVelocity(0)
            return
while True:
    x = random.uniform(0, 0.4)
    y = random.uniform(0, 0.4)
    print("x:" + str(x))
    print("y:" + str(y))
    get_to_goal(name,x, y, CURRENT_ANGLE)


好的,我可以帮你建立一个适合PID控制两轮差速机器人传递函数。请注意以下假设: - 机器人是一个平面机器人,可以沿x轴和y轴移动。 - 机器人有两个轮子,每个轮子都有一个电机来控制它的旋转。 - 机器人可以通过控制两个电机的旋转速度来移动。 在这个假设下,我们可以建立一个传递函数,它将两个电机的转速作为输入,并输出机器人的位置和方向。这个传递函数可以表示为: G(s) = k / (s^2 + 2ζω_n s + ω_n^2) 其中,k是一个比例常数,可以用来调整输入和输出之间的比例关系。ζ是阻尼比,ω_n是自然频率,它们可以用来调整系统的响应速度和稳定性。 对于一个差速机器人,我们可以将它的运动分解为两个部分:旋转和平移。旋转是由两个轮子的转速差引起的,而平移是由两个轮子的平均速度引起的。因此,我们可以将机器人的运动分为两个传递函数:一个旋转传递函数和一个平移传递函数。 旋转传递函数可以表示为: G_r(s) = k_r / (s + τ_r) 其中,k_r是旋转传递函数的增益,τ_r是旋转的时间常数。这个传递函数描述了机器人如何旋转,可以用来控制机器人的方向。 平移传递函数可以表示为: G_t(s) = k_t / (s + τ_t) 其中,k_t是平移传递函数的增益,τ_t是平移的时间常数。这个传递函数描述了机器人如何移动,可以用来控制机器人的位置。 最后,我们可以将旋转传递函数和平移传递函数组合起来,得到整个机器人的传递函数: G(s) = G_r(s) * G_t(s) 这个传递函数可以用来设计PID控制器,以控制机器人的运动。具体的PID控制器设计方法和参数调整方法需要根据具体情况进行,这里不再赘述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值