zoukankan      html  css  js  c++  java
  • 机器人理论与实践(1): 差速驱动原理与python编程模拟 (控制模型建模)

    本文未经本人@Ai酱许可, [禁止转载]

    差速驱动的原理就是:利用左轮和右轮的速度差异来旋转。它的控制命令是[左轮速度,右轮速度,持续时间]。下面这玩意平衡车就是典型的差速驱动。

    在这里插入图片描述
    (图片来自网络)

    本文要解决的问题是:在已知控制命令,和机器人当前时刻的位置,朝向;我们如何求得执行完控制命令后机器人的位置和朝向?

    博主先介绍了差速运动的轨迹与速度之间的联系,然后介绍如何求执行命令后机器人位置和朝向的理论,最后介绍了Python编程实践。

    差速驱动的轨迹与速度之间的联系是什么?

    直接看下面这张图,两个轮子速度不同会让机器人绕着某个点旋转,所以轨迹是一段圆弧。所以只要知道旋转半径R那就可以求得机器人执行命令后所在的位置,以及朝向

    %注意:旋转半径R是待求变量,其他变量都是已知
    在这里插入图片描述
    可以看到左轮速度和右轮速度不一样,它们之间差速会使得j机器人会作一个圆弧形旋转。而由于两个轮子都在同一个旋转半径上,所以角速度一样。虽然我们不知道旋转半径R是多少但是我们知道两个轮子的角速度一样,那么有下面这个等式。
    在这里插入图片描述

    而上等式我们除了R不知道外,其他所有变量都是知道的。所以可以解出旋转半径R。
    在这里插入图片描述
    现在圆弧轨迹的旋转半径求出了那么旋转的轨迹,执行命令后的机器人位置和朝向都是已知的了。
    我们现在已知执行命令前机器人位置为(x0,y0)(x_0,y_0),正面朝向与y轴正方向夹角是θ heta。从下图可以看出机器人的圆弧轨迹的圆心坐标为:
    在这里插入图片描述
    在这里插入图片描述
    注意:当左右两个轮子速度一样时是不会发生旋转的即“机器人是做直线运动”也就没有圆弧这一个概念。
    现在我们知道机器人的圆弧轨迹的圆心坐标为:
    在这里插入图片描述
    现在又知道圆的半径R为了知道命令执行后机器人所在的位置还得求在时长为t的这段时间内圆弧对应的圆心角。而角速度乘上时间t就得到这段时间内机器人转过的角度也就是圆弧对应的圆心角。
    在这里插入图片描述
    我们可以将某个时刻的机器人速度分解成x方向和y方向两个方向的速度
    在这里插入图片描述
    因此在时刻t机器人的位置可以通过积分来求得:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    所以整理上面几个式子可得:
    在这里插入图片描述
    左右两个轮子速度一样时机器人保持直线行驶:
    在这里插入图片描述
    化简可得:
    在这里插入图片描述

    Python编程模拟差速驱动

    # -*- coding: utf-8 -*-
    """
    Created on Fri Aug 23 15:18:57 2019
    差速驱动的python实现
    @author: 李韬@Ai酱
    https://blog.csdn.net/varyshare/article/details/100042079
    """
    from math import sin,cos
    def diffdrive(x, y, theta, v_l, v_r, t, l):
        """
        模拟两个轮子的机器人执行差速驱动控制命令
        :param x,y 当前机器人位置
        :param theta 当前机器人朝向
        :param v_l 左轮速度控制命令
        :param v_r 右轮速度控制命令
        :param t 当前命令持续时间
        :param l 两个轮子的宽度
        :return: 执行命令后机器人到达的位置x_t,y_t
        和它的朝向theta_n
        """
        
        # 1. 先计算机器人朝向角度变化,右轮相对左轮作圆周运动
        # 只有两个轮子之间的差速会改变机器人朝向
        d_v = v_r - v_l
        omega = d_v/(l/2) # 机器人朝向变化角速度
        d_theta = omega *  t
        theta_t = theta + d_theta
        
        
        # 2. 计算t时刻机器人位置
        if v_l == v_r:
            x_t = x + t*(v_l + v_r)/2*sin(theta)
            y_t = y + t*(v_l + v_r)/2*cos(theta)
        else:
            x_t = x + (v_l + v_r)/2 * (-l/d_v*cos(theta + d_v/l*t)+l/d_v)
            y_t = y + (v_l + v_r)/2 * (l/d_v) * sin(theta + d_v/l*t)
        pass
    
        return x_t, y_t, theta_t
    
  • 相关阅读:
    GIT操作远程仓库
    GIT基本使用方式
    Docker网络及私有仓库配置
    Docker容器资源控制
    Docker基本使用方法
    [linux Tcmd] sh source
    hh
    推演论
    智能小车项目计划
    [CATARC_2017S] Week2
  • 原文地址:https://www.cnblogs.com/ailitao/p/11787535.html
Copyright © 2011-2022 走看看