全方位移动全向轮、麦克纳姆轮底盘运动学逆解详解(内含电机输出方程)

  • 开始
  • 输出方程介绍
  • 定义
  • 底盘布局
  • 快速计算函数
  • 主函数
  • 最后

开始

    智能小车全方位移动底盘常用包括:全向轮底盘,麦克纳姆轮底盘(简称麦轮底盘)。以下内容只包括该两种底盘。
    由于特殊的结构,全向轮按轮数分为三轮全向轮,四轮全向轮。

输出方程介绍

  1. 电机输出方程是什么?
        顾名思义就是通过方程计算得到电机运动参数(转速,角度)的方程。确切的来说,作为一个函数,他的入口参数是(vx,vy,vz),通过方程实时计算,实时返回多个电机的转速或角度。
    2.电机输出方程有什么作用?
        首先,我们将小车全方位移动分解为Vx,Vy,Vz,方向上的速度。若想控制小车,只需输入相应方向速度,根据输出方程合成,计算结果输出给相应序号电机。

定义

1.定义一个xyx场地坐标系,一个XYZ机体坐标系.初始情况两坐标系中心重合,夹角α为0.

2.电机逆时针旋转为正值。

3.陀螺仪角度范围为-180-0-180.

4.不管哪种底盘,默认取左上角第一个轮子对应的电机为Motor1,顺时针旋转依次为Motor1,Motor2,Motor3,Motor4

底盘布局

图1 三轮全向轮布局
图2 四轮全向轮布局

图3 四轮麦轮布局

快速计算函数

#define ONE_PI   (3.14159265)float angle_to_radian = 0.01745f;//角度转弧度double mx_sin(double rad)
{   double sine;if (rad < 0)sine = rad * (1.27323954f + 0.405284735f * rad);elsesine = rad * (1.27323954f - 0.405284735f * rad);if (sine < 0)sine = sine*(-0.225f * (sine + 1) + 1);elsesine = sine * (0.225f *( sine - 1) + 1);return sine;
}double my_sin(double rad)
{s8 flag = 1;while(rad > 2*ONE_PI){rad = rad -  2*ONE_PI;}if (rad >= ONE_PI){rad -= ONE_PI;flag = -1;}return mx_sin(rad) * flag;
}double my_cos(double rad)
{s8 flag = 1;rad += ONE_PI/2.0;while(rad > 2*ONE_PI){rad = rad -  2*ONE_PI;}if (rad >= ONE_PI){flag = -1;rad -= ONE_PI;}return my_sin(rad)*flag;
}

主函数

void Task_Auto_Run(unsigned short int motor_mode)
{float a,b,c,ang_motion=imu[z].Relative_Dist;unsigned short int moto_num,motor_num,axis_num;switch (motor_mode){//三轮全向轮case 1: a = (60 + ang_motion)*angle_to_radian; b = (60 - ang_motion)*angle_to_radian; c = (a - b)*0.5f;//c = (0 + ang_motion)*angle_to_radian;motor_num = 3;break;//四轮全向轮case 2: a = (60 + ang_motion)*angle_to_radian; b = (60 - ang_motion)*angle_to_radian; c = (a - b)*0.5f;//c = (0 + ang_motion)*angle_to_radian;motor_num = 4;break;//四轮麦轮case 3: a = (45 - ang_motion)*angle_to_radian;b = (45 + ang_motion)*angle_to_radian;c = a;motor_num = 4;break;}//合成公式speed[MOTOR1] = +my_cos(a)*motion[x].v + my_sin(a)*motion[y].v - motion[z].v;//1******2  speed[MOTOR2] = +my_cos(b)*motion[x].v - my_sin(b)*motion[y].v - motion[z].v;//********speed[MOTOR3] = -my_cos(c)*motion[x].v - my_sin(c)*motion[y].v - motion[z].v;//********speed[MOTOR4] = -my_cos(b)*motion[x].v + my_sin(b)*motion[y].v - motion[z].v;//4******3
}
//详细公式
//  /**************************************************三轮全向轮*****************************************************/
//  speed[MOTOR1] = (+my_cos((60+ang_motion)*angle_to_radian)*motion[x].v + my_sin((60+ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//1********2     /---------\
//  speed[MOTOR2] = (+my_cos((60-ang_motion)*angle_to_radian)*motion[x].v - my_sin((60-ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//**********
//  speed[MOTOR3] = (-my_cos((0 -ang_motion)*angle_to_radian)*motion[x].v - my_sin((0 -ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//****3****       ——//  /**************************************************四轮全向轮*****************************************************/
//  speed[MOTOR1] = (+my_cos((60+ang_motion)*angle_to_radian)*motion[x].v + my_sin((60+ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//1******2   /---------\
//  speed[MOTOR2] = (+my_cos((60-ang_motion)*angle_to_radian)*motion[x].v - my_sin((60-ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//********
//  speed[MOTOR3] = (-my_cos((60+ang_motion)*angle_to_radian)*motion[x].v - my_sin((60+ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//********
//  speed[MOTOR4] = (-my_cos((60-ang_motion)*angle_to_radian)*motion[x].v + my_sin((60-ang_motion)*angle_to_radian)*motion[y].v - motion[z].v);//4******3  \---------///  /***************************************************四轮麦轮**********************************************************/
//  speed[MOTOR1] = (+my_cos((45-ang_motion)*angle_to_radian)*motion[x].v + my_sin((45-ang_motion)*angle_to_radian)*motion[y].v) - motion[z].v;//1******2     \---------/
//  speed[MOTOR2] = (+my_cos((45+ang_motion)*angle_to_radian)*motion[x].v - my_sin((45+ang_motion)*angle_to_radian)*motion[y].v) - motion[z].v;//********
//  speed[MOTOR3] = (-my_cos((45-ang_motion)*angle_to_radian)*motion[x].v - my_sin((45-ang_motion)*angle_to_radian)*motion[y].v) - motion[z].v;//********
//  speed[MOTOR4] = (-my_cos((45+ang_motion)*angle_to_radian)*motion[x].v + my_sin((45+ang_motion)*angle_to_radian)*motion[y].v) - motion[z].v;//4******3    /---------\    /* end of motor_ctrl.c */

最后

1.ang_motion=imu[z].Relative_Dist; //将陀螺仪z轴角度赋值参与运动方程解算。(一般可不用陀螺仪,只需将ang_motion赋值为0即可)
2.当将陀螺仪z轴数据赋值参与运算,需注意z轴数据方向,方程默认顺时针为正。使用陀螺仪即可解锁无头模式。机体坐标系的xy方向只与上电时初始方向有关,运动过程中不管如何旋转,方向不发生改变。参考RM步兵小陀螺,一边自旋一边运动。

    写得简陋,有时间补图,大体都在,推导过程繁琐且网上有大量资源本文不做阐述。这只是和学长交流中无意发现加以总结。

全方位移动全向轮、麦克纳姆轮底盘运动学逆解详解(内含电机输出方程)相关推荐

  1. 麦克纳姆轮PID控制原理

    目录 前言 一.什么是麦克纳姆轮 二.运动原理 ​ 三.pid控制 一.什么是pid? 二.什么是串级PID? 三.麦克娜姆轮的控制思想 总结 前言 目前很多大学生比赛里面经常都会出现麦克娜姆轮,并且 ...

  2. m基于simulink的麦克纳姆轮Back-Stepping控制系统仿真

    目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 3.1概述 3.2麦克纳姆轮 3.3运动分析 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: ...

  3. 【Arduino】麦克纳姆轮原理及驱动程序

    文章目录 Arduino 麦克纳姆轮 麦克纳姆轮全向移动原理[已整理] 麦轮测试程序 Arduino UNO+L298N 带红外控制程序 Arduino UNO+L298N+红外 其他链接: [UGV ...

  4. 基于STM32的麦克纳姆轮小车的寻迹实现

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-27.html 本项目用STM32F407,麦克纳姆轮小车,八路 ...

  5. 四轮 控制算法 麦轮_基于麦克纳姆轮的全向移动自主机器人

    龙源期刊网 http://www.qikan.com.cn 基于麦克纳姆轮的全向移动自主机器人 作者:莫然 张进 高淑芝 来源:<山东工业技术> 2017 年第 08 期 摘 要:设计了一 ...

  6. 麦克纳姆轮全向移动原理

    什么是麦克纳姆轮 在竞赛机器人和特殊工种机器人中,全向移动经常是一个必需的功能.「全向移动」意味着可以在平面内做出任意方向平移同时自转的动作.为了实现全向移动,一般机器人会使用「全向轮」(Omni W ...

  7. 移动机器人技术(8) 麦克纳姆轮全向移动机器人

    什么是麦克纳姆轮 在竞赛机器人和特殊工种机器人中,全向移动经常是一个必需的功能.「全向移动」意味着可以在平面内做出任意方向平移同时自转的动作.为了实现全向移动,一般机器人会使用「全向轮」(Omni W ...

  8. 一文读懂麦克纳姆轮全向移动原理及剖析

    扣扣技术交流群:460189483 参考文章如下,计算过程小白可能看不懂,于是做进一步补充,写出该文 https://zhuanlan.zhihu.com/p/20282234?utm_source= ...

  9. 浅谈麦克纳姆轮全向移动平台之——运动学

    0. 麦克纳姆轮全向移动平台简介 麦克纳姆轮百度词条 还是自己去看百度词条算了,不说太多废话了,简单看看长什么样就行啦. 1. 运动学逆解 入正题入正题,我们直接来聊聊麦克纳姆轮的运动学逆解,正解就不 ...

  10. 麦克纳姆轮全向移动机器人运动模型规律分析

    关注同名微信公众号"混沌无形",有趣好文! 原文链接:https://mp.weixin.qq.com/s/GWhlXsuY6QYyoZydaSYpjQ(包含原文PDF百度云下载链 ...

最新文章

  1. Android View 测量流程(Measure)完全解析
  2. python3 from import 与 import 区别
  3. TikTok又添劲敌 Meta元宇宙携Reels宣战
  4. 一个改进的小要求--限定随机数的个数,生成的随机数总和在一定范围内
  5. java.sql.SQLException: ORA-00911: 无效字符 解决方法
  6. Flex 布局 - 容器
  7. 使用自己的数据训练Yolov4-tiny模型,并用tensorrt运行(配置github host、编译安装opencv4.1.1+contrib和darknet、制作数据集、训练全流程)
  8. 保障健康睡眠的几种食疗法
  9. Angular 学习笔记 Material
  10. [走走看看]转载两篇文章:挂牌和追经
  11. 微信点击右上角 在浏览器中打开代码
  12. FDTD PDMS光学参数txt文档
  13. 华为云ECS服务器中通过docker部署sentinel-dashboard
  14. 2018ICPC焦作站 B - Ultraman vs. Aodzilla and Bodzilla(贪心)
  15. 很酸-2021年全球程序员收入报告出炉
  16. 男生们,请珍惜爱你的女人!
  17. SLAB SLUB
  18. 《长尾理论》读书笔记------”长尾法则--怎样创造一个消费天堂“
  19. 点击导航栏切换不同的页面
  20. systemctl理解

热门文章

  1. 【贪心算法】Wooden Sticks(资源调度问题)
  2. 启动计算机按住del不放,电脑黑屏bios界面都进不去怎么办
  3. bochs在安卓上模拟kali linux系统
  4. .net\C#基于zxing的彩色、Logo二维码生成---随笔
  5. That's why you go away
  6. java 登录12306_请教java尝试模拟登录12306时遇到的一个问题
  7. openstack资料
  8. Task01:基于逻辑回归的分类预测
  9. Pre-trained Adversarial Perturbations-对抗机器学习论文
  10. 到底什么是非线性优化?