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

2023-05-16

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

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

开始

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

输出方程介绍

  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);
	else
		sine = rad * (1.27323954f - 0.405284735f * rad);
	if (sine < 0)
		sine = sine*(-0.225f * (sine + 1) + 1);
	else
		sine = 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步兵小陀螺,一边自旋一边运动。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • git图形化管理工具

    一 独立客户端工具 1 GitHub for Desktop 全球开发人员交友俱乐部提供的强大工具 xff0c 功能完善 xff0c 使用方便 对于使用GitHub的开发人员来说是非常便捷的工具 界面干净 xff0c 用起来非常顺手 xff
  • ROS功能包

    ROS package介绍 package是什么呢 xff1f 指的是一种特定的文件结构和文件夹组合 通常将实现同一个具体功能的程序代码放到一个package中 xff0c 比如实现相机数据采集这一功能 文件结构 CMakeLists tx
  • 坐标转换tf

    tf介绍 坐标转换 TransForm 位置和姿态 坐标变换是空间实体的位置描述 xff0c 是从一种坐标系统变换到另一种坐标系统的过程 通过建立两个坐标系统之间一一对应关系来实现下图为机器人几个部件之间的坐标关系 tf概念 tf是一个用户
  • 经典Windows编程书单

    说好的这次写一个图形编程书单 但是看起来不是很好整理 xff0c 这类书散落的家里到处都是 先把经典Windows编程的书整理一下吧 xff0c 不过Windows的也到处都是很多都找不到了 xff0c 只能把找到的拍个照 xff0c 可能
  • vscode设置C++代码格式化(Clang-Format)

    vscode中只要安装了C C 43 43 扩展后 xff0c 在C C 43 43 源文件中右键就能看到格式化文档的选项 xff0c 这样就能通过该选项或者其快捷键 xff08 Shift 43 Alt 43 F xff09 来实现快速格
  • git pull覆盖了本地未push的代码解决方案

    一 问题背景 情况 xff1a 本地代码写完后 xff0c git push上去github xff0c 然后报错 xff0c 提示要先git pull pull之后 xff0c 失败了或者覆盖了本地未push的代码 二 解决方案 2 1
  • FreeRTOS任务调度原理

    1 FreeRTOS的列表和列表项 列表和列表项是FreeRTOS中一个非常重要的数据结构 xff0c 是FreeRTOS的基石 要想看懂FreeRTOS的源码并学习其中的原理 xff0c 我们必须先了解一下这个数据结构 这个数据结构也是和
  • Go语言学习教程(十四)

    一 反射介绍 在Go语言标准库中reflect包提供了运行时反射 程序运行过程中动态操作结构体 当变量存储结构体属性名称 想要对结构体这个属性赋值或查看时 就可以使用反射 反射还可以用作判断变量类型 整个reflect包中最重要的两个类型
  • 正点原子FPGA学习笔记4.4——UART串口通信,基于达芬奇开发板 A7

    目录 1 环回模块 协调发送接收模块 0 综上 xff0c 信号线如下 xff1a 1 捕捉发送模块传过来recv done信号的上升沿 得到recv done flag 2 recv done flag拉高 xff0c 接收了一帧数据 x
  • UBUNTU 下面的DOCKER使用图形界面

    ubuntu下docker容器中开启图形界面 xff1a 转载自 xff1a https blog csdn net ericcchen article details 79253416 方法一 xff1a 开启SSH服务 详细开启流程 x
  • unbuntu 16.04中编译ffmpeg

    1 xff1a 解压 xff1a sudo tar jxvf ffmpeg 3 4 tar gz2 2 xff1a 更新安装 xff1a sudo apt get update 3 xff1a 安装依赖包 xff1a sudo apt ge
  • git仓库命名规范

    git仓库命名规范 对于git仓库 xff0c 对于git仓库 xff0c 名字不可用下述规定的字符 64 amp xff0c lt gt 43 61 这些字符git不认可 xff0c 默认转成 输入 也会显示转换成 xff0c 如下图所示
  • px4之nuttx操作系统编译

    nuttx 嵌入式操作系统 1 下载源码 https nuttx apache org download 分别下载app和os 下载完毕后 xff0c 解压两个压缩包 2 根据当前嵌入式的开发板子 xff0c 进行配置 span class
  • Ubuntu18.04 安装ROS以及汇总rosdep init与rosdep update执行失败的解决方案

    一 前言 我已经装了不知道多少次ROS xff0c 由于学习需要 xff0c 又一次给新机安装ROS xff0c 还是被安装出错折磨了半天 吃一堑长一智 xff0c 为了防止再次安装时要费时全网搜索解决方案 xff0c 本文准备自己记录一下
  • ROS学习01-NVIDIA JETSON TX2 使用Jetpack4.4刷机指南

    ROS学习01 NVIDIA JETSON TX2 使用Jetpack4 4刷机指南 写在前文 最近入手了一台NVIDIA JETSON TX2想做个机器人小车 xff0c 刚拿到板子的时候发现他上面自带安装的是Ubuntu18 04 xf
  • pytorch: 计算网络模型的计算量(FLOPs)和参数量(Params)

    计算量 xff1a FLOPS xff0c 浮点运算次数 xff0c 指运行一次网络模型需要进行浮点运算的次数 参数量 xff1a Params xff0c 是指网络模型中需要训练的参数总数 第一步 xff1a 安装模块 xff08 tho
  • ROS学习02-拿到NVIDIA JETSON TX2该做些什么

    ROS学习02 拿到NVIDIA JETSON TX2该做些什么 在前一片文章中我们已经将NVIDIA JETSON TX2完美的刷机了 ROS学习01 NVIDIA JETSON TX2 使用Jetpack4 4刷机指南 刷完机后连上显示
  • ROS学习09-NVIDIA JETSON TX2安装配置TOF摄像头Intel® RealSense™ Tracking Camera T265

    ROS学习09 NVIDIA JETSON TX2安装配置TOF摄像头Intel RealSense Tracking Camera T265 这一节继续准备我们机器人的器官 xff0c 在惯性导航方面我们选择了Intel RealSens
  • ROS学习12-NVIDIA JETSON TX2 使用turtlebot3 gazebo模拟仿真机器人

    ROS学习12 NVIDIA JETSON TX2 使用turtlebot3 gazebo模拟仿真机器人 这一节我们要使用turtlebot3搭建一个仿真的机器人及环境 xff0c 这里是基于ROS1中的melodic版本 首先安装turt
  • 全方位移动全向轮、麦克纳姆轮底盘运动学逆解详解(内含电机输出方程)

    全方位移动全向轮 麦克纳姆轮底盘运动学逆解详解 xff08 内含电机输出方程 xff09 开始输出方程介绍定义底盘布局快速计算函数主函数最后 开始 智能小车全方位移动底盘常用包括 xff1a 全向轮底盘 xff0c 麦克纳姆轮底盘 xff0