移动机器人底盘-四轮差速模型(四轮独立)

这篇具有很好参考价值的文章主要介绍了移动机器人底盘-四轮差速模型(四轮独立)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

移动机器人底盘-四轮差速模型

移动机器人底盘-四轮差速模型(四轮独立)

1. 四轮差速模型原理

四轮差速模型底盘实例如下图所示。对于底盘的前轮和后轮来说,其速度是同步的,那么在理想条件下,可以将底盘运动视为以ICR为圆心做圆周运动,对于四个轮子来说,圆周运动的角速度是一致的,圆周运动圆心ICR始终位于底盘几何中心COG的y轴延长线上,ICR与COG之间的距离 d c d_c dc受约束,约束与圆周运动的角速度 ω c \omega_c ωc有关,整个底盘的速度位于速度瞬心COM处,用 v c v_c vc表示,瞬心速度 v c v_c vc由分量 v c x v_{cx} vcx v c y v_{cy} vcy合成,设四个轮子的速度分别为 v 1 v_1 v1 v 2 v_2 v2 v 3 v_3 v3 v 4 v_4 v4,其均由预设目标速度 v i x v_{ix} vix和侧向滑动速度 v i y v_{iy} viy合成 ( i = 1 , 2 , 3 , 4 ) (i=1,2,3,4) i=1,2,3,4,设左轮和右轮之间的轴距为 c c c
移动机器人底盘-四轮差速模型(四轮独立)
圆周运动的角速度公式如式1所示。
ω c = v c d c (1) ω_c=\frac{v_c}{d_c}\tag{1} ωc=dcvc(1)
其中 ω c \omega_c ωc为圆周运动角速度,线速度为 v c v_c vc,圆周运动半径为 d d d。设 d c d_c dc与y轴的夹角为 α c \alpha_c αc,由 v c v_c vc与ICR-COM的垂直关系可得 v c c o s α c = v c x v_ccos\alpha_c=v_{cx} vccosαc=vcx以及 v c s i n α c = v c y v_csin\alpha_c=v_{cy} vcsinαc=vcy,那么综上有式2的约束:
ω c = v c d c = v c c o s α c d c c o s α c = v c x d c y ω c = v c d c = v c s i n α c d c s i n α c = v c y d c x (2) \omega_c=\frac{v_c}{d_c}=\frac{v_ccos\alpha_c}{d_ccos\alpha_c}=\frac{v_{cx}}{d_{cy}}\\ ω_c=\frac{v_c}{d_c}=\frac{v_csinα_c}{d_csinα_c}=\frac{v_{cy}}{d_{cx}}\tag{2} ωc=dcvc=dccosαcvccosαc=dcyvcxωc=dcvc=dcsinαcvcsinαc=dcxvcy(2)
由旋转刚体的四个轮子的角速度一致的条件,式2可以泛化为式3:
ω c = v i d i = v i c o s α i d i c o s α i = v i x d i y ω c = v i d i = v i s i n α i d i s i n α i = v i y d i x (3) \omega_c=\frac{v_i}{d_i}=\frac{v_icos\alpha_i}{d_icos\alpha_i}=\frac{v_{ix}}{d_{iy}}\\ ω_c=\frac{v_i}{d_i}=\frac{v_isinα_i}{d_isinα_i}=\frac{v_{iy}}{d_{ix}}\tag{3} ωc=divi=dicosαivicosαi=diyvixωc=divi=disinαivisinαi=dixviy(3)
由式2和3得式4:
ω c = v c d c = v c x d c y = c c y d c x = v i x d i y = v i y d i x , ( i = 1 , 2 , 3 , 4 ) (4) ω_c=\frac{v_c}{d_c}=\frac{v_{cx}}{d_{cy}}=\frac{c_{cy}}{d_{cx}}=\frac{v_{ix}}{d_{iy}}=\frac{v_{iy}}{d_{ix}},(i=1,2,3,4)\tag{4} ωc=dcvc=dcyvcx=dcxccy=diyvix=dixviy,(i=1,2,3,4)(4)
同时, d i d_i di(其中 i = 1 , 2 , 3 , 4 i=1,2,3,4 i=1,2,3,4)与 d c d_c dc在x轴和y轴上得投影长度满足式5:
d 1 y = d 2 y = d c y − c 2 d 3 y = d 4 y = d c y + c 2 (5) d_{1y}=d_{2y}=d_{cy}-\frac{c}{2}\\ d_{3y}=d_{4y}=d_{cy}+\frac{c}{2}\tag{5} d1y=d2y=dcy2cd3y=d4y=dcy+2c(5)
四轮差速底盘设定左轮、右轮得速度分别为 V L V_L VL V R V_R VR,且在前轮和后轮速度严格同步的情况下,可建立如式6的约束:
V L = v 1 x = v 2 x V R = v 3 x = v 4 x (6) V_L=v_{1x}=v_{2x}\\ V_R=v_{3x}=v_{4x}\tag{6} VL=v1x=v2xVR=v3x=v4x(6)
结合式4、5、6可得式7所示结论:
V L = ω c ⋅ ( d c y − c 2 ) = ω c d c y − ω c ⋅ c 2 = v c x − ω c ⋅ c 2 V R = ω c ⋅ ( d c y + c 2 ) = ω c d c y + ω c ⋅ c 2 = v c x + ω c ⋅ c 2 (7) V_L=\omega_c\cdot(d_{cy}-\frac{c}{2})=\omega_cd_{cy}-\omega_c\cdot\frac{c}{2}=v_{cx}-\omega_c\cdot\frac{c}{2}\\ V_R=ω_c⋅(d_{cy}+\frac{c}{2})=ω_cd_{cy}+ω_c⋅\frac{c}{2}=v_{cx}+ω_c⋅\frac{c}{2}\tag{7} VL=ωc(dcy2c)=ωcdcyωc2c=vcxωc2cVR=ωc(dcy+2c)=ωcdcy+ωc2c=vcx+ωc2c(7)
将式7整理,按照矩阵乘的形式表示就得到了四轮差速底盘的前向运动学关系,如式8所示:
[ v c x ω c ] = [ 1 2 1 2 − 1 c − 1 c ] [ V L V R ] (8) \left[\begin{array}{l} v_{c x} \\ \omega_{c} \end{array}\right]=\left[\begin{array}{cc} \frac{1}{2} & \frac{1}{2} \\ -\frac{1}{c} & -\frac{1}{c} \end{array}\right]\left[\begin{array}{l} V_{L} \\ V_{R} \end{array}\right]\tag{8} [vcxωc]=[21c121c1][VLVR](8)
那么逆向运动学的公式只需要进行简单的逆变换即可得到,四轮差速逆向运动学模型如式9所示:
[ V L V R ] = [ 1 − c 2 1 c 2 ] [ v c x ω c ] (9) \left[\begin{array}{l} V_{L} \\ V_{R} \end{array}\right]=\left[\begin{array}{cc} 1 & -\frac{c}{2} \\ 1 & \frac{c}{2} \end{array}\right]\left[\begin{array}{l} v_{c x} \\ \omega_{c} \end{array}\right]\tag{9} [VLVR]=[112c2c][vcxωc](9)文章来源地址https://www.toymoban.com/news/detail-493515.html

2. 工程实践

2.1 Python实现

import numpy as np

def forward_kinematics(vl, vr, d):
    """
    正向运动学模型:根据轮子速度计算机器人的运动

    参数:
    vl: 左侧轮子的速度
    vr: 右侧轮子的速度
    d: 轮子间距

    返回:
    x: 机器人的x坐标
    y: 机器人的y坐标
    theta: 机器人的角度(弧度)
    """
    R = d / 2.0
    omega = (vr - vl) / (2.0 * R)
    v = (vl + vr) / 2.0

    x = 0.0
    y = 0.0
    theta = 0.0

    if abs(omega) < 1e-10:
        x = v * np.cos(theta)
        y = v * np.sin(theta)
    else:
        ICC_x = x - R * np.sin(theta)
        ICC_y = y + R * np.cos(theta)
        x = np.cos(omega) * (x - ICC_x) - np.sin(omega) * (y - ICC_y) + ICC_x
        y = np.sin(omega) * (x - ICC_x) + np.cos(omega) * (y - ICC_y) + ICC_y
        theta = theta + omega

    return x, y, theta


def inverse_kinematics(x, y, theta, d):
    """
    逆向运动学模型:根据机器人的位置和角度计算轮子的速度

    参数:
    x: 机器人的x坐标
    y: 机器人的y坐标
    theta: 机器人的角度(弧度)
    d: 轮子间距

    返回:
    vl: 左侧轮子的速度
    vr: 右侧轮子的速度
    """
    R = d / 2.0

    vl = (2 * x - theta * d) / (2 * R)
    vr = (2 * x + theta * d) / (2 * R)

    return vl, vr


# 示例使用
vl = 2.0  # 左前轮速度
vr = 3.0  # 右前轮速度
vlr = -1.0  # 左后轮速度
vrr = 2.5  # 右后轮速度
d = 0.5  # 轮子间距

# 正向运动学
x, y, theta = forward_kinematics(vl, vr, d)
print("机器人的位置:(x={}, y={}), 角度:{}".format(x, y, theta))

# 逆向运动学
vl, vr = inverse_kinematics(x, y, theta, d)
print("左前轮速度:{}, 右前轮速度:{}".format(vl, vr))

2.2 C++实现

#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/assignment.hpp>
#include <boost/numeric/ublas/operation.hpp>
#include <boost/numeric/ublas/io.hpp>

namespace ublas = boost::numeric::ublas;

// 正向运动学模型
ublas::vector<double> forward_kinematics(double vl, double vr, double d) {
    double R = d / 2.0;
    double omega = (vr - vl) / (2.0 * R);
    double v = (vl + vr) / 2.0;

    ublas::vector<double> pose(3);
    pose[0] = 0.0;  // x
    pose[1] = 0.0;  // y
    pose[2] = 0.0;  // theta

    if (std::abs(omega) < 1e-10) {
        pose[0] = v * std::cos(pose[2]);
        pose[1] = v * std::sin(pose[2]);
    } else {
        double ICC_x = pose[0] - R * std::sin(pose[2]);
        double ICC_y = pose[1] + R * std::cos(pose[2]);
        pose[0] = std::cos(omega) * (pose[0] - ICC_x) - std::sin(omega) * (pose[1] - ICC_y) + ICC_x;
        pose[1] = std::sin(omega) * (pose[0] - ICC_x) + std::cos(omega) * (pose[1] - ICC_y) + ICC_y;
        pose[2] += omega;
    }

    return pose;
}

// 逆向运动学模型
ublas::vector<double> inverse_kinematics(double x, double y, double theta, double d) {
    double R = d / 2.0;

    ublas::vector<double> wheel_velocities(2);
    wheel_velocities[0] = (2 * x - theta * d) / (2 * R);
    wheel_velocities[1] = (2 * x + theta * d) / (2 * R);

    return wheel_velocities;
}

int main() {
    double vl = 2.0;  // 左前轮速度
    double vr = 3.0;  // 右前轮速度
    double vlr = -1.0;  // 左后轮速度
    double vrr = 2.5;  // 右后轮速度
    double d = 0.5;  // 轮子间距

    // 正向运动学
    ublas::vector<double> pose = forward_kinematics(vl, vr, d);
    std::cout << "机器人的位置:(x=" << pose[0] << ", y=" << pose[1] << "), 角度:" << pose[2] << std::endl;

    // 逆向运动学
    ublas::vector<double> wheel_velocities = inverse_kinematics(pose[0], pose[1], pose[2], d);
    std::cout << "左前轮速度:" << wheel_velocities[0] << ", 右前轮速度:" << wheel_velocities[1] << std::endl;

    return 0;
}

到了这里,关于移动机器人底盘-四轮差速模型(四轮独立)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构

    本文研究的六轮差速移动机器人 (Six-Wheeled Differential Mobile Robot , SWDMR) 为了满足资源站到资源站点对点的物资运输,对机器人的跨越障碍能力 有较高的要求。对比传统的四轮移动机器人,六轮移动机器人能够提供更强的驱动 力,而且六轮与四轮相比整车分散到单个车轮的负

    2024年02月12日
    浏览(36)
  • 四轮转向四轮驱动机器人设计——开题

    一、选题依据(拟开展研究项目的研究目的、意义) 目前机器人领域一个的重要研究方向为四轮转向四轮驱动机器人技术。四轮转向四轮驱动机器人分别在军事方面、工业方面、农业方面都得到广泛应用。四轮转向四轮驱动机器人是一种可以四轮独立转向的移动机器人,其结

    2024年01月20日
    浏览(39)
  • 睿尔曼复合机器人之底盘操作流程

    以操作流程为例,介绍底盘的操作流程。 开机:长按电源按钮,蜂鸣器短响两声,当第三声变长鸣后松开,等待机器开机。 使用: 建立通讯:主要采用无线WiFi与底盘进行通讯连接 无线连接方式:我们可以查看WiFi列表,选择名为“admin_xxxx”,密码是“12345678”。连上WiFi后即

    2024年04月16日
    浏览(21)
  • 使用ros_arduino_bridge控制机器人底盘

      搭建了ROS分布式环境后,将ros_arduino_bridge功能包上传至Jetson nano,就可以在PC端通过键盘控制小车的运动了。实现流程如下: 系统准备; 下载程序; 程序修改; 分别启动PC与Jetson nano端相关节点,并实现运动控制。   ros_arduino_bridge是依赖于python-serial功能包的,需要在

    2024年01月17日
    浏览(28)
  • 纯跟踪算法(Pure Pursuit)在差速机器人上的应用

    Pure Pursuit 是一种路径跟踪算法。 在给定线速度的前提下,它计算移动的角速度令机器人从其当前位置到达机器人前方的某个前瞻点(lookahead)。该算法根据机器人的当前位置不断地追着它前面的一个点,直到路径的最后一个点。 1.差速轮模型  差速轮模型中:         2

    2024年02月11日
    浏览(48)
  • 【ROS2机器人入门到实战】RVIZ2可视化移动机器人模型

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 大家好,我是小鱼,上一节讲完joint和link,我们来把我们上面定义

    2024年02月03日
    浏览(31)
  • STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!

    01 前言 之前,我们出了一系列的STM32机器人控制开发教程,收到不少小伙伴的反馈,于是我们对教程进行了优化,并将增加新的内容和工具。 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口、SWD下载调试接口、航模遥控接口、USB5V输出接

    2024年02月05日
    浏览(105)
  • 机器人制作开源方案 | 桌面级全向底盘--本体说明+驱动控制

          该底盘是一款模块化的桌面级应用型底盘,基于应用级软件架构设计、应用级硬件系统设计、典型应用型底盘机械系统设计。       底盘本体为一个采用半独立刚性悬挂的四驱全向底盘。       操作系统: Ubuntu18.04系统。基于Debian GNU/Linux,支持x86、amd64(即x64)、A

    2024年02月09日
    浏览(32)
  • 4.1底盘基础功能:nmcli命令配置机器人无线网 Xshell中进行(冰达ros机器人例程运行)

    4.1.3nmcli命令配置机器人无线网 Xshell中进行(Xshell此软件安装包在3.windows实用软件当中下载)注:如果没有办法使用直接百度上搜索Xshell官网下载最新版本 配置无线网络视频教程首先准备一台路由器和网线 如下图所示连接小车(注:路由器可以没有互联网) 连上小车后需等

    2024年04月25日
    浏览(35)
  • 【ROS2机器人入门到实战】Gazebo仿真插件之两轮差速

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 小鱼又来了,完成了上节课的Gazebo加载FishBot,但是机器人还是不

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包