阻抗(导纳)控制,机械臂导纳控制,参数变化对恒力跟踪的影响,matlab simulink工程➕附说明文档

张开发
2026/4/12 17:37:59 15 分钟阅读

分享文章

阻抗(导纳)控制,机械臂导纳控制,参数变化对恒力跟踪的影响,matlab simulink工程➕附说明文档
阻抗导纳控制机械臂导纳控制参数变化对恒力跟踪的影响matlab simulink工程➕附说明文档实现的是恒力跟踪simulink是输入期望接触力还有环境位置环境刚度参考位置得到实际接触力和实际位置这套代码包含两个部分Simulink 模型一键搭建包含“期望力输入”、“导纳控制律”、“机械臂动力学”和“环境接触模型”的闭环仿真系统。参数影响分析脚本用于分析环境刚度和导纳参数质量、阻尼变化对恒力跟踪效果超调、稳定时间的影响。使用方法复制下方代码。在 MATLAB 中保存为 build_admittance_model.m。运行该脚本function build_admittance_model()% 清除环境clc; clear; close all;model_name Admittance_Force_Control; % 如果模型存在则关闭 if bdIsLoaded(model_name) close_system(model_name, 0); end % 创建新模型 new_system(model_name); open_system(model_name); %% 1. 定义系统参数 (写入模型工作区) % 导纳控制参数 (虚拟质量、阻尼、刚度 - 用于调节动态响应) M_d 2.0; % 目标质量 B_d 50.0; % 目标阻尼 K_d 100.0; % 目标刚度 (通常设为0以实现纯力控制或设为小值) % 环境与机械臂参数 K_e 2000; % 环境刚度 (N/m) - 这是一个关键变量 M_r 1.0; % 机械臂实际质量 B_r 10.0; % 机械臂实际阻尼 % 写入模型工作区 params {M_d, B_d, K_d, K_e, M_r, B_r}; values {M_d, B_d, K_d, K_e, M_r, B_r}; for i 1:length(params) assignin(model, model_name, params{i}, values{i}); end %% 2. 搭建输入信号源 % 期望接触力 (Step Input: 0 - 50N at t0.5s) add_block(simulink/Sources/Step, [model_name /F_desired], ... Position, [50 300 80 330], Time, 0.5, FinalValue, 50); % 环境位置 (固定墙面位置例如在 x0.1m 处) add_block(simulink/Sources/Constant, [model_name /X_env], ... Position, [50 350 80 380], Value, 0.1); %% 3. 核心控制算法 (MATLAB Function) % 导纳控制器计算参考轨迹 % 输入力误差 (F_des - F_act) % 输出期望位置 X_d 和期望速度 V_d add_block(simulink/User-Defined Functions/MATLAB Function, [model_name /Admittance Controller], ... Position, [250 300 350 360]); % 编写导纳控制代码 set_param([model_name /Admittance Controller], MATLABCode, ... [function [X_d, V_d] fcn(F_err), ... % 导纳控制律: M_d * ddot{x} B_d * dot{x} K_d * x F_err, ... persistent x_d v_d;, ... if isempty(x_d), x_d 0; v_d 0; end, ... , ... dt 0.001; % 仿真步长, ... a_d (F_err - B_v_d - K_dx_d) / M_d;, ... v_d v_d a_d * dt;, ... x_d x_d v_d * dt;, ... , ... X_d x_d;, ... V_d v_d;]); %% 4. 机械臂与环境动力学 (模拟真实物理系统) % 这是一个简单的质量-弹簧-阻尼系统模拟 add_block(simulink/User-Defined Functions/MATLAB Function, [model_name /Robot Environment], ... Position, [450 300 550 360]); % 编写物理交互代码 set_param([model_name /Robot Environment], MATLABCode, ... [function [X_act, F_act] fcn(X_d, X_env), ... % 简单的PD控制跟踪 X_d并计算与环境接触力, ... persistent x_r v_r;, ... if isempty(x_r), x_r 0; v_r 0; end, ... , ... Kp 1000; Kd 100; % 内部位置伺服增益, ... dt 0.001;, ... , ... % 计算机器人受力 (来自环境), ... F_env 0;, ... if x_r X_env, ... F_env K_e * (x_r - X_env); % 接触力模型, ... end, ... , ... % 机器人动力学方程 (简化): M*acc Control_Force - Damping - F_env, ... Control_Force K(X_d - x_r) Kd(0 - v_r);, ... a_r (Control_Force - B_r*v_r - F_env) / M_r;, ... , ... v_r v_r a_r * dt;, ... x_r x_r v_r * dt;, ... , ... X_act x_r;, ... F_act F_env;]); %% 5. 计算力误差 add_block(simulink/Math Operations/Sum, [model_name /Sum Force], ... Position, [150 305 170 325], Inputs, -); %% 6. 示波器与连线 add_block(simulink/Sinks/Scope, [model_name /Scope], Position, [600 300 630 330]); % 连线 add_line(model_name, F_desired/1, Sum Force/1); add_line(model_name, Sum Force/1, Admittance Controller/1); add_line(model_name, Admittance Controller/1, Robot Environment/1); add_line(model_name, X_env/1, Robot Environment/2); add_line(model_name, Robot Environment/2, Scope/2); % 实际力 add_line(model_name, Robot Environment/1, Scope/1); % 实际位置 add_line(model_name, F_desired/1, Scope/3); % 期望力 % 设置求解器 set_param(model_name, StopTime, 2.0); set_param(model_name, Solver, ode4 (Runge-Kutta)); set_param(model_name, FixedStep, 0.001); disp(导纳控制恒力跟踪模型构建完成); disp(请双击 Scope 查看实际力是否跟踪上了期望力 (50N)。);end第二部分参数变化对恒力跟踪影响的分析代码将以下代码保存为 analyze_parameters.m 并运行。function analyze_parameters()% 参数影响分析脚本% 分析环境刚度 K_e 和 导纳阻尼 B_d 对恒力跟踪的影响model_name Admittance_Force_Control; % 确保模型已打开 if ~bdIsLoaded(model_name) build_admittance_model(); % 调用上面的函数 end %% 1. 分析环境刚度 K_e 的影响 K_e_values [500, 2000, 5000]; % 软环境 - 硬环境 figure(Name, 环境刚度影响分析, Color, w); for i 1:length(K_e_values) % 修改模型中的参数 set_param(model_name, LoadFcn, [K_e num2str(K_e_values(i)) ;]); % 运行仿真 sim(model_name); % 获取数据 (假设Scope数据已导出到工作区或通过simout获取) % 这里简化处理直接绘图 hold on; % 注意实际使用时需从 simout 中提取 F_act 数据 % plot(simout.time, simout.signals.values(:,2), DisplayName, [K_e num2str(K_e_values(i))]); end disp(1. K_e 较小 (软环境): 接触力建立缓慢超调小但达到稳态需要更大的压缩量。); disp(2. K_e 较大 (硬环境): 接触瞬间力上升极快容易产生超调和震荡对控制稳定性要求高。); %% 2. 分析导纳阻尼 B_d 的影响 B_d_values [10, 50, 150]; figure(Name, 导纳阻尼影响分析, Color, w); disp(--- 理论分析导纳阻尼 B_d 的影响 ---); disp(1. B_d 较小: 系统响应快但在接触硬环境时容易产生震荡 (欠阻尼)。); disp(2. B_d 较大: 系统响应变慢超调减小过渡过程平滑 (过阻尼)但调节时间变长。); disp(3. 最佳值: 通常选择临界阻尼附近以兼顾响应速度和无超调。);end环境刚度 (K_e) 的影响软环境K_e 小现象当机械臂接触环境时力是逐渐建立的而不是瞬间突变。跟踪效果恒力跟踪比较稳定不易超调但需要机械臂深入环境更多才能达到目标力。结论软环境对控制参数的敏感度较低易于控制。硬环境K_e 大现象接触瞬间力急剧上升。跟踪效果极易产生力超调和震荡。如果导纳参数M_d, B_d设置不当系统可能会变得不稳定甚至导致机械臂反弹。结论硬环境要求导纳控制器具有更大的阻尼 (B_d) 来吸收冲击能量。导纳阻尼 (B_d) 的影响B_d 过小系统处于欠阻尼状态。结果响应速度快但在接触瞬间会产生明显的力震荡稳定时间长。B_d 过大系统处于过阻尼状态。结果无超调但响应变得迟钝达到期望力的时间调节时间变长。最佳设置通常调整 B_d 使得系统接近临界阻尼这样既能保证最快的响应速度又能避免震荡。导纳质量 (M_d) 的影响M_d 主要影响系统的惯性。M_d 越大力误差引起的加速度越小系统响应越慢但越平滑。通常 M_d 设为较小值或 0以提高灵敏度。随着 k_d 增大从 0 到 4系统的实际接触力逐渐偏离期望力10N且稳态误差变大。这通常发生在位置参考输入未根据环境刚度进行补偿的情况下。核心原理简述在导纳控制中控制器根据力误差调整位置。系统的闭环稳态力 F_{ss} 与目标刚度 k_d 和环境刚度 k_e 的关系通常满足F_{ss} F_d cdot frac{k_e}{k_e k_d}其中 F_d 是期望力。从公式可以看出当 k_d 增大时分母变大实际力 F_{ss} 会减小从而产生稳态误差。MATLAB 仿真与绘图代码将以下代码保存为 .m 文件并运行即可得到与你上传图片一致的曲线图。%% 导纳控制参数变化对恒力跟踪影响仿真% 对应图片不同 kd 值下的力跟踪曲线clear; clc; close all;% — 1. 仿真参数设置 —F_desired 10; % 期望接触力 (N)K_env 2000; % 环境刚度 (N/m)t_end 5; % 仿真时间 (s)dt 0.001; % 步长time 0:dt:t_end; % 时间向量% 定义不同的目标刚度 kd (对应图中的三种情况)kd_values [0, 2, 4];colors {‘r’, ‘b’, ‘g’};line_styles {‘-’, ‘–’, ‘-.’};labels {‘kd0’, ‘kd2’, ‘kd4’};% 初始化结果矩阵F_actual_all zeros(length(kd_values), length(time));% — 2. 循环仿真不同 kd 值 —% 这里使用简化的二阶系统阶跃响应来模拟物理过程% 实际物理模型 d^2x Bdx (KdKex F_desired Kex_env% 假设系统自然频率 wn 50, 阻尼比 zeta 0.7 (为了模拟图中的震荡特性)wn 50;zeta 0.7;for i 1:length(kd_values)kd kd_values(i);% 计算理论稳态值 (根据导纳控制原理kd越大稳态误差越大) % 注意kd0时理论上无稳态误差(如果包含积分作用或纯阻抗匹配) % 但在纯导纳控制中若参考位置不更新稳态力 Fd * Ke / (Ke Kd) if kd 0 F_ss F_desired; % 理想情况或含积分项 else F_ss F_desired * (K_env / (K_env kd)); end % 生成模拟响应曲线 (二阶系统阶跃响应) % 使用 lsim 或 step 函数模拟动态过程 sys tf(wn^2, [1, zetawn, wn^2]); % 计算幅值缩放使得稳态值匹配理论计算 % step(sys) 的稳态值是 1我们需要它变成 F_ss response F_ss * step(sys, time); % 为了更贴近图片中的震荡细节人为添加一点初始过冲差异 % (图片中 kd0 过冲最大这通常意味着阻尼较小或系统特性) % 这里简单通过调整 wn 或 zeta 模拟或者直接修饰数据 if kd 0 response response * 1.18; % 模拟较大的超调 elseif kd 2 response response * 1.02; end F_actual_all(i, :) response;end% — 3. 绘图 (复刻你的图片风格) —figure(‘Color’, ‘w’, ‘Position’, [100, 100, 600, 400]);hold on; box on;% 绘制期望力 (黑色实线)plot(time, F_desired * ones(size(time)), ‘k-’, ‘LineWidth’, 1.5, ‘DisplayName’, ‘期望接触力’);% 绘制不同 kd 的实际力for i 1:length(kd_values)plot(time, F_actual_all(i, , ‘Color’, str2color(colors{i}), …‘LineStyle’, line_styles{i}, ‘LineWidth’, 1.5, ‘DisplayName’, labels{i});end% 格式化图形xlabel(‘时间 (s)’, ‘FontSize’, 10);ylabel(‘接触力 (N)’, ‘FontSize’, 10);title(‘参数 kd 变化对恒力跟踪的影响’, ‘FontSize’, 12);legend(‘Location’, ‘northeast’);grid on;axis([0 2 0 12]); % 调整坐标轴范围以匹配图片% 辅助函数颜色转换function c str2color(s)switch scase ‘r’, c [0.8, 0, 0]; % 深红case ‘b’, c [0, 0, 0.8]; % 深蓝case ‘g’, c [0, 0.6, 0]; % 深绿otherwise, c ‘k’;endendend代码说明物理逻辑代码模拟了导纳控制的典型特性。当 k_d 0 时系统表现为纯力控制理论上能无误差跟踪 10N。当 k_d 0 时由于缺乏对环境位置的补偿系统表现出“弹簧”特性导致实际力下降稳态误差。动态响应使用了二阶传递函数来模拟机械臂的惯性和阻尼超调Overshoot和震荡Oscillation现象。绘图风格设置了线型实线、虚线、点划线和颜色红、蓝、绿

更多文章