ROS麦克纳姆轮底盘制作(上)

目录

1.底盘硬件框图

2、麦克纳姆轮模型介绍

2.1 麦克纳姆轮下的运动学模型

2.2 正解运动学模型

 2.3 逆解运动学模型

3 底盘软件框架

4 参考资料


在这一个专题中,我们将介绍如何搭建利用麦克纳姆轮搭建一个ROS底盘。参考标准的ROS底盘,ROS底盘应该具备接收导航节点发送的“cmd_vel”这个话题上的控制命令(小车X,Y,Z三个方向的速度以及三个方向的角速度),同时更加底盘轮子的转速信息预估底盘的位置,并发布到Odometry(里程计)话题上。

整个专题分为了四个部分实现:

      1、首先介绍小车的硬件结构,

     2、其次介绍麦克纳姆轮的运动学模型,

     3、接下来利用遥控器控制麦克纳姆轮前后左右移动实现遥控,

     4、最后编写ROS节点将“cmd_vel”话题的数据转到底盘上。

所有的代码均放在了Github中,欢迎大家下载留言。

1.底盘硬件框图

底盘的主要任务是接收上位机的指令(即ROS节点的指令),控制每个电机的转速、同时上传底盘上的IMU、超声波、电机转速等传感器和执行器的信息到ROS中的底盘节点。这里我们涉及到传感器和执行器分别有:2.4G遥控器接收机、IMU、超声波传感器、4路大疆M3508电机及驱动器。其中遥控器用于辅助遥控底盘和切换控制方式、超声波用于弥补激光雷达的盲区,IMU用于测量底盘的姿态和航向角(在有些底盘中还使用了IMU的信息来做了转角控制的闭环)

                                                                                        图1-1 小车硬件框图

小车硬件实物如下图所示,定义左上角电机的编号为#1,左下为#2,右下为#3,右上为#4。正前方为X方向,水平方向为Y方向(与ROS中的坐标系相同)。

                                                                                        图1-2 小车硬件实物

底盘的开发任务分四步实现:

     第一步,打通通讯链路,读取传感器(DBUS接收、IMU数据读取、超声波数据读取)和电机驱动器(C620)数据。

     第二步:利用PI控制器实现电机的速度闭环控制。

     第三步:利用麦克纳姆轮速度逆解模型实现X/Y/W三个方向的速度控制。

     第四步:完善上位机收发指令协议、上传IMU、超声波、电机转速信息。

接下来我们先介绍一下麦克纳姆轮的运动学模型,这个运动学模型的主要是方便我们在X,Y,W三个方向的速度和四个电机的转速(V1,V2,V3,V4)之间建立映射关系。控制的时候导航模块给定的是X,Y方向的速度(m/s)以及小车的旋转速度W(rad/s),在发布里程计的时候,我们需要读取四个电机的转速或者转动的圈数来推算出小车的位置坐标和航向角。

2、麦克纳姆轮模型介绍

首先我们先从宏观的角度来分析一下麦克纳姆轮底盘是如何实现前后、左右、旋转运动的。

 
                                   a. 前后运动                                                               b. 左右运动
 
 
                                   c. 45度斜向运动                                                     d. 旋转运动

                                                        图2-1 麦克纳姆轮运动学模型示意图

麦克纳姆轮安装方式为“米”字形安装,如图1所示,假设我们需要控制小车动以下运动:

  1. 向前运动,那么需要四个轮子向前转动
  2. 向左运动时,需要左前和右后轮向后转动,左后和右前轮向前转动
  3. 向右前方运动时,左前和右前轮向前转动
  4. 逆时针旋转时,左前和左后向后转动,右前和右后向前转动

在参考[1]博客中已经给出了一个讲解麦克纳姆轮的经典教程,但是美中不足的是这个教程中的图片不知道怎么缘故无法显示,因此在参考这个大疆官网上的教程基础上进行了整理。

首先定义小车左右为Y方向,其中向左为正;前后为X方向,其中正前方为正;小车逆时针旋转为正用{w_v}表示。假设小车速度为V=[V_x V_y V_z], 麦克纳姆轮从左上角到右上角标号依次为N=1,2,3,4。(Xn,Yn)为第n个轮相对原点的坐标,速度用{​{\rm{v}}_n}{\rm{ = [}}{​{\rm{v}}_{xn}}\;{​{\rm{v}}_{yn}}{\rm{ }}\;{w_n}{\rm{]}}表示。

各麦轮轮毂与X轴平行安装(通常呈米自形安装),r为轮毂半径,以逆时针方向偏转为正。\theta _N为麦轮n的接地辊子轴线与X轴间的夹角【即辊子的偏置安装角,大小为45°】。辊子就是在麦克纳姆轮上斜着的那个。4个轮子的转速分别为{​{\rm{v}}_n}{\rm{ = [}}{​{\rm{v}}_{xn}}\;{​{\rm{v}}_{yn}}{\rm{ }}\;{w_n}{\rm{]}}。定义好这些以后我们开始推导麦克纳姆轮的运动学模型。

                                                                                         图2-2 小车硬件框图

2.1 麦克纳姆轮下的运动学模型

已知四个轮子的转速\Omega {\rm{ = [}}{w_1},{w_2},{w_3},{w_4}{​{\rm{]}}^T}求解车的速度V=[V_x V_y V_z],也就是找到一个4x3矩阵R使得其满足:

                                            \Omega {\rm{ = }}\frac{1}{​{\rm{r}}}RV                                                                                   (2.1)

假设车身为刚体,每个麦轮的中心的水平和垂直速度分量{​{\rm{v}}_n}{\rm{ = [}}{​{\rm{v}}_{xn}}\;{​{\rm{v}}_{yn}}{\rm{]}}均等于车的水平和垂直速度分量V_n=[V_{xn} V_{yn}]。此外,由于车身还有旋转速度{w_v}, {w_v}也会在每个麦轮上产生的(水平和垂直方向)的速度分量{​{\rm{v}}_n}{\rm{ = [}}{​{\rm{v}}_{xn}}\;{​{\rm{v}}_{yn}}{\rm{]}} 

                                             \begin{array}{l} {​{\rm{v}}_{xrn}} = {\rm{ - Yn}} \cdot {w_n}\\ {​{\rm{v}}_{yrn}} = X{\rm{n}} \cdot {w_n} \end{array}                                                                   (2.2)

因此综合而言每个麦轮在水平和垂直方向的速度分量为:

                                             \begin{array}{l} {​{\rm{v}}_{xn}}{\rm{ = }}{​{\rm{v}}_x}{\rm{ + }}{​{\rm{v}}_{xrn}} = {​{\rm{v}}_x}{\rm{ - }}{​{\rm{Y}}_n} \cdot {w_n}\\ {​{\rm{v}}_{yn}}{\rm{ = }}{​{\rm{v}}_y}{\rm{ + }}{​{\rm{v}}_{yrn}} = {​{\rm{v}}_y}{\rm{ + }}{X_n} \cdot {w_n} \end{array}                                               (2.3)

到这我们求出了车身速度V=[V_x V_y V_z]对应到每个麦轮上的速度{​{\rm{v}}_n}{\rm{ = [}}{​{\rm{v}}_{xn}}\;{​{\rm{v}}_{yn}}{\rm{]}}的关系,接下来只要找到每个轮子转速{w_n}{v_n}之间的关系就构建完毕了。下图为右上轮在某一时刻的速度矢量关系。

                                                                                        图2-3 小车硬件框图

 图2-3中Vn这个合速度矢量就是麦轮n当前的实际运动速度,由速度分量Vxn与Vyn合成。在图中还可以看出看出Vn是由麦轮n的轮毂中心速度Aî=ωn·r和接地自由辊子的中心速度Bû合成而来的(自由辊子的中心速度B是随速度矢量Vn变化的)。所以有等式:

                                               {w_n}r = {​{\rm{v}}_{xn}}{\rm{ + }}{​{\rm{v}}_{yn}}*\tan {\theta _n}                                                     (2.4)

变形为:

                                               \begin{array}{l} {w_n} = \frac{1}{r}[({​{\rm{v}}_x}{\rm{ - }}{​{\rm{Y}}_n} \cdot {w_n}){\rm{ + }}({​{\rm{v}}_y}{\rm{ + }}{X_n} \cdot {w_n})\tan {\theta _n}]\\ \;\;\;\;\; = \frac{1}{r}[{​{\rm{v}}_x}{\rm{ + }}{​{\rm{v}}_y}\tan {\theta _n}{\rm{ + }}({X_n}\tan {\theta _n} - {​{\rm{Y}}_n}) \cdot {w_n}] \end{array}                 (2.5)

对于4个轮子有:

                                               \left[ {\begin{array}{*{20}{c}} {​{w_1}}\\ {​{w_2}}\\ {​{w_3}}\\ {​{w_4}} \end{array}} \right]{\rm{ = }}\frac{1}{​{\rm{r}}}\left[ {\begin{array}{*{20}{c}} 1&{\tan {\theta _1}}&{​{X_1}\tan {\theta _1} - {​{\rm{Y}}_1}}\\ 1&{\tan {\theta _2}}&{​{X_2}\tan {\theta _2} - {​{\rm{Y}}_2}}\\ 1&{\tan {\theta _3}}&{​{X_3}\tan {\theta _3} - {​{\rm{Y}}_3}}\\ 1&{\tan {\theta _4}}&{​{X_4}\tan {\theta _4} - {​{\rm{Y}}_4}} \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {​{​{\rm{v}}_x}}\\ {​{​{\rm{v}}_y}}\\ {​{​{\rm{v}}_z}} \end{array}} \right]\;          (2.6)

即:   \Omega {\rm{ = }}\frac{1}{​{\rm{r}}}RV

根据第一图对θn的定义,可以得到θ1θ3 -45°,θ2θ4 +45°,因此R矩阵为:

                                             {\rm{R = }}\left[ {\begin{array}{*{20}{c}} 1&{ - 1}&{ - {X_1} - {​{\rm{Y}}_1}}\\ 1&1&{​{X_2} - {​{\rm{Y}}_2}}\\ 1&{ - 1}&{ - {X_3} - {​{\rm{Y}}_3}}\\ 1&1&{​{X_4} - {​{\rm{Y}}_4}} \end{array}} \right]                                            (2.7)

通常我们设计的底盘是轴向对称的,也就是坐标系时原点到四个轮子的距离相等。所以每个轮横、纵坐标的绝对值各自相等,令K=abs(Xn)+abs(Yn),根据每个轮坐标所在象限的符号,矩阵可化简为:

                                             {\rm{R = }}\left[ {\begin{array}{*{20}{c}} 1&{ - 1}&{ - {\rm{K}}}\\ 1&1&{ - {\rm{K}}}\\ 1&{ - 1}&{\rm{K}}\\ 1&1&{\rm{K}} \end{array}} \right]                                                       (2.8)

另外,考虑î、û两个单位向量的线性组合,刚好构成XOY平面内的整个向量空间(当然实际上速度不可能无穷大的哈,但方向一定是全向的),这也就是麦轮能全向运动的原因。注意Bû始终是跟辊子轴垂直的,因为辊子一定是沿垂直其转轴的方向滚动,这就像Aî始终跟电机轴(平行于Y轴)垂直一样。

2.2 正解运动学模型

正解运动学是指已知每个电机的转速,求出车体的速度。在数学形式上是找到一个3x4矩阵[F]使其满足:

                                               F\Omega r=V                                                                         (2.9)

做法是通过最小二乘法来提供最优解的矩阵[F],首先从逆向运动学方程开始,

                                            \Omega {\rm{ = }}\frac{1}{​{\rm{r}}}RV                                                                         (2.10)               

两边同时左乘[R]的转置得到:

                                             {R^{\rm{T}}}\Omega {\rm{ = }}\frac{1}{​{\rm{r}}}{R^{\rm{T}}}RV                                                               (2.11) 

两边同时左乘[R]’[R]的逆得到:

                                             {({R^{\rm{T}}}R)^{ - 1}}{R^{\rm{T}}}\Omega {\rm{ = }}\frac{1}{​{\rm{r}}}V                                                         (2.12)

右侧化简为[V]得到:

                                             {({R^{\rm{T}}}R)^{ - 1}}{R^{\rm{T}}}\Omega {\rm{r = }}V                                                         (2.13)

由此得到[F]:

                                              {\rm{F}}\Omega {\rm{r = }}V\;,{\rm{F = }}{({R^{\rm{T}}}R)^{ - 1}}{R^{\rm{T}}}                                             (2.14)

使用逆向运动学中化简完的[R]矩阵,很容易求出[F]:这里我们借助MATLAB的符号函数求解 F矩阵,MATLAB代码如下所示

syms K
R=[1, -1, -K;
1, 1, -K;
1, -1, K;
1, 1, K;];
F=inv(R'*R)*R'

最终可以得到如下得一个F为下面的一个公式

对应在程序中的代码(github)为:

 2.3 逆解运动学模型

小车的逆解模型主要用于已知整体速度求每个轮子的速度,比如遥控器对应的指令是小车整体的速度,我们接收到指令以后需要转换为每个轮子的目标转速作为速度的目标值

由2.1中可知

 由于车体的对称性质  K=abs(Xn)+abs(Yn因此有

 对应的转换代码为(github

注意:

      公式2.1中速度V的单位是m/s,而转速\Omega的单位为rad/s(弧度每秒),大疆C620电机编码器反馈的速度为rpm(转没分),这其中需要转换一下(\Omega * 2*\pi = rpm/60)

3 底盘软件框架

在上一章中,我们介绍了麦克纳姆轮底盘的基本框架,以及麦克纳姆轮运动学模型,这里我们通过大疆的遥控器以遥控的方式控制底盘实现前后左右运动。

底盘以STM32F1为核心,底盘可以分为以下几个功能模块:

  1. C620电调CAN驱动模块,通过CAN中断接收电机编码器反馈数据
  2. 接收DBUS协议的遥控器数据
  3. 设置速度PID闭环
  4. 上传4个电机的转角、转速、温度到上位机

具体而言首先使用串口1接收来至接收机的数据,然后由麦克纳姆轮运动学模型将X、Y、W三个方向上的速度转换为四个电机的目标转速(RPM)发送给PI控制作为目标速度,随后PI控制器接收四个轮子的目标转速实现速度闭环控制,并计算控制量,通过CAN总线传送到电机。最后由状态数据上传模块定时上传底盘上电机、IMU、超声波的数据到上位机上。

接线说明:

连线方面只需要把C620电调的CAN总线连上STM32、串口1接收引脚链接接收机(接收机与STM32之间需要外置一个反相器),串口2通过一条USB转串口的线连到上位机就可以了。

:(大疆遥控器SW1需要拨到CL或者HL档位才有效,表示遥控器介入控制,OFF档表示撤销遥控器介入,由上位机进行控制)

代码就不贴出来了,感兴趣的小伙伴自行下载(底盘的代码)。到这里我们基本上可以实现用遥控器来遥控麦克纳姆轮底盘实现前、后、自旋三个方向的运动了。最后贴上一个效果图。

4 参考资料

[1]:大疆论坛,【干货】麦轮正逆向运动学建模/再不懂就去打死线代老师吧【RoboMaster论坛-科技宅天堂】

[2]: Kinematic Analysis of Four-Wheel Mecanum Vehicle

[3]: 代码地址:GitHub - RuPingCen/mick_robot_chasiss: Mick is a homemade ROS chassis, which uses the Mecanum wheel as the wheel,

下一篇 : ROS底盘制作——麦克纳姆轮模型(下)

对于运行有问题的小伙伴欢迎邮件或留言讨论cenruping@vip.qq.com

  • 41
    点赞
  • 348
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
麦克纳姆轮URDF插件是一种用于在ROS和Webots中搭建麦克纳姆轮底盘的工具。通过使用该插件,可以方便地定义麦克纳姆轮的物理属性和控制方式。 在使用麦克纳姆轮URDF插件时,需要进行以下步骤: 1. 安装插件:首先,需要将麦克纳姆轮URDF插件安装到ROS和Webots中。可以通过以下命令在ROS中安装插件: ```shell sudo apt-get install ros-<distro>-webots-ros ``` 其中,`<distro>`是你正在使用的ROS发行版的名称,例如`melodic`或`noetic`。 2. 创建URDF文件:接下来,需要创建一个URDF文件来描述麦克纳姆轮底盘的模型。在URDF文件中,可以定义麦克纳姆轮的几何形状、质量、惯性、关节和传感器等属性。 3. 配置插件参数:在URDF文件中,可以使用麦克纳姆轮URDF插件提供的参数来配置麦克纳姆轮的物理属性和控制方式。例如,可以设置麦克纳姆轮的摩擦系数、弹力、力依赖滑动等参数。 4. 启动ROS节点:在使用麦克纳姆轮URDF插件时,需要启动一个ROS节点来与Webots进行通信。可以使用以下命令启动ROS节点: ```shell roslaunch <package_name> <launch_file> ``` 其中,`<package_name>`是包含URDF文件和启动文件的ROS软件包的名称,`<launch_file>`是启动文件的名称。 5. 运行Webots:最后,需要运行Webots仿真环境,并加载包含麦克纳姆轮URDF模型的世界文件。在Webots中,可以通过ROS节点与麦克纳姆轮进行通信,并控制其运动。 通过以上步骤,就可以使用麦克纳姆轮URDF插件在ROS和Webots中搭建麦克纳姆轮底盘了。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值