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

1 背景与重力补偿基本算法

现在有一个大型机械臂,要做一个缩比同构的小机械臂作为主控端来控制从端大机械臂。小臂的各个连杆可能比较重,要求用户在带着小臂运动的时候尽量感觉不到小臂各连杆的重量,并且在松手后小臂能立即静止不动。

由需求可知需要一个重力补偿算法,通过每个关节输出力矩来平衡掉各个连杆的重力。

首先第一个问题就是重力补偿算法的原理。我们不管用户的手如何去动小机械臂,每个马达只负责平衡掉重力的影响,也就是说,用户如果动作快一点的话是可以感觉到各个连杆的转动惯量,惯量这部分我们就不做别的处理了(貌似也没法处理)。

于是问题的本质就是一个静平衡问题:在重力作用下,在特定的一组关节角组合\mathbf{Q}\下,每个关节该输出多大的力矩{​{M}_{i}}\才能让小机械臂保持静止。

参考战强老师的《机器人学:机构、运动学、动力学及运动规划》一书中P115关于机械臂连杆受力的描述,连杆i的受力情况如图。这里需要注意区分连杆i与关节i,在改进(前置)DH建模法里,连杆i从关节i开始,到关节i+1结束。而在我们进行三维建模时,我们建立的实体都是连杆,关节的概念是抽象的,一定要把这点搞清楚。

 对于每个连杆i,有力平衡方程与力矩平衡方程:

\({}^{i}{​{\mathbf{F}}_{i}}={}_{i}^{i+1}\mathbf{R}\centerdot {}^{i+1}{​{\mathbf{F}}_{i+1}}-{​{m}_{i}}\centerdot ({}_{i}^{0}\mathbf{Rg})\\ ^{i}{​{\mathbf{M}}_{i}}=_{i}^{i+1}\mathbf{R}{​{\centerdot }^{i+1}}{​{\mathbf{M}}_{i+1}}+_{i}^{i+1}\mathbf{P}{​{\times }^{i}}{​{\mathbf{F}}_{i}}-{​{m}_{i}}\centerdot _{i}^{ci}\mathbf{r}\times (_{i}^{0}\mathbf{Rg})\\)

其中Fi与Mi表示连杆i-1作用在连杆i上的力和力矩,Fi+1与Mi+1则是连杆i作用到连杆i+1上的力和力矩;g表示重力加速度在世界坐标系下的向量,即[0 0 -9.8].'。各个变量在左上角加角标表示在对应坐标系中的表达。

此外,{}_{i}^{i+1}\mathbf{P}表示坐标系{i+1}的位置在{i}中的表达,在坐标变换矩阵_{i}^{i+1}\mathbf{T}中可以直接读出(第四列的前三行);_{i}^{ci}\mathbf{r}是连杆i的重心位置在{i}中的表达。R是旋转变换矩阵,如{}_{i}^{i+1}\mathbf{R}表示坐标系{i+1}的旋转在坐标系{i}中的表达,也可以从坐标变换矩阵里读出。

最后,各关节所需要的驱动力矩实际上就是受到力矩的平衡。这点不需多言。
 

2 仿真思路与ADAMS基础调试

比较明显的思路有两条。

其一,直接仿照现实工况,先把机械臂摆到一个关节角的状态,然后加上重力和驱动力矩看看能不能平衡。

其二,拐一个弯,给机械臂一个运动学驱动,让机械臂摆出某个姿势,然后读取运动学驱动里的力矩数值。

二者在ADAMS里都是可以实现的,但是实现起来第二种更为方便。这里先简单描述ADAMS里一些容易踩坑、或者可以作为日后的地方。

1. 首先ADAMS里的运动学驱动有两种,一种是直接修改运动副,在运动副的界面里点击添加驱动,这时候得到的是一个General Motion,这个我个人体验在后期加入测量等操作时比较麻烦,一般不用。另一种是在【驱动】里选择【运动副驱动】,然后再在对应的运动副上加驱动。

这个驱动是仅考虑运动学不考虑动力学的,你可以设置该驱动的角位移为STEP(time,0,0d,1,20d),那么这个关节在仿真开始时是0度,1秒时是20度,也可以设置为matlab输入的变量(针对第二种方法),这个之后再说。

2. ADAMS可以用脚本执行接续仿真,即仿到某个时间节点之后,对模型进行一系列调整,再接着进行仿真。

例如以下代码:

! Insert ACF commands here:
DEACTIVATE/GFORCE, ID=1
SIMULATE/DYNAMIC, END=1, STEPS=100
DEACTIVATE/MOTION, ID=1
ACTIVATE/GFORCE, ID=1
SIMULATE/DYNAMIC, DURATION=2.0, STEPS=100

表示开始时关闭掉一个力,然后仿真1秒,结束后关闭一个运动学驱动,打开之前关闭的那个力,再执行一个持续2秒的仿真。在写脚本时可以选择下面的【添加ACF命令】来辅助编写。这样一个脚本就可以实现先把机械臂摆到一个特定角度,然后关掉所有运动学驱动再施加力矩来看是否平衡。

3. 六维力的添加

这样建立的六维力,坐标系很容易出问题,比如各个轴对不上等。需要注意到新建一个六维力(广义力)之后,在力作用的两个物体上会分别出现两个坐标系,通过修改这两个坐标系可以改变六维力的定义。例如下图,就是把那两个坐标系的位置和角度都相对于DH2坐标系是(0,0,0),就可以让该六维力与DH2完全重合,此时该六维力的Z轴力矩就是关节驱动力矩。

 另外还需要注意即便如此,给Z轴添加的力矩还是可能出现正负号问题。正负号问题在ADAMS里无论是添加驱动还是添加测量都需要额外注意,再三核实,确保ADAMS里的模型与外部模型完全一致,不行就手动添加符号。如果有人知道怎么避免符号问题请务必告诉我。

4. 运动学驱动的力矩读取

通过运动学驱动一个连杆,必然会得到“驱动它如此运动需要多大的力”这样的数据。ADAMS不能直接读取这个数值,需要建立一个测量,否则直接输出的是在世界坐标系下的力矩值

 选中一个运动学驱动后新建一个测量,注意一定要设置【指出坐标系在】,设置为运动副本身就行。然后需要检查输出的正负值,如果符号不对,在上面那个【从/在】选另一个一般就行了。

3 ADAMS/MATLAB联合仿真

首先需要在ADAMS里创建一系列系统单元与数据单元,ADAMS与MATLAB的通讯即是通过这些单元的。其基本思路是:

MATLAB变量→ADAMS输入单元→对应的系统单元→用此变量进行驱动

ADAMS测量数据→对应的系统单元→ADAMS输出单元→MATLAB

具体的单元设置可以参考:

Adams与Matlab的机器人联合仿真【附源文件】_学机械的鱼鱼的博客-CSDN博客

基于Adams联合MATLAB的联合仿真设置_疯狂造机人~~的博客-CSDN博客

ADAMS中需要注意,用系统单元作为变量去驱动系统中的元素,需要加VARVAL函数表示该值是变化的。

在MATLAB部分,需要注意的是ADAMS的机械系统对输入比较敏感,直接传入参数的话很可能无法仿真。

 此时一方面需要检查输入信号是否出现敏感值(比如角度参数恰好离pi特别近之类的问题),另一方面也有可能是输入信号的斜率太大,可以对传入的信号乘上一个阶跃响应或者斜坡响应,当然对应的波形和仿真时间也要加以调整。

 

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值