用MATLAB玩转机器人--第六章 用MATLAB玩转单关节机器人

1. 概述

使用 simulink 搭建《用MATLAB玩转机器人》的第六章——单关节机器人的仿真,详细记录并积累 simulink 的使用技巧。

2. 仿真搭建

对于单关节机器人的位置控制,大致分为四个过程:

  1. 规划出单杆自由端的运动轨迹函数,分为加速、匀速、减速三个区间
  2. 建立机器人的机械、电气模块的数学模型
  3. 设计控制系统的数学模型
  4. 根据上述过程建立的数学模型进行仿真搭建并仿真。

另外,单关节机器人位置控制的仿真总共分为四个模块另:
     a. 运动轨迹函数生成模块
     b. PID控制器及输出限幅模块
     c. 减速器与传动装置模型
     d. 单杆的运动模型

2.1 运动轨迹函数

运动轨迹函数分为三个部分
(1)加速区间 0≤t≤2Δ
(6-1) η 加 速 ( t ) = π 4 Δ 2 t 3 − π 16 Δ 3 t 4 η_{加速}(t)= \frac{π}{4Δ^2}t^3-\frac{π}{16Δ^3}t^4\tag{6-1} η(t)=4Δ2πt316Δ3πt4(6-1)
(2)匀速区间 2Δ≤t≤2.5-2Δ
(6-2) η 匀 速 ( t ) = ( t − Δ ) × π η_{匀速}(t)=(t-Δ)×π\tag{6-2} η(t)=(tΔ)×π(6-2)
(3)减速区间 2.5-2Δ≤t≤2.5
η 减 速 ( t ) = 2 π − Δ π + π ( t − 2 ) − π 4 Δ 2 ( t − 2 ) 3 + π 16 Δ 3 ( t − 2 ) 4 η_{减速}(t)= 2π-Δπ+π(t-2)-\frac{π}{4Δ^2}(t-2)^3+\frac{π}{16Δ^3}(t-2)^4 η(t)=2πΔπ+π(t2)4Δ2π(t2)3+16Δ3π(t2)4

  1. Source 中拖入clockCommonly used blocks中拖入subsystem,将两者连线后,把Subsystem改为trajectory
    在这里插入图片描述
  2. 双击Subsystem,将In1改为tOut1改为theta*(t)
    在这里插入图片描述
    在这里插入图片描述
    观察在主系统中的改变
    在这里插入图片描述
  3. 绘制 0≤t≤2Δ 的时间区间
    在这里插入图片描述
  4. 拖入Enabled Subsystem,并连线
    在这里插入图片描述
  5. 双击Enabled Subsystem,进入子系统输入公式(6-1)
    (1)加速区间 0≤t≤2Δ加速区间 0≤t≤2Δ
    (6-1) η 加 速 ( t ) = π 4 Δ 2 t 3 − π 16 Δ 3 t 4 η_{加速}(t)= \frac{π}{4Δ^2}t^3-\frac{π}{16Δ^3}t^4\tag{6-1} η(t)=4Δ2πt316Δ3πt4(6-1)

在这里插入图片描述
公式(6-1)中的 t 即为子系统的输入 t,也为图中 u[1].
6. 采用同样的方法,分别绘制匀速区间、减速区间,公式如下:
(2)匀速区间 2Δ≤t≤2.5-2Δ
(6-2) η 匀 速 ( t ) = ( t − Δ ) × π η_{匀速}(t)=(t-Δ)×π\tag{6-2} η(t)=(tΔ)×π(6-2)
(3)减速区间 2.5-2Δ≤t≤2.5
η 减 速 ( t ) = 2 π − Δ π + π ( t − 2 ) − π 4 Δ 2 ( t − 2 ) 3 + π 16 Δ 3 ( t − 2 ) 4 η_{减速}(t)= 2π-Δπ+π(t-2)-\frac{π}{4Δ^2}(t-2)^3+\frac{π}{16Δ^3}(t-2)^4 η(t)=2πΔπ+π(t2)4Δ2π(t2)3+16Δ3π(t2)4
在这里插入图片描述
图中,示波器是为了观察轨迹函数的输出,merge 模块则参考链接simulink模块使用记录2-EnabledSubsystem/merge

2.2 机器人的机械仿真模型

单杆的数学模型为:
(6-4) τ = ( m 1 r 1 2 + I z z g 1 ) × θ ¨ 1 + c 1 θ ˙ 1 τ=(m_1r_1^2+I_{zzg1})×\ddotθ_1+c_1\dotθ_1 \tag{6-4} τ=(m1r12+Izzg1)×θ¨1+c1θ˙1(6-4)
单杆运动时,输入时扭矩 τ、输出是转角 θ 1 θ_1 θ1 m 1 m_1 m1 r 1 r_1 r1 I z z g 1 I_{zzg1} Izzg1 c 1 c_1 c1是常量。
将公式(6-4)变形如下,按照下面的公式建立仿真模型:
(6-5) θ ¨ 1 = 1 m 1 r 1 2 + I z z g 1 ( τ − c 1 θ ˙ 1 ) \ddotθ_1=\frac{1}{m_1r_1^2+I_{zzg1}}(τ-c_1\dotθ_1) \tag{6-5} θ¨1=m1r12+Izzg11(τc1θ˙1)(6-5)

  1. 拖入subsystem,双击后,将上述公式建立仿真
    在这里插入图片描述
    在这里插入图片描述
    子系统内部模块建立后,将子系统命名为Mecha,如下图
    在这里插入图片描述
2.3 机器人的电气仿真模型

simulink中新建ch6_sim模型文件,搭建如下系统。

2.3.1 直流电机部分

直流电机的电气结构数学模型为:
(6-6) T e = K t i a T_e=K_ti_a \tag{6-6} Te=Ktia(6-6)
(6-7) T e = T + ( J θ ¨ + B m θ ˙ ) T_e=T+(J\ddotθ + B_m\dotθ) \tag{6-7} Te=T+(Jθ¨+Bmθ˙)(6-7)
(6-8) i a ( s ) = 1 L a s + R a v ( s ) − K e s L a s + R a θ ( s ) i_a(s)= \frac{1}{L_as+R_a}v(s)- \frac{K_es}{L_as+R_a} θ(s) \tag{6-8} ia(s)=Las+Ra1v(s)Las+RaKesθ(s)(6-8)
式中, T e T_e Te是电机产生的转矩(N·m); K t K_t Kt是转矩常数(N·m/A);J是转子的惯性力矩(kg· m 2 m^2 m2); B m B_m Bm是旋转运动的粘性摩擦系数;T是将要传递到负载侧(单杆)的力矩(N·m);θ表示旋转角度; θ ˙ \dot θ θ˙表示旋转角速度(rad/s); θ ¨ \ddot θ θ¨表示角加速度(rad/ s 2 s^2 s2);v为输入电压(V); i a i_a ia为转子电流(A); R a R_a Ra为转子电阻(Ω); L a L_a La是转子电感(H); K e K_e Ke是逆启动转矩系数[V/(rad/s)]。

  1. 拖入subsystem,双击进入
    在这里插入图片描述
  2. Ports&& Subsystems中拖入In1
    在这里插入图片描述
  3. 将直流电机电气部分的仿真模型构建出来,即公式(6-6)、(6-7)、(6-8)
    在这里插入图片描述
    图中,输入Voltagetheta分别是公式(6-8)中的 v(s) 和 θ(s)。输出Torque是将要传到负载侧(单杆)的力矩 T,由公式(6-7)变形得到 (6-9) T = T e − ( J θ ¨ + B m θ ˙ ) T=T_e-(J\ddotθ + B_m\dotθ) \tag{6-9} T=Te(Jθ¨+Bmθ˙)(6-9)
    另外,图中的橘黄色部分原本是春微分环节 s ,但在一般情况下,淡村的微分环节容易受到高频噪声的干扰(实际上,表现为纯粹的微分特性的器件在现实生活中是很难纯在的),故采用了近似微分 s 0.01 s + 1 \frac{s}{0.01s+1} 0.01s+1s
    近似微分是给纯微分环节串联一个影响较小的低通滤波器 1 a s + 1 \frac{1}{as+1} as+11变成 s a s + 1 \frac{s}{as+1} as+1s的形式,这里a=0.01
2.3.2 减速器与传动装置

由公式(6-9)得到的 T 是由电机将要传递到负载侧(单杆)的力矩。考虑到齿轮传动中滑动摩擦等因素,在直流电机侧的输出扭矩 T 传递到负载侧时还会损失一部分的能量。
摩擦损失与电机侧输出扭矩 T 成比例,摩擦损失比例系数为 c ,则传到单杆的转轴一侧的单杆扭矩 τ 2 \tau_2 τ2
τ 2 = N ( T − c T ) = N × ( 1 − c ) × T = N × E × T \tau_2 = N(T - cT) = N×(1-c)×T = N×E×T τ2=N(TcT)=N×(1c)×T=N×E×T
为了描述方便,将电机侧输出力矩 T 改名为 τ 1 \tau_1 τ1,即 τ 1 \tau_1 τ1=T,则上式为: (6-10) τ 2 = N × E × τ 1 \tau_2 = N×E×\tau_1 \tag{6-10} τ2=N×E×τ1(6-10),式中,E = 1-c 被称为传导系数。
用公式(6-9)得到的结果再乘以系数 N 和 E 后,就是最终驱动单杆转动的力矩 τ 2 \tau_2 τ2
在simulink中完成减速器与传动装置的仿真模型。
在这里插入图片描述

2.4 PID 控制的仿真模型

PID 控制器的仿真由两部分构成,一部分是 PID 控制子模块,一部分是输出限幅模块Saturation。

2.4.1 PID 控制器的仿真模型

PID 控制器的传递函数为:
(6-11) D ( s ) = U ( s ) E ( s ) = K p [ 1 + 1 s T I + s T D ] D(s) =\frac{U(s)}{E(s)} = K_p[1+\frac{1}{sT_I}+sT_D] \tag{6-11} D(s)=E(s)U(s)=Kp[1+sTI1+sTD](6-11),用近似微分代替微分: (6-11) D ( s ) = K p [ 1 + 1 s T I + s T D a s T D + 1 ] D(s) = K_p[1+\frac{1}{sT_I}+\frac{sT_D}{asT_D+1}] \tag{6-11} D(s)=Kp[1+sTI1+asTD+1sTD](6-11)
在这里插入图片描述
在这里插入图片描述

2.4.2 PID 输出量的上下限设定

PID控制器的输出量是直流电机的输入电压,因为直流电机的输入电压是有上下限的,如果超出限制则有可能造成电机的损坏。
上下限的设置通过Saturation Block(饱和模块)实现,将上下限分别设定为 +24 和 -24,即设定 PID 控制器输出的值将被限定在电压±24V 范围内再传递给直流电机。
在这里插入图片描述
在这里插入图片描述

2.5 构建整体仿真模型
  1. 因为 PID的输出是直流电机的电压,故Saturation后接Moter的Voltage
    在这里插入图片描述
  2. 又系统的输出是角度θ,故偏差应该是期望角度与输出角度的差值,以此作为 PID 控制器的输入,故连线如下:
    在这里插入图片描述
  3. 在直流电机的仿真模块,由于公式(6-8)中用到θ(s),故需要将输出引到Motor的输入中去。
    在这里插入图片描述
    这里需要解释下增益N,即
          t h e t a M e c h a × N = t h e t a M o t o r theta_{Mecha}×N=theta_{Motor} thetaMecha×N=thetaMotor
    这是由于在直流电机模块中,存在的减速器。假设减速器链接的齿轮1和齿轮2的齿数分别为 n 1 n_1 n1 n 2 n_2 n2,则变速比 N 为:
              N = n 2 n 1 N=\frac{n_2}{n_1} N=n1n2
    当直流电机的旋转角度为 θ 1 \theta_1 θ1,单杆的旋转角度为 θ 2 \theta_2 θ2 时,
             θ 1 = N × θ 2 \theta_1 = N ×\theta_2 θ1=N×θ2
    角度的变比正好与扭矩的变比相反。
  4. 拖入gotofrom,并将from接到示波器,便于观察图形
  • trajectory的输出接goto,信号为设定的角度 θ
  • saturation的输出接goto,信号为 PID 输出的直流电机控制电压
  • Mecha输入处接goto,信号为电机输出到单杆侧的扭矩
  • Mecha的输出接goto,信号为系统输出的角度 θ
  • 将四路goto信号对应的from接到示波器,如图。
    在这里插入图片描述
    至此,单关节机器人的仿真搭建基本完成了。
3. 函数编写
3.1 initial_patam.m函数的编写

新建initial_patam.m函数,在此输入仿真所需要的初始化参数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% initialize_para.m
% 第6章 参数设置
% 轨迹函数,机械和电气系统,减速器和控制器的PID参数
%
% Version 1.0 by Hiroumi Mita, CYBERNET SYSTEMS CO.,LTD.
% Version 1.5 by Hongtao Zhang, 2016/08/12 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc;              % 清屏
close all;        % 关闭所有
clear;        % 清除所有变量

% 轨迹函数的参数
delta = 0.25;     % 轨迹函数中的 delta变量

% 机械参数
l1 = 0.2;         %杆长 单位:[m]
w1 = 0.01;        %杆宽[m]
h1 = 0.004;       %杆高[m]
r1 = 0.1;         %从杆端点到重心位置的长度[m],r1=0.5*l1
ro = 2690;         %杆的材料密度 单位:[Kg*m^3]
m1 = l1*w1*h1*ro;  %杆的质量[Kg]
Izzg1 = (1/12)*m1*(w1^2+l1^2); %杆的转动惯量,zz[kg*m^2]
Ixxg1 = (1/12)*m1*(w1^2+h1^2); %杆的转动惯量,xx[kg*m^2]
Iyyg1 = (1/12)*m1*(l1^2+h1^2); %杆的转动惯量,yy[kg*m^2]
c1 = 0.001;       %杆的粘性系数[N*s/rad]

% 电气参数
Ra = 10;     %电机电阻值[OM]
La = 4.4e-3; %电机电感值[H]
Kt = 0.05;   %扭矩常数[N*m/A]
Ke = Kt;     %反电力常数[V*s/rad]
J = 1e-5;    %电机的转动惯量[kg*m^2]
Bm = 1e-6;   %电机的粘性扭矩系数[N*s/rad]

% 减速器参数
N = 100; %齿轮数比
E = 0.7; %传递效率

% PID控制参数
Kp =100; %比例增益
Ti =0.1; %积分时间常数
Td =3;   %微分时间常数
eta=0.1; %近似微分参数
3.2 ch6_plot.m函数的编写

新建ch6_plot.m函数,在此函数中绘制单杆的运动轨迹。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ch6_plot.m
% 第6章 显示结果
%
% Version 1.0 by Hiroumi Mita, CYBERNET SYSTEMS CO.,LTD.
% Version 1.5 by Hongtao Zhang, 2016/08/12 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

close all;

xt=l1*cos(theta);  % x轴上随时间的变化值
yt=l1*sin(theta);  % y轴上随时间的变化值

figure(1)
axis square

for ii=1:length(t)   % 循环,从 ii=1,一直到 ii = length(t)
  x1=[0 xt(ii)];
  y1=[0 yt(ii)];

  h1= line(x1,y1);
  
      if 0<=t(ii)&&t(ii)<=0.5  %加速期间
          set(h1,'color','r');
          set(h1,'lineWidth',2);
      end

      if 0.5<t(ii)&&t(ii)<=2.0  %匀速期间
          set(h1,'color','g');
          set(h1,'lineWidth',2);
      end

      if 2.0<t(ii)&&t(ii)<=2.5  %减速期间
          set(h1,'color','b');
          set(h1,'lineWidth',2);
      end
end

for ii=1:length(t)-1
  x2=[xt(ii) xt(ii+1)];
  y2=[yt(ii) yt(ii+1)];
  h2= line(x2,y2);
  set(h2,'color','k');
  set(h2,'lineWidth',1);
end

% 绘制x轴
h3=line([-0.3 0.3],[0 0]); %给出x轴的数值范围
set(h3,'color','k');
set(h3,'lineWidth',1);

% 绘制y轴
h4=line([0 0],[-0.3 0.3]); %给出y轴的数值范围
set(h4,'color','k');
set(h4,'lineWidth',1);

xlim([-0.3 0.3])
ylim([-0.3 0.3])
4. 运行仿真
  1. 首先运行initialize_para.m函数,给仿真系统提供初始化参数
  2. 双击仿真系统中的示波器,并运行ch6_sim的仿真
  3. 观察到示波器输出如下
    第一幅是运动轨迹函数;第二幅是电机的输入电压,第三幅是单杆侧力矩。在这里插入图片描述
  4. 运行ch6_plot.m函数,得到单杆运动轨迹在这里插入图片描述
5. 资源下载

感谢《用MATLAB玩转机器人》的作者将此仿真模型提供了完整的资源下载。下载地址即下载教程如下:http://cip.com.cn
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 18
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
弹簧阻尼双足机器人是一种具有弹性和阻尼特性的机器人,其运动具有很高的复杂性。在周期行走中,机器人的运动可以分为支撑阶段和双支撑阶段。 支撑阶段:机器人只有一只脚接触地面,另一只脚处于空中。这个阶段主要是控制机器人的支撑脚的运动,使得机器人能够保持平衡。 双支撑阶段:机器人两只脚同时接触地面,这个阶段主要是控制机器人的摆动腿的运动,使得机器人能够保持前进。 为了模拟弹簧阻尼双足机器人的周期行走,我们可以使用ODE45函数进行编程。具体步骤如下: 1. 定义机器人的动力学模型,包括质量、惯性、弹性和阻尼等参数。 2. 在支撑阶段,通过控制支撑脚的力和位置来计算机器人的运动轨迹。 3. 在双支撑阶段,通过控制摆动腿的姿态和速度来计算机器人的运动轨迹。 4. 将支撑阶段和双支撑阶段的运动轨迹连接起来,得到机器人的周期行走轨迹。 下面是一个简的弹簧阻尼双足机器人周期行走支撑阶段、双支撑阶段ODE45编程的Matlab代码示例: ```matlab % 定义机器人的参数 m = 2; % 质量 I = 0.01; % 惯性 k = 1000; % 弹性系数 c = 10; % 阻尼系数 g = 9.8; % 重力加速度 % 定义初始条件 x0 = [0; 0; pi/6; 0; 0; 0]; % 位置、速度、关节角度、角速度 % 定义ODE函数 f = @(t, x) [x(4:6); -g*sin(x(3))/2 - k*x(1)/m - c*x(4)/m; g*sin(x(3))/2 - k*x(2)/m - c*x(5)/m; x(6)]; % 定义时间段 tspan = [0 10]; % 使用ODE45求解ODE函数 [t, y] = ode45(f, tspan, x0); % 绘制机器人的运动轨迹 plot(y(:, 1), y(:, 2)); ``` 在实际的应用中,需要根据具体的机器人模型和运动控制算法,对上述代码进行修改和优化。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值