前言

本文我们研究怎么辨识一个单摆的动力学参数,通过对这个最简单的例子的研究我们可以感受一下机器人动力学参数辨识的流程,在后续的文章里面我们慢慢的进化到辨识复杂多关节的机械臂的动力学参数。

这里不妨回顾一下动力学参数辨识的理论步骤:

  • 推导结构的逆动力学方程

  • 对动力学方程进行线性化处理

  • 激励运动得到扭矩,关节位置,关节速度,关节加速度数据

  • 利用最小二乘法得到辨识出来的参数

本文用到的软件有:

  • Matlab R2019b

  • SolidWorks 2018

本文的所有模型文件与代码开源在我的github:

https://github.com/julis-wolala/Pendulum-Parameter-Identification

01 理论准备1.1 确定研究对象

我们的研究对象很简单,是一个单摆,即一个旋转电机固连一根连杆。下图是它的结构简图以及我附上的坐标系。(这里我用的是SDH建系法)

它的初始位置是连杆1水平的时候。其中代表转轴至质心的距离,代表连杆的长度。最后一个工具坐标系我没标轴号,是因为本文用不到这个坐标系(其实是懒)。

1.2 推导动力学模型

对这步很熟的可以直接跳过这节,先贴出结论:

这里求逆动力学方程我用的欧拉-拉格朗日方程法。对于这种极其简单的结构,可以直接写出结果,为了练习动力学方程推导能力,这里我们一步一步解答,过程如下:

首先列出需要用到的一些结论:

求解惯性项D(q)

求解离心力和科氏力项C(q)以及重力项G(q)

得到最终结果

1.3 线性化处理

机械臂的动力学方程的参数具有线性的性质,因此可以改写为:

按照上面的思路我们改写上一节得到的动力学方程,得到:

其中

以及

是需要辨识的动力学参数,是可以测量到的部分,也叫观测矩阵。有了线性关系方程之后,根据最小二乘法的知识我们就可以求出动力学参数。于是我们给定一个运动激励,测量出在不同时刻下关节位置,速度,加速度以及扭矩,将其写成矩阵形式:

然后用最小二乘法得到

1.4 轨迹激励

到这里,我们只需要知道几个轨迹点下关节的位置,速度,加速度和关节扭矩就能算出动力学参数集。那么问题来了,我要激励什么样的轨迹?数据点要采多少?才能很好的辨识我们的动力学参数呢?对于本文研究的单摆结构,上述问题并不突出。但是对于复杂机械臂,激励轨迹的选择以及数据点的采集就很讲究了。有兴趣的可以去研究,学废了记得教我~

本文为了简化讨论,我们把

当作我们的激励信号

02 仿真2.1 模型搭建2.1.1 画机械设计图

我们用solidworks简单画一个单摆结构,然后转换成urdf格式导入到matlab里面。十分简单的结构,只需要两个零件即可。

2.1.2 导入Matlab

先导成URDF格式,然后导入到Matlab simscape里面,这里过程不再赘述。导入到simscape的代码如下:

smimport('Pendulum_SLDASM.urdf');

我们跑看看模型,一开始会Joint limit报错,只需要把关节模块里面的Joint limit 上的勾勾去掉就好。接着运行模型,模型动了起来,确认我们的Simscape模型无误。

2.1.3 计算参考惯量矩阵

有了模型之后,为了让后面辨识出来的参数有个参考,我们在Solidworks里面查看连杆的质量参数。

然后用这些参数在Matlab里面计算我们的参考惯量矩阵,代码如下:

% Theta_sw is inertia matrix get from solidworks % tau_sw is torque calculated from solidworks inertiasyms m L_c I_zz Theta_sw tau_swm = 14.39*10^(-3);%kgL_c = 50.59*10^(-3);%mI_zz = 13822.02*10^(-9);%kg*m2g = 9.81;%N/kgTheta_sw = [m*L_c^2+I_zz;m*g*L_c]1000*Theta_sw

这里需要进行一下单位换算。最后的结果放大了1000倍是为了方便我们观察数据,输出为:

我们后面希望辨识结果能够尽可能地接近这两个数字。

2.2 添加激励与传感器

根据第一节的理论知识,我们需要给模型添加一个运动激励,然后测量关节位置,关节加速度以及关节扭矩来进行后续的辨识过程。因此我们修改关节配置,添加输入接口和关节传感器接口。

然后添加激励输入,以及关节位置,加速度,和扭矩传感器,新的结构图如下:

其中激励输入的配置为:

(请把频率改成1,不是0.1)我们再一次运行,发现系统报错。

这是因为添加了S-PS Convertor之后需要修改一下S-PS以及matlab Solver配置才行,不需要慌,解决方法:

1.把simulink-PS converter模块里面的Input Handling参数分别改成

  • Filter input,derivatives calculated

  • Second-order filtering

  • 时间常数随意

2.模型配置参数(Modeling configuration parameter)那块把solver改成ode23s

改完之后再一次运行,模型可以正常运动,且Scope里面有数据曲线。

2.3 数据采集2.3.1 把数据导入Matlab工作空间

模型跑通了,数据图像也有了,现在要怎么把Simscape仿真结果提取出来用来计算呢?Matlab自带的Data Inspector很方便我们进行数据获取。首先我们告诉matlab我们在关心哪些数据,我们框住关心的输入输出信号,然后点击Log Signals

信号流上面出现了wifi标志说明这些数据已经开始被监听了。运行模型,待Data Inspector变黄,点击就可以看到提取出来的数据图像。

然后我们可以把数据导入到工作空间里给后续的辨识过程使用。操作过程很简单,选中想要提取的数据,点击export,改一下名字,ok就行。

我们需要操作四次,把所有用到的信息导出。导完之后观察我们的工作空间,数据都已经进来了。

我们不难发现加速度一开始的时候有个很高的冲激,为了避免这里的数据点对结果产生干扰,我们用中间往后的数据点进行我们的辨识。这里我们有2000多个数据点,于是我们可以选择使用1000至2000范围内的数据。

2.3.2 确定数据单位

需要的数据都有了,终于可以开始辨识了?慢着,我们还得知道我们Matlab里面测量到的数据的单位,我们去到DEBUG-Information Overlay- 点击Unit

新的模型数据线上面出现了单位

至此,数据准备工作完成,我们可以开始写代码辨识了。

2.4 进行参数辨识

2.4.1 提取数据点构造观测矩阵与扭矩矩阵

% Retrive data for identificationStartDataindex = 1000;EndDataindex = 2000;step = 10;numOfData = (EndDataindex-StartDataindex)/step+1% Y and tauY = zeros(numOfData,2);tau = zeros(numOfData,1);for n=1:1:numOfData   Y(n,1)=getdatasamples(Joint1Acce,step*(n-1)+StartDataindex);   Y(n,2)=cos(getdatasamples(Joint1Pos,step*(n-1)+StartDataindex));   tau(n,1) = getdatasamples(Joint1Torq,step*(n-1)+StartDataindex);end

2.4.2 得到辨识结果

theta=inv((Y.')*Y)*(Y.')*tau1000*theta% Use identified inertia to calculate torque to verify your result% tau_estitau_esti = Y*theta;

为了方便比较同样也把结果放大了1000倍

发现辨识出来的参数与之前的参考结果相差很小

2.5 检查辨识效果

我们用辨识出来的参数进行扭矩计算,然后与测量出来的扭矩进行比较

error = tau_esti-tau;index=1:1:numOfData;% Measuerd torque VS Estimated torqueplot(index,tau,index,tau_esti)title('Measuerd torque VS Estimated torque')xlabel('Index');ylabel('Torque(Nm)');% Error plot(error)title('Torque error');xlabel('Index');ylabel('Torque(Nm)');

输出结果

扭矩大概在10^(-3)这个量级,误差在10^(-6)这个量级,可以判断此次辨识结果基本成功。

2.6 总结

可见即便对于一个很简单的结构,即便我们忽略了很多实际情况下的条件让辨识十分理想化,机器人的动力学辨识过程依旧不简单。大家可以自行调整激励信号以及模型,看看辨识结果会如何变化。辨识结果受到的影响很多,激励信号的选择也有很多学问,我没有仔细研究。

2.7 几个问题

  • 没有力传感器的话扭矩不能直接得到,可以用电流估算扭矩吗?

  • 用电流估算的话摩擦要怎么处理?

  • 实际的加速度测量肯定存在噪声和误差,要怎么处理噪声误差?处理过程会对辨识有什么样的影响?

  • 频率小的时候辨识出来的惯量矩阵有负数项?

03更近一步

3.1 考虑电机内部模型(电流与扭矩的关系)

3.2 等等

本文结束,以上。

参考文献

动力学参数辨识流程:

https://zhuanlan.zhihu.com/p/93463996

《robot dynamics and control》 作者:

Mark W Spong,Seth Hutchinson,and M. Vidyasagar

《ROS常用SLAM功能包使用指南 · 古月》课程将带你走进ROS的SLAM世界,了解SLAM的基本原理,熟悉ROS中常用SLAM功能包的配置及使用方法。

机械臂拉格朗日动力学怎么用matlab仿真_Matlab 机器人动力学参数辨识仿真(1)单摆的动力学参数辨识...相关推荐

  1. 【机械仿真】基于matlab简化几何解法六轴机械臂位置规划【含Matlab源码 2128期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab简化几何解法六轴机械臂位置规划[含Matlab源码 2128期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  2. 【从零开始的ROS四轴机械臂控制】(二) - ROS与Gazebo连接,Gazebo仿真及urdf文件修改

    [从零开始的ROS四轴机械臂控制(二)] 四.urdf文件及gazebo仿真 1.simple_arm示例 (1)config文件夹 (2)launch文件夹 (3)meshes文件夹 (4)urdf ...

  3. 如何将solidworks中的机械臂三维装配体导出matlab可以运行或者说可以识别的STEP和XML格式

    首先我们需要有一个机器人的三维装配体文件,一般购买机器人,厂家会提供.当然,对于我们学生来说,不可能去为了一个装配体文件去购买机器人,一般机器人厂家的官网会有装配体文件,这个步骤大家就自己去找吧,不同 ...

  4. 【机械臂优化】基于粒子群算法实现考虑关节限位约束下的冗余机械臂求逆解附Matlab代码)

    1 简介 2 部分代码 %%%%%%%%%%%%%%%%%%采用PSO算法对运动学冗余机械臂求一组最优逆解%%%%%%%%%%%%%%%%%%% %该程序对一个具有四自由度的机械臂做位置控制,由操作空 ...

  5. 中正平和的机器人学笔记——1. 机械臂正运动学(附MATLAB代码)

    中正平和的机器人学笔记--1.正运动学 0. 何为运动学?何为正运动学? 运动学主要研究的就是机械臂的运动特性(位置.速度.加速度等),但是不考虑使机械臂产生运动时施加的力和力矩(这部分是动力学).而 ...

  6. ADAMS/MATLAB联合仿真机械臂重力补偿问题

    1 背景与重力补偿基本算法 现在有一个大型机械臂,要做一个缩比同构的小机械臂作为主控端来控制从端大机械臂.小臂的各个连杆可能比较重,要求用户在带着小臂运动的时候尽量感觉不到小臂各连杆的重量,并且在松手 ...

  7. matlab机械臂建模运动学仿真+轨迹规划

    Matlab机械臂仿真 1.内容参考B站视频:https://www.bilibili.com/video/BV1q44y1x7WC?spm_id_from=333.337.search-card.a ...

  8. 四自由度机械臂matlab建模与仿真

    四自由度机械臂matlab建模与仿真 建模过程使用机器人工具箱Robotics Toolbox 机械臂有四个旋转自由度,模型近似如下,使用ADAMS建模 首先建立DH参数 matlab代码如下 cle ...

  9. 基于Mathematica的机器人仿真环境(机械臂篇)

    目的 本文手把手教你在 Mathematica 科学计算软件中搭建机器人的仿真环境,具体包括以下内容: 1 导入机械臂的三维模型 2 正\逆运动学仿真 3 碰撞检测 4 轨迹规划 5 正\逆动力学仿真 ...

  10. 基于 Mathematica 的机器人仿真环境(机械臂篇)

    目的 本文手把手教你在 Mathematica 软件中搭建机器人的仿真环境,具体包括以下内容(所使用的版本是 Mathematica 11.1,更早的版本可能缺少某些函数,所以请使用最新版.robin ...

最新文章

  1. 优秀的Java程序员应具备哪些编程技术?
  2. codis3.2升级redis3.11到redis6.0.10调研
  3. python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?
  4. python文本的平均列数_文本的平均列数(Python程序实现)
  5. LInux 安全测试 2
  6. 腾讯AI Lab:深度解读AI辅助翻译的研究及应用
  7. 解决 nfs挂载错误wrong fs type, bad option, bad superblock
  8. 前端:JS获取浏览器类型类库
  9. windows_study_2
  10. 贴一段Jenkins的自动发布脚本
  11. MapReduce-从HBase读取数据处理后再写入HBase
  12. 使用rsync完成内网数据备份
  13. 电脑眼睛保护色——绿豆沙色
  14. 成语答题小程序源码安装 开源的成语答题小程序
  15. [乐意黎转载]从零开始学习jQuery (十) jQueryUI常用功能实战
  16. 复杂截面抗扭惯矩计算
  17. 【BZOJ1135】[POI2009]Lyz 线段树
  18. 代理记账的基本流程是什么
  19. 建站购买服务器前必看:服务器各参数的超详细说明
  20. 图片基本处理(imageView2)

热门文章

  1. 如何在VSCode上新建Flutter项目【两步搞定】
  2. Android 隐藏ImageView
  3. KafkStream架构
  4. Jmeter插件安装及使用
  5. sql server 查询数据库所有的表名+字段
  6. AngularJS 实现页面滚动到底自动加载数据的功能
  7. ormlite的使用方法
  8. 数据库 -- MySQL使用
  9. 终于购入Mac mini,发现HDMI接口与显示器不兼容,网购了一个VGA转换插头
  10. Windows服务器nginx多个二级域名部署ssl证书超详细步骤(https)