六足机器人作为移动机器人领域的重要分支,其运动控制一直是研究热点。传统六足机器人通常采用串联式腿部结构,每条腿由3-4个旋转关节组成,这种构型虽然灵活但控制复杂度较高。我们团队尝试了一种创新思路:将六足机器人的运动控制问题简化为平面并联机构的控制问题。
这个项目的核心创新点在于:
提示:3PRR中的P代表平移关节(Prismatic),R代表旋转关节(Revolute),这种构型在并联机器人中很常见但应用于六足机器人控制属于创新尝试。
首先需要在顶视图中建立全局坐标系和局部坐标系:
关键参数定义:
matlab复制% 参数初始化示例
r_p = 0.2; % 动平台半径(m)
r_b = 0.5; % 静平台半径(m)
l = 0.3; % 支链长度(m)
theta = [0, 120, 240]; % 三条支链初始角度(deg)
正解问题是已知各驱动关节位移,求动平台位姿。对于3PRR机构:
建立闭环矢量方程:
$$ \vec{OB_i} + \vec{B_iP_i} = \vec{OP} + \vec{PP_i} $$
投影到x,y轴得到约束方程:
$$
\begin{cases}
d_i\cos\alpha_i + l\cos\beta_i = x + r_p\cos\gamma_i \
d_i\sin\alpha_i + l\sin\beta_i = y + r_p\sin\gamma_i
\end{cases}
$$
通过数值方法求解非线性方程组
matlab复制function [x,y,phi] = forward_kinematics(d1,d2,d3)
% 初始化
max_iter = 100;
tol = 1e-6;
% 初始猜测
x0 = [0; 0; 0];
% Newton-Raphson迭代
for k = 1:max_iter
[f, J] = compute_residual(x0,d1,d2,d3);
dx = -J\f;
x0 = x0 + dx;
if norm(dx) < tol
break;
end
end
x = x0(1);
y = x0(2);
phi = x0(3);
end
逆解问题是已知动平台位姿,求各驱动关节位移。推导过程更直接:
计算各连接点P_i在全局坐标系中的坐标:
$$
\begin{cases}
x_{P_i} = x + r_p\cos(\phi + \gamma_i) \
y_{P_i} = y + r_p\sin(\phi + \gamma_i)
\end{cases}
$$
计算B_i点坐标:
$$
\begin{cases}
x_{B_i} = r_b\cos\alpha_i \
y_{B_i} = r_b\sin\alpha_i
\end{cases}
$$
驱动位移d_i即为B_i到P_i的距离减去支链长度l:
$$ d_i = \sqrt{(x_{P_i}-x_{B_i})^2 + (y_{P_i}-y_{B_i})^2} - l $$
matlab复制function [d1,d2,d3] = inverse_kinematics(x,y,phi)
% 几何参数
alpha = [0, 2*pi/3, 4*pi/3]; % 三条支链固定角度
gamma = [0, 2*pi/3, 4*pi/3]; % 动平台连接点角度
for i = 1:3
% 计算P_i坐标
Px = x + r_p*cos(phi + gamma(i));
Py = y + r_p*sin(phi + gamma(i));
% 计算B_i坐标
Bx = r_b*cos(alpha(i));
By = r_b*sin(alpha(i));
% 计算驱动位移
d(i) = sqrt((Px-Bx)^2 + (Py-By)^2) - l;
end
d1 = d(1); d2 = d(2); d3 = d(3);
end
将六足机器人的三角步态(tripod gait)映射到3PRR机构:
matlab复制% 步态参数
step_length = 0.1; % 单步步长(m)
step_height = 0.05; % 抬腿高度(m)
cycle_time = 2.0; % 步态周期(s)
dt = 0.01; % 控制周期(s)
% 生成步态轨迹
t = 0:dt:cycle_time;
n_steps = length(t);
为获得平滑的运动轨迹,采用三次贝塞尔曲线规划足端轨迹:
matlab复制function [x,y] = bezier_trajectory(t, P0, P1, P2, P3)
% 三次贝塞尔曲线
% t: 归一化时间[0,1]
% P0-P3: 控制点
x = (1-t)^3*P0(1) + 3*(1-t)^2*t*P1(1) + 3*(1-t)*t^2*P2(1) + t^3*P3(1);
y = (1-t)^3*P0(2) + 3*(1-t)^2*t*P1(2) + 3*(1-t)*t^2*P2(2) + t^3*P3(2);
end
matlab复制% 初始化轨迹存储
traj = zeros(n_steps, 6); % [x,y,phi,d1,d2,d3]
% 生成一个完整步态周期
for k = 1:n_steps
% 计算当前相位 (0-1)
phase = mod(t(k)/cycle_time, 1);
% 根据相位确定支撑腿和摆动腿
if phase < 0.5
% 第一组三角步态 (腿1,3,5支撑)
swing_leg = 2;
else
% 第二组三角步态 (腿2,4,6支撑)
swing_leg = 1;
end
% 计算机身目标位姿
target_x = step_length * phase;
target_y = 0;
target_phi = 0;
% 计算虚拟支链长度(摆动腿"缩短")
if swing_leg == 1
d1_virtual = d1 - step_height*sin(pi*phase);
d2_virtual = d2;
d3_virtual = d3 - step_height*sin(pi*phase);
else
d1_virtual = d1;
d2_virtual = d2 - step_height*sin(pi*(phase-0.5));
d3_virtual = d3;
end
% 存储轨迹
traj(k,:) = [target_x, target_y, target_phi, d1_virtual, d2_virtual, d3_virtual];
end
我们采用Matlab的Robotics System Toolbox进行仿真:
matlab复制% 创建仿真环境
figure;
ax = axes('XLim',[-1 1],'YLim',[-1 1],'ZLim',[0 0.5]);
view(ax, 0, 90); % 顶视图
grid on; hold on;
% 绘制静平台
draw_base_circle(r_b);
% 初始化动平台
h_platform = draw_moving_platform(r_p, [0,0,0]);
% 初始化支链
h_legs = zeros(3,1);
for i = 1:3
h_legs(i) = draw_leg([r_b*cosd(theta(i)), r_b*sind(theta(i)), 0],...
[0,0,0], l);
end
matlab复制% 控制循环
for k = 1:n_steps
% 获取当前目标
target = traj(k,:);
% 更新动平台位姿
T = makehgtform('translate',[target(1), target(2), 0],...
'zrotate', target(3));
set(h_platform,'Matrix',T);
% 更新支链显示
for i = 1:3
% 计算支链末端位置(动平台连接点)
P_i = [target(1)+r_p*cos(target(3)+theta(i)),...
target(2)+r_p*sin(target(3)+theta(i)),...
0];
% 计算支链起点位置(静平台连接点)
B_i = [r_b*cosd(theta(i)), r_b*sind(theta(i)), 0];
% 更新支链显示
update_leg(h_legs(i), B_i, P_i);
end
% 控制频率
pause(dt);
end
为更好地观察运动过程,添加以下可视化元素:
matlab复制% 添加轨迹记录
traj_plot = plot3(nan, nan, nan, 'r-', 'LineWidth', 1.5);
% 在循环中更新轨迹
set(traj_plot, 'XData', traj(1:k,1),...
'YData', traj(1:k,2),...
'ZData', zeros(k,1));
3PRR机构在工作空间中存在奇异位形,会导致控制失效。常见奇异情况:
解决方案:
matlab复制% 奇异位形检测
J = compute_jacobian(x,y,phi);
cond_number = cond(J);
if cond_number > 1e4
warning('接近奇异位形!条件数: %.2f', cond_number);
% 采取规避策略...
end
在步态切换瞬间,驱动速度可能出现不连续。解决方法:
matlab复制% 五次多项式轨迹过渡
function [q,qd,qdd] = quintic_traj(t, t0, tf, q0, qf, qd0, qdf)
% 计算多项式系数
A = [1 t0 t0^2 t0^3 t0^4 t0^5;
0 1 2*t0 3*t0^2 4*t0^3 5*t0^4;
0 0 2 6*t0 12*t0^2 20*t0^3;
1 tf tf^2 tf^3 tf^4 tf^5;
0 1 2*tf 3*tf^2 4*tf^3 5*tf^4;
0 0 2 6*tf 12*tf^2 20*tf^3];
b = [q0; qd0; 0; qf; qdf; 0];
x = A\b;
% 计算轨迹
q = x(1) + x(2)*t + x(3)*t^2 + x(4)*t^3 + x(5)*t^4 + x(6)*t^5;
qd = x(2) + 2*x(3)*t + 3*x(4)*t^2 + 4*x(5)*t^3 + 5*x(6)*t^4;
qdd = 2*x(3) + 6*x(4)*t + 12*x(5)*t^2 + 20*x(6)*t^3;
end
将3PRR模型输出映射到真实六足机器人时需注意:
解决方案:
matlab复制% 六足机器人腿部逆运动学
function [q1,q2,q3] = leg_ik(x,y,z)
% 腿部结构参数
L1 = 0.1; % 大腿长度
L2 = 0.15; % 小腿长度
% 平面距离
r = sqrt(x^2 + y^2);
% 第一关节(髋关节偏航)
q1 = atan2(y, x);
% 第二关节(髋关节俯仰)
D = (r^2 + z^2 - L1^2 - L2^2)/(2*L1*L2);
q3 = atan2(-sqrt(1-D^2), D);
% 第三关节(膝关节)
q2 = atan2(z, r) - atan2(L2*sin(q3), L1 + L2*cos(q3));
end
基于3PRR模型可以方便地实现:
matlab复制% 方向控制示例
function adjust_direction(target_angle)
% 当前方向
current_angle = atan2(traj(end,2), traj(end,1));
% 角度差
delta_angle = target_angle - current_angle;
% 调整步态参数
if abs(delta_angle) > pi/18 % 10度
% 采用弧线步态
curve_radius = step_length / delta_angle;
% 更新轨迹生成参数...
end
end
通过3PRR模型的虚拟支链长度变化反映地形高度:
matlab复制% 地形适应示例
function adapt_to_terrain(terrain_height)
% 计算三条支链对应的地形高度
h1 = get_terrain_height(leg1_position);
h2 = get_terrain_height(leg2_position);
h3 = get_terrain_height(leg3_position);
% 调整虚拟支链长度
d1 = d1_nominal - h1;
d2 = d2_nominal - h2;
d3 = d3_nominal - h3;
% 重新计算逆运动学...
end
类似的建模方法可以应用于:
注意:不同构型需要重新推导运动学方程,但基本控制框架可以复用。