rrt路径规划结合机械臂仿真 基于matlab,6自由度,机械臂+rrt算法路径规划,输出如下效果运行即可得到下图。 障碍物,起始点坐标均可修改,亦可自行二次改进程序。

最近在搞机械臂路径规划,发现RRT算法和机械臂仿真真是绝配。今天就拿MATLAB做个6自由度机械臂避障演示,咱们直接上干货,手把手教你怎么用随机树在复杂环境里给机械臂找路。

rrt路径规划结合机械臂仿真 基于matlab,6自由度,机械臂+rrt算法路径规划,输出如下效果运行即可得到下图。 障碍物,起始点坐标均可修改,亦可自行二次改进程序。

先看效果:在布满障碍物的空间里,机械臂从初始姿态扭动着避开所有障碍物到达目标点。整个过程像极了科幻片里的机械臂自主运动,关键代码不到200行,自己改参数就能玩出不同花样。

先搞个机械臂模型(这里用D-H参数法建模):

L1 = Link('d', 0.3, 'a', 0, 'alpha', pi/2);
L2 = Link('d', 0, 'a', 0.5, 'alpha', 0);
L3 = Link('d', 0, 'a', 0.4, 'alpha', 0);
L4 = Link('d', 0, 'a', 0, 'alpha', pi/2);
L5 = Link('d', 0.2, 'a', 0, 'alpha', -pi/2);
L6 = Link('d', 0.1, 'a', 0, 'alpha', 0);
arm = SerialLink([L1 L2 L3 L4 L5 L6], 'name', '6DOF');

重点来了——RRT核心算法。咱们把关节空间离散化,每次随机撒点然后找最近节点扩展:

function path = RRT_plan(start, goal, obstacles)
    max_nodes = 1000;
    step_size = 0.2;
    tree(1) = struct('q', start, 'parent', 0);
    
    for k = 1:max_nodes
        q_rand = (rand(1,6)-0.5)*2*pi;  % 6自由度随机采样
        [q_near, idx] = find_nearest(q_rand, tree);
        q_new = steer(q_near, q_rand, step_size);
        
        if ~collision_check(q_new, obstacles)
            tree(end+1) = struct('q', q_new, 'parent', idx);
            if norm(q_new - goal) < 0.5
                path = extract_path(tree, length(tree));
                return;
            end
        end
    end
    error('Path not found!');
end

这里有个灵魂函数必须重点说——碰撞检测。咱们用圆柱体近似机械臂连杆,检测每个关节段的干涉:

function collide = collision_check(q, obstacles)
    arm.plot(q, 'noname');  % 获取各连杆位置
    link_pos = get(arm.handle, 'UserData'); 
    
    for i = 1:length(obstacles)
        obs = obstacles{i};
        for j = 1:5  % 检测每个连杆
            % 圆柱体与球体碰撞检测
            if cylinder_sphere_collision(link_pos{j}, obs)
                collide = true;
                return;
            end
        end
    end
    collide = false;
end

运行主程序时记得设置障碍物参数,比如这样创建球形障碍:

obstacles = {
    struct('type','sphere','center',[0.4 0.2 0.3],'radius',0.15),
    struct('type','sphere','center',[-0.3 0.4 0.5],'radius',0.2)
};

实际跑起来会发现RRT生成的路径可能比较"抽搐",这时候可以加个路径平滑处理:

function smooth_path = path_smoothing(raw_path, obstacles)
    smooth_path = raw_path(1,:);
    i = 1;
    while i < size(raw_path,1)
        for j = size(raw_path,1):-1:i+1
            if direct_connect(raw_path(i,:), raw_path(j,:), obstacles)
                smooth_path = [smooth_path; raw_path(j,:)];
                i = j;
                break;
            end
        end
    end
end

最后来个骚操作——让机械臂按规划路径动起来:

arm.plot(path,'trail','r','movie','rrt.gif');

实测中发现几个调参技巧:

  1. 关节角步长控制在0.2~0.3rad最佳
  2. 目标偏向参数设为0.3能加快收敛
  3. 球形障碍物半径建议大于实际尺寸10%作为安全距离

这个demo虽然基础,但已经包含机械臂路径规划的核心要素。想要更丝滑的运动可以尝试RRT*优化,或者把碰撞检测换成GPU加速计算。完整代码可以到我的GitHub仓库下载,记得点个star支持一下~

Logo

更多推荐