ADAMS/MATLAB联合仿真机械臂重力补偿问题 | 您所在的位置:网站首页 › adams怎么加力矩 › ADAMS/MATLAB联合仿真机械臂重力补偿问题 |
1 背景与重力补偿基本算法
现在有一个大型机械臂,要做一个缩比同构的小机械臂作为主控端来控制从端大机械臂。小臂的各个连杆可能比较重,要求用户在带着小臂运动的时候尽量感觉不到小臂各连杆的重量,并且在松手后小臂能立即静止不动。 由需求可知需要一个重力补偿算法,通过每个关节输出力矩来平衡掉各个连杆的重力。 首先第一个问题就是重力补偿算法的原理。我们不管用户的手如何去动小机械臂,每个马达只负责平衡掉重力的影响,也就是说,用户如果动作快一点的话是可以感觉到各个连杆的转动惯量,惯量这部分我们就不做别的处理了(貌似也没法处理)。 于是问题的本质就是一个静平衡问题:在重力作用下,在特定的一组关节角组合下,每个关节该输出多大的力矩才能让小机械臂保持静止。 参考战强老师的《机器人学:机构、运动学、动力学及运动规划》一书中P115关于机械臂连杆受力的描述,连杆i的受力情况如图。这里需要注意区分连杆i与关节i,在改进(前置)DH建模法里,连杆i从关节i开始,到关节i+1结束。而在我们进行三维建模时,我们建立的实体都是连杆,关节的概念是抽象的,一定要把这点搞清楚。 对于每个连杆i,有力平衡方程与力矩平衡方程: 其中Fi与Mi表示连杆i-1作用在连杆i上的力和力矩,Fi+1与Mi+1则是连杆i作用到连杆i+1上的力和力矩;g表示重力加速度在世界坐标系下的向量,即[0 0 -9.8].'。各个变量在左上角加角标表示在对应坐标系中的表达。 此外,表示坐标系{i+1}的位置在{i}中的表达,在坐标变换矩阵中可以直接读出(第四列的前三行);是连杆i的重心位置在{i}中的表达。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特别近之类的问题),另一方面也有可能是输入信号的斜率太大,可以对传入的信号乘上一个阶跃响应或者斜坡响应,当然对应的波形和仿真时间也要加以调整。
|
CopyRight 2018-2019 实验室设备网 版权所有 |