麦克纳姆轮全向移动原理

2023-05-16

什么是麦克纳姆轮

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

全向轮:

 

麦克纳姆轮:

 

全向轮与麦克纳姆轮的共同点在于他们都由两大部分组成:轮毂和辊子(roller)。轮毂是整个轮子的主体支架,辊子则是安装在轮毂上的鼓状物。全向轮的轮毂轴与辊子转轴相互垂直,而麦克纳姆轮的轮毂轴与辊子转轴呈 45° 角。理论上,这个夹角可以是任意值,根据不同的夹角可以制作出不同的轮子,但最常用的还是这两种。

全向轮与麦克纳姆轮(以下简称「麦轮」)在结构、力学特性、运动学特性上都有差异,其本质原因是轮毂轴与辊子转轴的角度不同。经过分析,二者的运动学和力学特性区别可以通过以下表格来体现。

 

计算过程如下,供参考,学霸可点开大图验算:

 

近年来,麦轮的应用逐渐增多,特别是在 Robocon、FRC 等机器人赛事上。这是因为麦克纳姆轮可以像传统轮子一样,安装在相互平行的轴上。而若想使用全向轮完成类似的功能,几个轮毂轴之间的角度就必须是 60°,90° 或 120° 等角度,这样的角度生产和制造起来比较麻烦。所以许多工业全向移动平台都是使用麦克纳姆轮而不是全向轮,比如这个国产的叉车: 全向移动平台 麦克纳姆轮叉车 美科斯叉车

另外一个原因,可能是麦轮的造型比全向轮要酷炫得多,看起来有一种不明觉厉的感觉……

 

的确,第一次看到麦轮运转起来,不少人都会惊叹。以下视频直观地说明了麦轮底盘在平移和旋转时的轮子旋转方向。

 

视频封面

麦克纳姆轮工作原理—在线播放—优酷网,视频高清在线观看

视频

麦轮的安装方法

麦轮一般是四个一组使用,两个左旋轮,两个右旋轮。左旋轮和右旋轮呈手性对称,区别如下图。

 

安装方式有多种,主要分为:X-正方形(X-square)、X-长方形(X-rectangle)、O-正方形(O-square)、O-长方形(O-rectangle)。其中 X 和 O 表示的是与四个轮子地面接触的辊子所形成的图形;正方形与长方形指的是四个轮子与地面接触点所围成的形状。

 

  • X-正方形:轮子转动产生的力矩会经过同一个点,所以 yaw 轴无法主动旋转,也无法主动保持 yaw 轴的角度。一般几乎不会使用这种安装方式。
  • X-长方形:轮子转动可以产生 yaw 轴转动力矩,但转动力矩的力臂一般会比较短。这种安装方式也不多见。
  • O-正方形:四个轮子位于正方形的四个顶点,平移和旋转都没有任何问题。受限于机器人底盘的形状、尺寸等因素,这种安装方式虽然理想,但可遇而不可求。
  • O-长方形:轮子转动可以产生 yaw 轴转动力矩,而且转动力矩的力臂也比较长。是最常见的安装方式。

 

麦轮底盘的正逆运动学模型

以O-长方形的安装方式为例,四个轮子的着地点形成一个矩形。正运动学模型(forward kinematic model)将得到一系列公式,让我们可以通过四个轮子的速度,计算出底盘的运动状态;而逆运动学模型(inverse kinematic model)得到的公式则是可以根据底盘的运动状态解算出四个轮子的速度。需要注意的是,底盘的运动可以用三个独立变量来描述:X轴平动、Y轴平动、yaw 轴自转;而四个麦轮的速度也是由四个独立的电机提供的。所以四个麦轮的合理速度是存在某种约束关系的,逆运动学可以得到唯一解,而正运动学中不符合这个约束关系的方程将无解。

先试图构建逆运动学模型,由于麦轮底盘的数学模型比较复杂,我们在此分四步进行:

①将底盘的运动分解为三个独立变量来描述;

②根据第一步的结果,计算出每个轮子轴心位置的速度;

③根据第二步的结果,计算出每个轮子与地面接触的辊子的速度;

④根据第三部的结果,计算出轮子的真实转速。

 

一、底盘运动的分解

我们知道,刚体在平面内的运动可以分解为三个独立分量:X轴平动、Y轴平动、yaw 轴自转。如下图所示,底盘的运动也可以分解为三个量:

v_{t_x} 表示 X 轴运动的速度,即左右方向,定义向右为正;

v_{t_y} 表示 Y 轴运动的速度,即前后方向,定义向前为正;

\vec{\omega} 表示 yaw 轴自转的角速度,定义逆时针为正。

以上三个量一般都视为四个轮子的几何中心(矩形的对角线交点)的速度。

二、计算出轮子轴心位置的速度

定义:

\vec{r} 为从几何中心指向轮子轴心的矢量;

\vec{v} 为轮子轴心的运动速度矢量;

\vec{v_r} 为轮子轴心沿垂直于 \vec{r} 的方向(即切线方向)的速度分量;

 

那么可以计算出:

\vec{v}=\vec{v_t}+\vec{\omega} \times \vec{r}
 

分别计算 X、Y 轴的分量为:

\begin{equation}
\begin{cases}
v_x=v_{t_x}-\omega \cdot r_y \\
v_y=v_{t_y}+\omega \cdot r_x \\
\end{cases}
\end{equation}

 

同理可以算出其他三个轮子轴心的速度。

 

三、计算辊子的速度

根据轮子轴心的速度,可以分解出沿辊子方向的速度 \vec{v_\|} 和垂直于辊子方向的速度 \vec{v_\perp} 。其中 \vec{v_\perp} 是可以无视的(思考题:为什么垂直方向的速度可以无视?),而

\vec{v_\|}=\vec{v} \cdot \hat{u}=(v_x\hat{i}+v_y\hat{j})\cdot(-\frac{1}{\sqrt{2}}\hat{i}+\frac{1}{\sqrt{2}}\hat{j})=-\frac{1}{\sqrt{2}}v_x+\frac{1}{\sqrt{2}}v_y

其中 \hat{u} 是沿辊子方向的单位矢量。

四、计算轮子的速度

从辊子速度到轮子转速的计算比较简单:

v_w=\frac{v_\|}{cos 45^\circ}=\sqrt{2}(-\frac{1}{\sqrt{2}}v_x+\frac{1}{\sqrt{2}}v_y)=-v_x+v_y

 

根据上图所示的 ab 的定义,有

 

\begin{equation}
\begin{cases}
v_x=v_{t_x}+\omega b \\
v_y=v_{t_y}-\omega a \\
\end{cases}
\end{equation}

结合以上四个步骤,可以根据底盘运动状态解算出四个轮子的转速:

\begin{equation}
\begin{cases}
v_{w_1}=v_{t_y}-v_{t_x}+\omega(a+b) \\
v_{w_2}=v_{t_y}+v_{t_x}-\omega(a+b) \\
v_{w_3}=v_{t_y}-v_{t_x}-\omega(a+b) \\
v_{w_4}=v_{t_y}+v_{t_x}+\omega(a+b) \\
\end{cases}
\end{equation}

以上方程组就是O-长方形麦轮底盘的逆运动学模型,而正运动学模型可以直接根据逆运动学模型中的三个方程解出来,此处不再赘述。

另一种计算方式

「传统」的推导过程虽然严谨,但还是比较繁琐的。这里介绍一种简单的逆运动学计算方式。

我们知道,全向移动底盘是一个纯线性系统,而刚体运动又可以线性分解为三个分量。那么只需要计算出麦轮底盘在「沿X轴平移」、「沿Y轴平移」、「绕几何中心自转」时,四个轮子的速度,就可以通过简单的加法,计算出这三种简单运动所合成的「平动+旋转」运动时所需要的四个轮子的转速。而这三种简单运动时,四个轮子的速度可以通过简单的测试,或是推动底盘观察现象得出。

当底盘沿着 X 轴平移时:

\begin{equation}
\begin{cases}
v_{w_1}=-v_{t_x} \\
v_{w_2}=+v_{t_x} \\
v_{w_3}=-v_{t_x} \\
v_{w_4}=+v_{t_x} \\
\end{cases}
\end{equation}

当底盘沿着 Y 轴平移时:

\begin{equation}
\begin{cases}
v_{w_1}=v_{t_y} \\
v_{w_2}=v_{t_y} \\
v_{w_3}=v_{t_y} \\
v_{w_4}=v_{t_y} \\
\end{cases}
\end{equation}

当底盘绕几何中心自转时:

\begin{equation}
\begin{cases}
v_{w_1}=+\omega(a+b) \\
v_{w_2}=-\omega(a+b) \\
v_{w_3}=-\omega(a+b) \\
v_{w_4}=+\omega(a+b) \\
\end{cases}
\end{equation}

将以上三个方程组相加,得到的恰好是根据「传统」方法计算出的结果。这种计算方式不仅适用于O-长方形的麦轮底盘,也适用于任何一种全向移动的机器人底盘。

 

Makeblock 麦轮底盘的组装

理论分析完成,可以开始尝试将其付诸实践了。

第一步,组装矩形框架。

第二步,组装电机模块。

由于麦轮底盘的四个轮子速度有约束关系,必须精确地控制每个轮子的速度,否则将会导致辊子与地面发生滑动摩擦,不仅会让底盘运动异常,还会让麦轮的寿命减少。所以必须使用编码电机。

 

第三步,将电机模块安装到框架上。

 

 

第四步,将麦轮安装到框架上。

 

第五步,安装电路板并接线。

编码电机必须配上相应的驱动板才能正常工作。这里使用的 Makeblock 编码电机驱动板,每一块板可以驱动两个电机。接线顺序在下文中会提及,也可以随意接上,在代码中定义好对应的顺序即可。

 

第六步,装上电池。

 

至此,一个能独立运行的麦轮底盘就完成了。

 

控制程序

根据麦轮的底盘的运动学模型,要完全控制它的运动,需要有三个控制量:X轴速度、Y轴速度、自转角速度。要产生这三个控制量,有很多种方法,本文将使用一个 USB 游戏手柄,左边的摇杆产生平移速度,右边的摇杆产生角速度。

首先将一个 USB Host 模块连接到 Orion 主板的 3 口。

 

然后插上一个无线 USB 游戏手柄。

 

 

然后再添加其他细节,就大功告成啦!

 

 

其他细节:

 

#include <Wire.h>
#include <SoftwareSerial.h>
#include "MeOrion.h"

MeUSBHost joypad(PORT_3);
//	手柄代码(红灯亮模式)
//	默认:128-127-128-127-15-0-0-128
//	左一:128-127-128-127-15-1-0-128
//	右一:128-127-128-127-15-2-0-128
//	左二:128-127-128-127-15-4-0-128
//	右二:128-127-128-127-15-8-0-128
//	三角:128-127-128-127-31-0-0-128 (0001 1111)
//	方形:128-127-128-127-143-0-0-128 (1000 1111)
//	叉号:128-127-128-127-79-0-0-128 (0100 1111)
//	圆圈:128-127-128-127-47-0-0-128 (0010 1111)
//	向上:128-127-128-127-0-0-0-128 (0000 0000)
//	向下:128-127-128-127-4-0-0-128 (0000 0100)
//	向左:128-127-128-127-6-0-0-128 (0000 0110)
//	向右:128-127-128-127-2-0-0-128 (0000 0010)
//	左上:128-127-128-127-7-0-0-128 (0000 0111)
//	左下:128-127-128-127-5-0-0-128 (0000 0101)
//	右上:128-127-128-127-1-0-0-128 (0000 0001)
//	右下:128-127-128-127-3-0-0-128 (0000 0011)
//	选择:128-127-128-127-15-16-0-128
//	开始:128-127-128-127-15-32-0-128
//	摇杆:右X-右Y-左X-左Y-15-0-0-128


MeEncoderMotor motor1(0x02, SLOT2);
MeEncoderMotor motor2(0x02, SLOT1);
MeEncoderMotor motor3(0x0A, SLOT2);
MeEncoderMotor motor4(0x0A, SLOT1);

//  底盘:a = 130mm, b = 120mm

float linearSpeed = 100;
float angularSpeed = 100;
float maxLinearSpeed = 200;
float maxAngularSpeed = 200;
float minLinearSpeed = 30;
float minAngularSpeed = 30;

void setup()
{
    //  要上电才能工作,不能只是插上 USB 线来调试。
	motor1.begin();
	motor2.begin();
	motor3.begin();
	motor4.begin();
	
	Serial.begin(57600);
	joypad.init(USB1_0);
}

void loop()
{
    Serial.println("loop:");
	//setEachMotorSpeed(100, 50, 50, 100);
	if(!joypad.device_online)
    {
        //  若一直输出离线状态,重新拔插 USB Host 的 RJ25 线试一下。
        Serial.println("Device offline.");
        joypad.probeDevice();
        delay(1000);
    }
    else
    {
        int len = joypad.host_recv();
        parseJoystick(joypad.RECV_BUFFER);
        delay(5);
    }
	//delay(500);
}


void setEachMotorSpeed(float speed1, float speed2, float speed3, float speed4)
{
	motor1.runSpeed(speed1);
	motor2.runSpeed(-speed2);
	motor3.runSpeed(-speed3);
	motor4.runSpeed(-speed4);
}

void parseJoystick(unsigned char *buf)   //Analytic function, print 8 bytes from USB Host
{
    //  输出手柄的数据,调试用
    // int i = 0;
    // for(i = 0; i < 7; i++)
    // {
    //     Serial.print(buf[i]);  //It won't work if you connect to the Makeblock Orion.
    //     Serial.print('-');
    // }
    // Serial.println(buf[7]);
    // delay(10);

    //  速度增减
    switch (buf[5])
    {
        case 1:
            linearSpeed += 5;
            if (linearSpeed > maxLinearSpeed)
            {
                linearSpeed = maxLinearSpeed;
            }
            break;
        case 2:
            angularSpeed += 5;
            if (angularSpeed > maxAngularSpeed)
            {
                angularSpeed = maxAngularSpeed;
            }
            break;
        case 4:
            linearSpeed -= 5;
            if (linearSpeed < minLinearSpeed)
            {
                linearSpeed = minLinearSpeed;
            }
            break;
        case 8:
            angularSpeed -= 5;
            if (angularSpeed < minAngularSpeed)
            {
                angularSpeed = minAngularSpeed;
            }
            break;
        default:
            break;
    }


    
    if ((128 != buf[0]) || (127 != buf[1]) || (128 != buf[2]) || (127 != buf[3]))
    {
        //  处理摇杆
        float x = ((float)(buf[2]) - 127) / 128;
        float y = (127 - (float)(buf[3])) / 128;
        float a = (127 - (float)(buf[0])) / 128;
        mecanumRun(x * linearSpeed, y * linearSpeed, a * angularSpeed);
    }
    else
    {
        switch (buf[4])
        {
            case 0:
                mecanumRun(0, linearSpeed, 0);
                break;
            case 4:
                mecanumRun(0, -linearSpeed, 0);
                break;
            case 6:
                mecanumRun(-linearSpeed, 0, 0);
                break;
            case 2:
                mecanumRun(linearSpeed, 0, 0);
                break;
            case 7:
                mecanumRun(-linearSpeed/2, linearSpeed/2, 0);
                break;
            case 5:
                mecanumRun(-linearSpeed/2, -linearSpeed/2, 0);
                break;
            case 1:
                mecanumRun(linearSpeed/2, linearSpeed/2, 0);
                break;
            case 3:
                mecanumRun(linearSpeed/2,  -linearSpeed/2, 0);
                break;
            default:
                mecanumRun(0, 0, 0);
                break;
        }
    }
}

void mecanumRun(float xSpeed, float ySpeed, float aSpeed)
{
    float speed1 = ySpeed - xSpeed + aSpeed; 
    float speed2 = ySpeed + xSpeed - aSpeed;
    float speed3 = ySpeed - xSpeed - aSpeed;
    float speed4 = ySpeed + xSpeed + aSpeed;
    
    float max = speed1;
    if (max < speed2)   max = speed2;
    if (max < speed3)   max = speed3;
    if (max < speed4)   max = speed4;
    
    if (max > maxLinearSpeed)
    {
        speed1 = speed1 / max * maxLinearSpeed;
        speed2 = speed2 / max * maxLinearSpeed;
        speed3 = speed3 / max * maxLinearSpeed;
        speed4 = speed4 / max * maxLinearSpeed;
    }
    
    setEachMotorSpeed(speed1, speed2, speed3, speed4);
}

 

 

转载自:知乎:【学渣的自我修养】麦克纳姆轮浅谈

 

 

//=======================================================================================//

//=======================================================================================//

 

文章中所有图片资料均来自:炽点机器人

 

我们来画个受力示意图吧

先来看看前后移动

图中红色实线箭头是车轮向前转产生的摩擦力

蓝色箭头是车轮向后转产生的摩擦力

虚线是分力

于是左边的小车就会向前跑,右边的小车会向后跑


接下来我们画原地旋转


于是左边的小车就顺时针旋转

右边的小车逆时针旋转


让我们再来看看平移


左边的小车向左平移

右边的小车向右平移


接下来看看斜着跑



只要同向转动对角线上两个轮子,

就能斜着跑啦

 

转载自:CSDN:麦克纳姆轮全向移动原理

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

麦克纳姆轮全向移动原理 的相关文章

  • matlab--UDP发送接收

    m函数中UDP接收和发送 接收 ipA 192 168 0 5 portA 8080 ipB 192 168 0 3 portB 8080 handles udpB udp ipA portA LocalPort portB 远程ip 远程
  • mysql--日志

    转载自 xff1a https www cnblogs com f ck need u p 9001061 html 日志刷新 mysql gt FLUSH LOGS 错误日志 简介 错误日志记录了MySQL Server每次启动和关闭的详
  • osg--读写

    文件I O 命名规则 osgdb xxx 比如 osgdb osg osgdb jpeg 关联文件后缀和加载器 osgDB Registry instance gt addFileExtensionAlias jpeg jpeg osgDB
  • osg--几种效果

    billboards 适用于小草等的绘制 osg BillBoard继承自osg Geode 其下所有osg Drawable面向观察者 旋转行为通过setMode 设置 分别为 POINT ROT EYE 几何体z轴旋转到窗口y轴 POI
  • osg--提高效率

    多线程 OpenThreads Thread 虚函数 cancel run OpenThreads Mutex OpenThreads Barrier OpenThreads Condition 线程管理 GetNumberOfProces
  • torch在ubuntu16.04下的搭建(cuda9.0+cudnn7.0)

    希望外婆身体越来越好 参考 xff1a http blog csdn net chenhaifeng2016 article details 68957732 http www 52nlp cn E6 B7 B1 E5 BA A6 E5 A
  • LSTM文本分类(tensorflow)

    1 xff09 LSTM介绍 转载自https www csdn net article 2015 09 14 2825693 Gates xff1a 输入变换 xff1a 状态更新 xff1a 使用图片描述类似下图 xff1a 输入 首先
  • ArcMap安装与使用入门

    一 安装 https malagis com arcgis 10 4 full ios download html from 61 singlemessage amp isappinstalled 61 0 二 使用 1 添加数据 2 新建
  • srtm数据格式.hgt读取

    srtm数据格式 hgt读取 转载自https librenepal com article reading srtm data with python python读取 import os import json import numpy
  • Unity Pahfinding 插件中直接用RVOController来移动角色

    span class token keyword using span UnityEngine span class token punctuation span span class token keyword using span Sy
  • gdal用法总结

    USAGE OF GDAL RASTER API Import gdal from osgeo import gdal Open the file Dataset gdal Open filename Getting dataset inf
  • C语言中的__FILE__、__LINE__和__func__等预定义跟踪调试

    标准C语言预处理要求定义某些对象宏 xff0c 每个预定义宏的名称一两个下划线字符开头和结尾 xff0c 这些预定义宏不能被取消定义 xff08 undef xff09 或由编程人员重新定义 下面预定义宏表 xff0c 被我抄了下来 LIN
  • Linux中的动态库和静态库(.a.la.so.o)

    Linux中的动态库和静态库 a la so o 原文地址 xff1a https www cnblogs com findumars p 5421910 html 在windows下 xff0c 一般可以通过文件的后缀名来识别文件的类型
  • C++继承中的同名覆盖问题

    1 同名覆盖的理论关键 xff1a 继承中同名覆盖问题的核心知识点 xff1a 作用域问题 xff0c 例子 xff1a span class token keyword int span a span class token punctu
  • 链表问题技巧:使用伪头节点

    小技巧 xff1a 对于链表问题 xff0c 创建头节点时不知道合适的节点值 xff0c 因此通常需要先初始化一个预先指针 伪头节点 pre xff0c 该指针的下一个节点指向真正的头结点head 使用预先指针的目的在于链表初始化时无可用节
  • STL自定义排序函数:sort()函数;priority_queue,set,map等容器排序函数

    1 sort 函数自定义排序 xff1a 1 1 sort 模板原型 xff1a 1 1 1 默认模板 xff1a 利用 lt 比较 xff0c 升序排列 span class token keyword template span spa
  • 大数求余:即答案对1e9+7(1000000007)取模原因、方法总结

    1 大数求余原因 xff1a 大数越界 大数越界 xff1a 随着n增大 xff0c f n 会超过Int32甚至Int64的取值范围 xff0c 导致最终的返回值错误 当一个问题只对答案的正确性有要求 xff0c 而不在乎答案的数值 xf
  • 回车与换行的区别

    回车与换行的区别 xff1a 1 两个控制字符的介绍 以前打字机中 xff0c 每行后面加两个表示结束的字符 一个叫做 回车 return xff08 r xff09 xff0c 告诉打字机把打印头定位在左边界 xff1b 另一个叫做 换行
  • -1的原码、反码、补码(0xff)

    1的表示 1 0xff的无符号数为255 xff0c 当作为有符号数显示则为 1 2 1的原码表示为1001 xff1b 除符号位取反得反码 xff1a 1110 xff1b 加1得补码 xff1a 1111即0xff 3 负数在计算机中用

随机推荐

  • C++头文件包含(2):cpp多次包含同一头文件,会有什么问题?头文件保护

    1 目录结构 xff1a span class token operator span base span class token operator span main main span class token punctuation s
  • Go语言学习之读文件

    三种方式读取文件 span class token keyword package span main span class token keyword import span span class token punctuation sp
  • include_directories和target_include_directories

    1 作用 xff1a 给源文件添加头文件搜索路径 xff1a 将指定目录添加到编译器的头文件搜索路径之下 xff0c 指定的目录被解释成当前源码路径的相对路径 2 差别 xff1a 2 1 include directories xff1a
  • CMAKE常用内置变量解释:CMAKE_SOURCE_DIR/EXECUTABLE_OUTPUT_PATH/CMAKE_EXPORT_COMPILE_COMMANDS

    前言 xff1a cmake的内置命令是不区分大小写的 因此add subdirectory与ADD SUBDIRECTORY作用一致 cmake的所有变量都是区分大小写的 1 PROJECT SOURCE DIR 与 PROJECT BI
  • C++文件读写类介绍

    一 现有的文件读写方案 方案一 xff1a 采用C 43 43 标准库读写 该库拥有输入输出模板类及两个标准实例化集 xff1a 一个是用于操作char类型元素的实例化集 即常用的cin xff0c cout等 xff0c 另一个用于操作w
  • 自定义target命令:add_custom_target

    一 前置知识 1 CMake中一切都是基于target的 xff0c 如add library会产生一个library的target xff0c add executable会产生一个exe的target 2 以上命令生成的target放在
  • 软件设计原则:迪米特法则

    一 定义 迪米特法则 xff1a 要求一个对象应该对其他对象有最少的了解 xff0c 所以又叫做最少知识原则 二 法则内容 xff1a 1 不该有直接依赖关系的类之间 xff0c 不要有依赖 xff1a 即 xff0c 不和陌生人说话 xf
  • ElasticSearch最佳入门实践(六十二)type底层数据结构

    type xff0c 是一个index中用来区分类似的数据的 xff0c 类似的数据 xff0c 但是可能有不同的fields xff0c 而且有不同的属性来控制索引建立 分词器 field的value xff0c 在底层的lucene中建
  • 四轴的组成及参数评定

    电气工程及其自动化专业 xff0c 坐标广东湛江 xff0c 大一时期对专业上很感兴趣 xff0c 自学了许多东西 xff0c 但是只是停留在理论基础上而缺乏实践 xff0c 和学校在这方面的普及有点关系吧 xff0c 趁着国家有这方面的支
  • sudo rosdep init报错的解决方式

    Ubuntu16 04下安装ROS时 xff0c 执行到sudo rosdep init这一步时会遇到问题 xff0c 如下图所示 xff1a 尝试了很多办法 xff0c 都没有成功的 后来参考了https www ioiox com ar
  • VS版本和VC版本的对应【完整版】

    看到网上杂七杂八 xff0c 很乱 xff0c 索性自己发帖多版本开发福音 xff08 该帖不更新了 xff0c 请看参考里连接中的官方文档 xff0c 非常清楚 xff0c 还保持最新 xff09 MSC 1 0 MSC VER 61 6
  • 搭建运行激光slam环境中遇到的问题

    1 先是踩了一些坑 xff0c 重复安装了一些库 xff0c 因为ros noetic里面就自带了一些库 xff0c 所以安装的时候重复安装了 解决方法 xff1a 删掉重装 另外缺少一些库 xff0c 乱装一顿 xff0c 居然凑齐 Ub
  • mac上用VSCode搭建 c++ 工程,用于学习Opengl

    先下载VSCode安装c c 43 43 插件 xff0c 安装微软这个 创建一个文件夹作为项目 xff0c 然后用VSCode打开这个目录在这个文件夹中创建好四个目录 xff0c 分别是src xff0c lib include bin
  • 刷赞与评论

    网站自动刷帖 xff0c 刷赞 xff0c 刷评论等网络推广方式的基本实现 里面的思路有东西
  • 系统复制-快速重装系统

    ubuntu 直接把安装好常用软件和环境的系统打包成镜像 xff0c 用systemback安装 xff0c 便捷很多 之前那种 xff0c ubuntu安装都要好久 xff0c 少说也得20分钟吧 xff0c 之前就是等 xff0c 等它
  • 机器人 控制领域

    机器人 控制领域好像没太有很新很有用的工作 xff0c 还是依据Dynamic Model的Motion Planning更接近于任务层 其实 xff0c 感觉自己喜欢的不是控制 而是motion xff0c motion control
  • 树莓派电压过低 串口数据错误增多

    调试过程中 xff0c 树莓派串口读单片机上传的数据 的程序突然一堆checksum error 换一块满电的LiPo电池就大幅减少了报错 一开始猜测原因 可能是电压过低导致CPU运行慢了 xff08 可能叫做 降频 xff09 xff0c
  • 机器人知识体系

    纲 机电力算控感 知识体系体系各元素特点体系的建立和完善 机电力算控感 知识体系 机械 电子电气 力学 xff08 静力学与动力学分析 流体力学 材料力学等 xff09 计算 xff08 通用计算机和嵌入式计算机 xff09 控制理论 感知
  • OpenCV之imwrite()等基本操作

    参考 xff1a Opencv之imwrite 函数的用处 imwrite 函数用来保存图片 opencv3中的imwrite函数是用来输出图像到文件 xff0c 其声明如下 xff1a CV EXPORTS W bool imwrite
  • 麦克纳姆轮全向移动原理

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