无伤理解阻抗控制:机械臂的阻抗、导纳控制(间接力控):第一篇 思想源泉

本文详细介绍了机械臂的阻抗和导纳控制原理,强调了它们与传统控制的区别,以及如何通过控制律实现类似弹簧系统的运动效果。通过MATLAB示例,展示了如何在不同情景下应用阻尼控制,包括无干扰、有阻尼和有接触力情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

  • 机械臂的阻抗控制、导纳控制是属于对机器人进行间接力控的范围
  • 既然你找到了阻抗控制,那你就是不满足于对机器人进行简单的位置控制了
  • 所以第一篇就是入门篇,只讲这个阻抗控制思路是怎么来的,希望看了之后就懂了内核

后面章节安排

  1. 补全机械臂力控的体系
    1. 阻抗控制是力控中的一种,接下来会把这个机械臂力控的体系补全,让你看到阻抗控制在其中的位置
  2. 将阻抗控制应用到6轴机器人
    1. 第一章讲清楚阻抗控制思想源泉,但毕竟不是直接应用在6轴机器人上

同知乎Winter:机械臂的阻抗、导纳控制(间接力控):第一篇 思想源泉 - 知乎

重点

  • 之前看别人的阻抗控制的文章,看得迷迷糊糊。最重要的一点就是他把阻抗控制和传统的控制观念混为一谈。也许你在了解阻抗控制的时候就会很奇怪,不论是经典控制还是现代控制,里面都没有这个概念。因为他本来就不是一个东西。
  • 阻抗控制是应用在机械臂上面。他给出的是一个目标,就是说你应该按照这个方法进行。如果你真的按照这个方法进行了,那么你就可以达到类似于一个阻尼弹簧系统的作用。而我们平常所说的控制的概念,是具体在驱动器上设计一个控制律,或者说PID等来实现这个方法。
  • 阻抗控制----->告诉你应该这样
  • 广义控制----->应该怎样设计控制律来达到上面所说的效果

正文

阻抗控制的抽象示意

这个控制是用在机器人执行某一个任务过程中。就是说他是在运动着的。在这个过程中,如果他不小心碰到了一个物体。比如说是你的手。如果你想让他表现的是一个软绵绵的弹簧的话。如果这个机械臂撞到了你的手臂。那么它就会像一个弹簧一样弹开。如果你想让他表现是一个很硬的弹簧。那么你的手臂对他来说就是个障碍,它就会像一个很硬的弹簧一样按照它的轨迹继续运行。

我们接下来拿一个物块,举一个这个例子,就把他当做机器人的一个关节,然后他再向右运动。

仔细看下面这张图,然后搞清楚每个图中的每个因素各对应着什么?我们之前看不懂,阻焊控制就是概念很模棱两可,比如说你想要像弹簧,那么弹簧在哪儿它起点是哪终点又是哪?如果你看懂了这张图,那么阻抗控制的控制,你自己就可以写出来。

这里我想让这个机器人物块儿移动到右边红旗的位置那里。到了之后直接停下来,速度为0。红色的实线是实际真正存在的东西。而我用绿色表示的就是你希望他表现出来的弹簧阻尼系统。

这里还没有涉及到与环境接触力的问题。我们就先简单分析这个场景。如果你希望。你的机器人系统所表现出来很大的刚度。也就是这里的弹簧k很大。那么在机器人物块距离期望目标位置一定的情况下。弹簧产生的拉力就非常大。那么他的速度必然就很快。

K : 所以这里的目标就出现了。如果这个物块跑得很快。那么你就会觉得确实这个弹簧的刚度很大。就是位置变化很快

B:如果你希望这个系统的阻尼很大,那么他表现的情况就是很缓慢。那么你就要让这个物体的速度变化很慢。

M:如果你想让这个物体的质量。很大。那么它所表现出来的特性就是它的加速度不容易改变。

加上与环境的交互力

也许这里加上力之后,会让你理解更加直观一点。在这个物块执行他任务的过程中,也就是移动到预期位置的时候。你的手不小心碰到了他。就在你手的位置接触到的那一刻。如果你希望这个木块它的刚度又大,质量也大。那么你就要控制这个物块,对你的手输出一个很大的力。

这个就是:基于力的阻抗控制,控制目标是力的大小(你可以自主采用各种方法实现)

换一种思路。你的手在不同的位置触碰到物块的时候,感受到的是相同的力。那么你在偏左边的时候。你就会觉得这个物块这个系统的刚度很小。如果你是在右边感受到同样的力,那么你就会觉得这个的刚度很大。

这个就是:基于位置的阻抗控制,(让用户感受相同力下)控制目标是位置(你也可以自主采用各种方法实现)

应用:打磨机的例子

本来要理想的打薄,但是锈迹太厚,产生力,我想要这个机器人表现很强硬,K很大,那么目前位置和实际位置有一个差值,这个是运动,那我理想阻抗特性K很大,那么我产生一个很大的力(控制目标),就是打磨力这才符合我的特性,所以里面就有一个力控制,

如果是另一种,传感器是接触力传感器,我同样要K很大,那我这个机器人系统怎么表现很刚,K很大,在这个力传感器测的一定值,那么位移差就越小,那这个机器人就越要接近目标位置(控制目标),尽管障碍物拦着,我还是要拼命去压它,让它感受我的K很大

最核心:控制目标的导出

这里我们采用第二种(控制目标是位置的)

注意:这里都是你想要的(K、B、M),所以才会得出你想要的a(或者说x(位置))

MATLAB程序仿真

机器人任务:这个物块要靠近期望的位置

情景一、

  • 没有人手干扰它(没有接触力)
  • 没有阻尼
  • qr = 5; % 期望位置
  • x0 = [0; 0]; % 初始位置和速度
  • K = 10; % 位置控制增益

    M = 5; % 质量控制增益
    B = 2; % 阻尼控制增益
  • 情景二、

  • 没有人手干扰它(没有接触力)
  • 有阻尼
  • qr = 5; % 期望位置
  • x0 = [0; 0]; % 初始位置和速度
  • K = 10; % 位置控制增益

    M = 5; % 质量控制增益
    B = 2; % 阻尼控制增益
  • 情景三、

  • 有人手干扰它(有接触力)fe = 10; % 参考力/力矩
  • 有阻尼
  • qr = 5; % 期望位置
  • x0 = [0; 0]; % 初始位置和速度
  • K = 10; % 位置控制增益

    M = 5; % 质量控制增益
    B = 2; % 阻尼控制增益
  • 你可以看到,它的弹簧刚度是10,力也是10,正好位置就停靠在(5-4)=1差1,就像是你的手对弹簧施加力之后弹簧停在那里。

    情景推广

    你可能觉得移动的固定位置太简单,想要追踪变化的,这里以sin函数为例(你直接想象那个弹簧的右边连接点一直sin移动就行)

你可能会觉得,这个蓝色的曲线这也太差了,我随便一个PID瞎调节都可以比它跟踪的好

重点:时刻区分控制目标和实际控制区别,这里的蓝色曲线看起来很差,但是我们目标并不是是要追踪sin曲线,我们的目标是在追踪sin的过程中像是一个弹簧阻尼系统在追踪

所以你接下来还是费心思设计控制器去追踪这个看起来很垃圾的蓝色曲线,这个具体你想用什么方法就不属于阻尼控制范围了,我只是告诉你你应该这么办


码字不易,多多点赞,关注Winter,后续将这个推广到6关节机器人,然后用simulink仿真

参考文献

力控机器人(触觉感知)阻抗控制性能(performance specifications)与MATLAB程序实现 - 古月居

干货 | 机械臂控制第2篇:单关节阻抗控制

附录

clc;clear;close all
% 机器人阻抗控制程序
% 机器人参数
m = 1;          % 质量
k = 10;         % 刚度
c = 1;          % 阻尼
% 阻抗控制参数
K = 10;        % 位置控制增益

M = 5;          % 质量控制增益
B = 2;          % 阻尼控制增益
% 目标参考位置和力/力矩
qr = 5;         % 参考位置
fe = 10;       % 参考力/力矩
% 初始状态
x0 = [0; 0];    % 位置和速度
f0 = 0;         % 初始力/力矩
% 阻抗控制循环
t = 0:0.01:100;  % 时间向量
x = zeros(2, length(t));     % 位置和速度
f = zeros(1, length(t));     % 力/力矩
x(:,1) = x0;    % 初始状态
f(1) = f0;
for i = 2:length(t)    
% 计算误差和误差导数    
e = qr - x(1, i-1);     % 位置误差
de = -x(2, i-1);        % 速度误差        
% 计算控制力/力矩    
% fc = Kp*e + Kv*de + M*(fr-f(1)) + B*(-x(2,i-1))+m*; 

% fc = Kp*e + Kv*de + M*(fr-f(1)) + B*(-x(2,i-1));     
% a = (fc - c*x(2,i-1) - k*x(1,i-1))/m; 

a=M\(K*e+B*de-fe);

x(2,i) = x(2,i-1) + a*0.01;    
x(1,i) = x(1,i-1) + x(2,i)*0.01;        
% 记录控制力/力矩和位置    
% f(i) = fc;
end
% 绘图
plot(t, x(1,:), 'b', t, qr*ones(size(t)), 'r--')
xlabel('时间 (s)')
ylabel('控制目标:位置 (m)')
legend('控制目标:位置', '参考位置')
title('单自由度机器人阻抗控制')
### 六自由度机械 MATLAB 导纳控制实现方法 #### 1. 基本原理介绍 导纳控制是一种基于柔顺性的控制策略,它允许机器人末端执行器对外部环境施加的力量作出响应。通过定义虚拟的质量、阻尼和刚度矩阵,可以使机器人的行为类似于物理上的弹簧-质量-阻尼系统[^1]。 对于六自由度(6 DOF)机械来说,这种控制方式特别适用于需要与不确定环境交互的任务场景,比如装配作业中的精细操作或是医疗手术辅助设备的设计开发等场合。 #### 2. 控制算法设计 为了在MATLAB环境中实现针对六轴工业机器人导纳控制器,通常遵循如下几个方面: - **建立动力学方程**:利用拉格朗日力学或其他适当的方法推导出描述该类多体系统的动态特性表达式; - **设定参数化形式的逆动力学解算器**:即计算所需关节转矩以跟踪期望轨迹的同时考虑外部接触力的影响; - **引入广义坐标系下的弹性变形量作为输入变量之一参与到反馈回路当中去调整实际输出的位置姿态信息。 具体而言,在编写Matlab脚本时可参照以下伪代码框架来进行编程工作: ```matlab % 定义系统属性及初始条件 robot = SerialLink(L); % 创建串联型结构对象实例 q0 = [0, pi/4, -pi/3, ... ]; % 设置起始配置向量 Kp = diag([kx ky kz krx kry krz]); % 刚度系数矩阵 Dp = diag([dx dy dz drx dry drz]); % 阻尼系数矩阵 M = eye(6)*m; % 质量矩阵 (假设各方向相同) while true % 获取当前状态数据 qd = getDesiredPosition(); % 用户指定的目标位置 Fext = measureExternalForce(); % 测量得到外界干扰力 % 计算误差信号e=[ex ey ez erx ery erz]' e = ... % 应用导纳公式求取理想速度v* v_star = inv(M)*(Fext-Dp*v-Kp*e); % 将其转换成对应的关节角速率变化δθ=J⁺*v* delta_qdot = pinv(robot.jacobe(q))*v_star; % 更新下一时刻的状态估计值 q_next = q + dt * delta_qdot; end ``` 上述过程展示了如何在一个简单的循环体内完成一次完整的迭代更新流程。需要注意的是这里省略了一些细节部分如雅克比矩阵`jacobe()`的具体构造以及时间步长的选择等问题,这些都需要依据实际情况灵活处理[^2]。 #### 3. 可视化调试工具的应用 除了核心逻辑之外,良好的可视化界面也是不可或缺的一部分。借助于MATLAB自带的各种绘图功能模块,能够方便快捷地绘制出诸如路径规划曲线、受力分析图表等内容帮助开发者更好地理解整个控制系统的工作机理并及时发现潜在缺陷所在之处[^3]。 例如可以通过调用`plot()`函数来展示随时间演化的外力变化趋势或者使用`trimesh()`命令渲染三维空间内的运动轨迹图像等等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值