bi-rrt算法三维MATLAB代码 双向rrt算法的三维路径规划 加入路径的平滑处理

直接打开MATLAB开整三维空间路径规划。双向RRT(Bi-RRT)这玩意儿比传统RRT快不是一点半点,核心思路就是两头长树往中间怼。咱们先看节点数据结构怎么设计:

classdef Node
    properties
        pos     % [x,y,z]坐标
        parent  % 父节点指针
        children
    end
    methods
        function obj = Node(position)
            obj.pos = position;
        end
    end
end

三维空间的随机采样得注意均匀性。这里有个坑:别直接用均匀分布,加点球坐标变换更科学:

function rand_point = random_sample(map_bounds)
    theta = 2*pi*rand();
    phi = pi*rand();
    r = normrnd(0, 1);  % 高斯分布更易扩展
    rand_point = map_bounds(1) + (map_bounds(2)-map_bounds(1))*...
        [r*sin(phi)*cos(theta), r*sin(phi)*sin(theta), r*cos(phi)];
end

双向扩展的关键在于交替生长两棵树。每次迭代时先尝试从起始树扩展:

for iter = 1:max_iter
    % 交替扩展方向
    if mod(iter,2) == 0
        [tree_a, tree_b] = deal(tree_b, tree_a); % 交换两棵树
    end
    
    % 扩展树A
    rand_node = generate_target(tree_a); % 带目标偏向的采样
    nearest_node = find_nearest(tree_a, rand_node); 
    new_node = extend(nearest_node, rand_node, step_size);
    
    if ~collision_check(new_node.pos)
        % 尝试连接两棵树
        connector = try_connect(new_node, tree_b);
        if ~isempty(connector)
            % 提取路径
            path = extract_path(new_node, connector);
            return;
        end
    end
end

路径平滑处理别直接用直线,三次样条插值才是王道。但得注意避开障碍物:

function smooth_path = path_smoothing(raw_path)
    t = linspace(0,1,length(raw_path));
    new_t = linspace(0,1,3*length(raw_path));
    smooth_path = [spline(t,raw_path(1,:),new_t); 
                  spline(t,raw_path(2,:),new_t);
                  spline(t,raw_path(3,:),new_t)]';
                  
    % 后处理碰撞检测
    for i = 1:size(smooth_path,1)-1
        if collision_check(smooth_path(i:i+1,:))
            % 回退到原始路径点
            smooth_path = [smooth_path(1:i,:); raw_path]; 
            break;
        end
    end
end

实际运行时注意调节步长参数——太小了收敛慢,太大了容易撞墙。个人经验是设置成环境对角线长度的2%-5%比较合适。可视化部分建议用animatedline做动态生长演示,比一帧帧plot流畅得多。

bi-rrt算法三维MATLAB代码 双向rrt算法的三维路径规划 加入路径的平滑处理

遇到死循环别慌,加个随机重启机制:当超过50次迭代没进展时,直接重置目标偏向参数。实测这招能让计算时间减少三分之一左右。

最后提醒下,MATLAB的面向对象在大量节点时可能变慢,超过5000节点建议转成结构体数组。不过一般三维路径规划在3000次迭代内都能找到解,日常用足够了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐