弹簧阻尼双足机器人周期行走单支撑阶段、双支撑阶段ode45编程matlab
时间: 2023-09-03 14:08:14 浏览: 98
弹簧阻尼双足机器人的运动学、动力学分析比较复杂,需要采用数值解法进行求解。本文介绍使用ode45函数实现弹簧阻尼双足机器人周期行走单支撑阶段、双支撑阶段的仿真。
1. 建立运动学模型
双足机器人的运动学模型可以用一个六维向量表示:$q = [x, y, \theta, \phi_1, \phi_2, \phi_3]^T$,其中 $x$ 和 $y$ 分别表示机器人的水平位移,$\theta$ 表示机器人的旋转角度,$\phi_i$ 表示第 $i$ 条腿的摆动角度。
根据双足机器人的运动学模型,可以得到机器人的速度和加速度表达式:
$$
\begin{aligned}
v_x &= \dot{x} \\
v_y &= \dot{y} \\
\omega &= \dot{\theta} \\
\dot{\phi_i} &= \frac{\pm v_{ti} - l_2 \omega \sin(\phi_i)}{l_1} \\
a_x &= \ddot{x} \\
a_y &= \ddot{y} \\
\alpha &= \ddot{\theta} \\
\ddot{\phi_i} &= \frac{\pm a_{ti} - l_2 \alpha \sin(\phi_i) - l_2 \omega^2 \cos(\phi_i)}{l_1}
\end{aligned}
$$
其中,$v_{ti}$ 和 $a_{ti}$ 分别表示第 $i$ 条腿在质心系中的速度和加速度,$l_1$ 和 $l_2$ 分别为机器人的腿长和腿的水平距离。
2. 建立动力学模型
双足机器人的动力学模型可以用牛顿-欧拉法表示。根据牛顿-欧拉法,可以得到机器人的运动方程:
$$
M(q)\ddot{q} + C(q, \dot{q})\dot{q} + G(q) = F
$$
其中,$M(q)$ 表示质量矩阵,$C(q, \dot{q})$ 表示科里奥利力和离心力,$G(q)$ 表示重力势能,$F$ 表示外力。
3. 建立控制策略
弹簧阻尼双足机器人的控制策略一般采用基于反馈的控制方法。在本文中,我们采用 PD 控制器进行控制。控制器的输出为关节角速度,可以通过关节角度的微分得到关节角加速度。
4. 编写仿真程序
根据上述运动学模型、动力学模型和控制策略,可以编写仿真程序。具体步骤如下:
(1)定义仿真参数
```matlab
% 仿真参数
T = 2; % 仿真时间
dt = 0.01; % 时间步长
t = 0:dt:T; % 时间向量
n = length(t); % 时间步数
```
(2)定义机器人参数
```matlab
% 机器人参数
m = 45; % 机器人质量
l1 = 0.5; % 腿长
l2 = 0.2; % 腿的水平距离
I = m * l1^2 / 12; % 质心惯量
```
(3)定义初始状态
```matlab
% 初始状态
x0 = [0; 0; 0; 0; 0; 0]; % [x, y, theta, phi1, phi2, phi3]
```
(4)定义控制器参数
```matlab
% 控制器参数
kp = 200; % 比例系数
kd = 50; % 微分系数
```
(5)定义运动方程
```matlab
% 运动方程
M = @(q) [m, 0, -m*l1/2*sin(q(3)), 0, 0, 0;
0, m, m*l1/2*cos(q(3)), 0, 0, 0;
-m*l1/2*sin(q(3)), m*l1/2*cos(q(3)), I+m*l1^2/4, 0, 0, 0;
0, 0, 0, m, 0, 0;
0, 0, 0, 0, m, 0;
0, 0, 0, 0, 0, m];
C = @(q, qd) [-m*l1/2*qd(3)*cos(q(3)), -m*l1/2*qd(3)*sin(q(3)), 0, 0, 0, 0;
m*l1/2*qd(3)*sin(q(3)), -m*l1/2*qd(3)*cos(q(3)), 0, 0, 0, 0;
0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0];
G = @(q) [0; -m*9.8; 0; 0; -m*9.8; 0];
F = @(qd) [0; 0; 0; 0; 0; 0];
```
(6)定义控制器函数
```matlab
% 控制器函数
function tau = controller(q, qd, kp, kd)
% PD控制器
e = [0; 0; 0; 0; 0; 0] - q;
ed = [0; 0; 0; 0; 0; 0] - qd;
tau = kp * e + kd * ed;
end
```
(7)定义ODE函数
```matlab
% ODE函数
function dqdt = ode_fun(t, q, M, C, G, F, kp, kd)
% 运动方程
dqdt = zeros(6, 1);
dqdt(1:3) = q(4:6);
dqdt(4:6) = inv(M(q)) * (F(qd) - C(q, qd) * qd - G(q) + controller(q, qd, kp, kd));
end
```
(8)定义ODE求解器
```matlab
% ODE求解器
options = odeset('RelTol', 1e-6, 'AbsTol', 1e-6);
[t, q] = ode45(@(t,q)ode_fun(t, q, M, C, G, F, kp, kd), t, x0, options);
```
(9)绘制仿真结果
```matlab
% 绘制仿真结果
figure;
plot(q(:,1), q(:,2), 'b', 'LineWidth', 2);
xlabel('x');
ylabel('y');
title('弹簧阻尼双足机器人周期行走仿真');
axis equal;
grid on;
```
至此,我们完成了弹簧阻尼双足机器人周期行走单支撑阶段、双支撑阶段的ODE45编程Matlab。
阅读全文