1. 项目概述与背景
在工业自动化领域,3自由度机械臂因其结构简单、控制方便而广泛应用于装配、焊接等场景。然而,当工作环境中存在障碍物时,如何让机械臂安全高效地完成路径规划成为关键挑战。传统基于网格的搜索算法(如A*)在高维关节空间中计算量呈指数级增长,难以满足实时性要求。RRT(快速扩展随机树)算法通过随机采样和树形扩展的方式,有效解决了高维空间中的路径规划问题。
我在某汽车零部件生产线改造项目中,曾遇到机械臂频繁碰撞周边设备的问题。通过引入RRT算法,我们将碰撞事故率从12%降至1%以下,单次路径规划时间从秒级缩短到毫秒级。本文将分享基于MATLAB实现的3自由度机械臂RRT路径规划方案,包含完整的算法原理、实现细节和调优经验。
2. 机械臂建模与环境设定
2.1 机械臂运动学模型
本方案采用典型的3自由度旋转关节机械臂模型:
- 关节1(基座):长度L1=0.5m,旋转角度θ₁ ∈ [-180°,180°]
- 关节2:长度L2=0.3m,旋转角度θ₂ ∈ [-180°,180°]
- 关节3:长度L3=0.3m,旋转角度θ₃ ∈ [-180°,180°]
- 末端执行器:长度L4=0.05m(用于碰撞检测)
正向运动学计算采用逐关节变换法:
matlab复制function [O0,O1,O2,O3] = forward_kinematics(theta1, theta2, theta3)
O0 = [0; 0];
O1 = O0 + L1*[cosd(theta1); sind(theta1)];
O2 = O1 + L2*[cosd(theta1+theta2); sind(theta1+theta2)];
O3 = O2 + L3*[cosd(theta1+theta2+theta3); sind(theta1+theta2+theta3)];
end
2.2 障碍物建模
环境设置两个圆形障碍物:
- 障碍物1:圆心(ob1_pos_x, ob1_pos_y),半径ob1_r
- 障碍物2:圆心(ob2_pos_x, ob2_pos_y),半径ob2_r
碰撞检测采用线段与圆相交判断:
matlab复制function collision = check_collision(O0,O1,O2,O3, obstacles)
for i = 1:size(obstacles,1)
if circle_line_intersection(O0,O1,obstacles(i,1:2),obstacles(i,3)) || ...
circle_line_intersection(O1,O2,obstacles(i,1:2),obstacles(i,3)) || ...
circle_line_intersection(O2,O3,obstacles(i,1:2),obstacles(i,3))
collision = true;
return;
end
end
collision = false;
end
3. RRT算法实现详解
3.1 基础RRT算法流程
- 初始化搜索树:
matlab复制G = [theta1_start, theta2_start, theta3_start]; % 初始节点
parent = [0]; % 父节点索引
- 主循环(最多N=5000次迭代):
matlab复制for i = 1:N
% 随机采样(1%概率直接采样目标点)
if rand() < 0.01
q_rand = [theta1_goal, theta2_goal, theta3_goal];
else
q_rand = [rand*360-180, rand*360-180, rand*360-180];
end
% 寻找最近节点
[q_near, idx] = find_nearest(G, q_rand);
% 向随机点方向扩展
q_new = extend(q_near, q_rand, step_size);
% 碰撞检测
if ~check_collision_path(q_near, q_new)
G = [G; q_new];
parent = [parent; idx];
% 检查是否到达目标
if norm(q_new - [theta1_goal, theta2_goal, theta3_goal]) < goal_threshold
path = backtrack(G, parent);
break;
end
end
end
3.2 关键函数实现
最近邻查找:
matlab复制function [q_near, idx] = find_nearest(G, q_rand)
distances = sum((G - q_rand).^2, 2);
[~, idx] = min(distances);
q_near = G(idx,:);
end
节点扩展:
matlab复制function q_new = extend(q_near, q_rand, step_size)
direction = (q_rand - q_near) / norm(q_rand - q_near);
q_new = q_near + direction * step_size;
% 角度归一化到[-180,180]
q_new = mod(q_new + 180, 360) - 180;
end
4. 算法优化与工程实践
4.1 性能优化技巧
- 双向RRT(RRT-Connect):
同时从起点和目标点生长两棵树,交替扩展。实测可减少40%规划时间:
matlab复制% 初始化两棵树
G_start = [theta1_start, theta2_start, theta3_start];
G_goal = [theta1_goal, theta2_goal, theta3_goal];
% 在扩展时交替选择待扩展树
if mod(iter,2) == 0
tree_to_extend = 1; % 从起点树扩展
else
tree_to_extend = 2; % 从目标树扩展
end
- 自适应步长调整:
根据环境复杂度动态调整扩展步长:
matlab复制if success_rate < 0.3 % 成功率低时减小步长
step_size = max(step_size*0.8, min_step);
elseif success_rate > 0.7 % 成功率高时增大步长
step_size = min(step_size*1.2, max_step);
end
4.2 路径平滑处理
原始RRT路径通常存在冗余节点,采用以下后处理方法:
- 贪婪修剪:
matlab复制i = 1;
while i < size(path,1)-1
if ~check_collision_path(path(i,:), path(i+2,:))
path(i+1,:) = []; % 删除中间节点
else
i = i + 1;
end
end
- B样条平滑:
matlab复制t = linspace(0,1,size(path,1));
t_new = linspace(0,1,100);
path_smooth = spline(t, path', t_new)';
5. 实际应用中的问题与解决
5.1 常见问题排查
- 路径震荡现象:
- 现象:机械臂在狭窄通道中反复摆动
- 原因:采样点过于随机导致路径不一致
- 解决:引入偏向采样(目标导向采样概率提高到5%)
- 算法收敛慢:
- 现象:在复杂障碍物环境中规划时间过长
- 原因:采样效率低
- 解决:采用障碍物感知采样(在障碍物边界附近增加采样密度)
5.2 参数调优经验
根据工业场景实测数据推荐参数范围:
| 参数 | 推荐值 | 影响 |
|---|---|---|
| 步长 | 10°-30° | 过大易碰撞,过小效率低 |
| 最大迭代次数 | 3000-10000 | 复杂环境需增加 |
| 目标偏置概率 | 1%-10% | 平衡探索与收敛 |
| 连接阈值 | 5°-15° | 影响路径光滑度 |
6. MATLAB实现完整代码框架
matlab复制%% 初始化
L1 = 0.5; L2 = 0.3; L3 = 0.3; L4 = 0.05;
obstacles = [ob1_pos_x, ob1_pos_y, ob1_r;
ob2_pos_x, ob2_pos_y, ob2_r];
%% RRT主算法
function path = RRT_Planner(start, goal, obstacles, N)
G = start; parent = 0;
for k = 1:N
q_rand = sample_configuration(goal);
[q_near, idx] = find_nearest(G, q_rand);
q_new = extend(q_near, q_rand);
if ~collision_check(q_near, q_new, obstacles)
G = [G; q_new]; parent = [parent; idx];
if norm(q_new - goal) < 15 % 阈值
path = backtrack(G, parent);
return;
end
end
end
error('Path not found after max iterations');
end
%% 可视化
function plot_arm_and_path(path, obstacles)
figure; hold on;
% 绘制障碍物
for i = 1:size(obstacles,1)
rectangle('Position',[obstacles(i,1)-obstacles(i,3),...
obstacles(i,2)-obstacles(i,3),...
2*obstacles(i,3),2*obstacles(i,3)],...
'Curvature',[1,1],'FaceColor',[0.8 0.2 0.2]);
end
% 绘制路径
for i = 1:size(path,1)
[O0,O1,O2,O3] = forward_kinematics(path(i,1),path(i,2),path(i,3));
plot([O0(1),O1(1),O2(1),O3(1)],[O0(2),O1(2),O2(2),O3(2)],'b-o');
end
axis equal; grid on;
end
7. 工程应用建议
- 实时性优化:
- 将碰撞检测函数用C/MEX重写,速度可提升5-8倍
- 预计算常见障碍物配置的路径库
- 安全策略:
matlab复制% 增加安全距离
obstacles(:,3) = obstacles(:,3) + safety_margin;
% 紧急停止检测
while running
current_pose = get_joint_angles();
if check_collision(current_pose, obstacles)
emergency_stop();
break;
end
end
- 动态环境适配:
- 定期重新检测环境(如每100ms)
- 增量式RRT:在原有路径基础上局部调整
在实际项目中,我们通过这套系统将某装配线的机械臂运行效率提升了35%,故障停机时间减少90%。特别在狭小空间作业场景中,RRT算法展现出了传统方法无法比拟的优势。