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

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

在这里插入图片描述

文章目录

  • 移动机器人底盘-四轮差速模型
    • 1. 四轮差速模型原理
    • 2. 工程实践
      • 2.1 Python实现
      • 2.2 C++实现

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)

2. 工程实践

2.1 Python实现

import numpy as npdef forward_kinematics(vl, vr, d):"""正向运动学模型:根据轮子速度计算机器人的运动参数:vl: 左侧轮子的速度vr: 右侧轮子的速度d: 轮子间距返回:x: 机器人的x坐标y: 机器人的y坐标theta: 机器人的角度(弧度)"""R = d / 2.0omega = (vr - vl) / (2.0 * R)v = (vl + vr) / 2.0x = 0.0y = 0.0theta = 0.0if 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_xy = np.sin(omega) * (x - ICC_x) + np.cos(omega) * (y - ICC_y) + ICC_ytheta = theta + omegareturn x, y, thetadef inverse_kinematics(x, y, theta, d):"""逆向运动学模型:根据机器人的位置和角度计算轮子的速度参数:x: 机器人的x坐标y: 机器人的y坐标theta: 机器人的角度(弧度)d: 轮子间距返回:vl: 左侧轮子的速度vr: 右侧轮子的速度"""R = d / 2.0vl = (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;  // xpose[1] = 0.0;  // ypose[2] = 0.0;  // thetaif (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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1598.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鲁棒优化】微电网鲁棒优化定价方案研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

中间件漏洞解析

服务器解析漏洞算是历史比较悠久了&#xff0c;但如今依然广泛存在。在此记录汇总一些常见服务器&#xff08;WEB server&#xff09;的解析漏洞&#xff0c;比如IIS6.0、IIS7.5、apache、nginx等 2|0 二、IIS5.x-6.x解析漏洞&#xff08;针对asa/asp/cer&#xff09; 2|11、打…

HTTP协议

HTTP协议专门用于定义浏览器与服务器之间交互数据的过程以及数据本身的格式 HTTP概述 HTTP是一种客户端&#xff08;用户&#xff09;请求和服务器&#xff08;网站&#xff09;应答的标准&#xff0c;它作为一种应用层协议&#xff0c;应用于分布式、协作式和超媒体信息系统…

FTP服务器

文章目录 FTP服务器FTP的数据传输原理FTP的功能简介不同等级的用户身份命令记录与日志文件记录限制用户活动的目录 FTP的工作流程与使用到的端口FTP主动式连接FTP被动式连接 vsftpd服务器基础设置为什么使用vsftpd所需要的软件以及软件结构vsftpd.conf 配置值说明与服务器环境比…

Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

在进行数据查询时&#xff0c;控制台报了Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1异常&#xff0c;查询得知&#xff1a;这是由于查mysql库&#xff0c;转换类型为datetime类型的字段引起的。 网上的解决方案有多种&#xff0c;大…

SIGGRAPH 2023|你的AI Tony老师上线了,英伟达提出毛发模拟新基线

2018年&#xff0c;网易《逆水寒》与AMD合作开发出来一款名为“海飞丝”的算法&#xff0c;该算法基于AMD的TressFX毛发模拟技术&#xff0c;可以在游戏中较为清晰的模拟人类头发的运动&#xff0c;大大增强了游戏场景的真实感。一个健康的成年人大概拥有10万根头发&#xff0c…

thinkphp 反序列化漏洞

文章目录 配置xdebug反序列化漏洞利用链详细分析poc1&#xff08;任意文件删除&#xff09;poc2&#xff08;任意命令执行&#xff09; 补充代码 配置xdebug php.ini [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php7.3.4nts/ext/php_xdebug.dll xdebug.modedebu…

机器学习之K-means聚类算法

目录 K-means聚类算法 算法流程 优点 缺点 随机点聚类 人脸聚类 旋转物体聚类 K-means聚类算法 K-means聚类算法是一种无监督的学习方法&#xff0c;通过对样本数据进行分组来发现数据内在的结构。K-means的基本思想是将n个实例分成k个簇&#xff0c;使得同一簇内数据相…

井盖异动监测传感器:井盖的安全守护者

随着城市化进程的不断加速&#xff0c;城市道路、人行道上的井盖扮演着重要的角色。然而&#xff0c;由于各种因素&#xff0c;如车辆冲击、材料老化等&#xff0c;井盖常常会出现异动情况&#xff0c;井盖异动不仅对行车和行人的安全构成威胁&#xff0c;还给城市基础设施的维…

机器学习之PCA算法

目录 PCA算法 PCA目标 PCA原理推导 基于最大可分性推导 基于最近重构误差推导 PCA算法流程 PCA优点 PCA缺点 基于PCA的人脸识别 PCA算法 PCA&#xff0c;即主成分分析&#xff08;Principal Component Analysis&#xff09;&#xff0c;是一种常用的降维技术&#x…

0-1BFS 双端队列 广度优先搜索

一. BFS及0-1BFS的简单介绍 深度优先搜索DFS和广度优先搜索BFS是经常使用的搜索算法&#xff0c;在各类题目中都有广泛的应用。 深度优先搜索算法&#xff08;英语&#xff1a;Depth-First-Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。其过程简要来说…

【DBA专属】mysql-------->>>MMM高可用集群架构

Mysql---MMM高可用集群架构 目录 MMM安装部署 环境配置&#xff1a;&#xff08;所有主机配置&#xff09; 1、主机信息 2、关闭防火墙 3、同步时区 4、配置主机解析文件 5、配置ssh免密登录 6、所有机器安装epel源 数据库配置&#xff1a; 【所有数据库均做的配置】…