Main Content

plannerRRT

기하 계획을 위한 RRT 플래너 생성

설명

plannerRRT 객체는 기하 계획 문제를 풀기 위해 RRT(Rapidly-exploring Random Tree) 플래너를 생성합니다. RRT는 주어진 상태공간에서 무작위로 추출한 샘플로부터 점진적으로 탐색 트리를 구축하는 트리 기반 모션 플래너입니다. 트리는 최종적으로 탐색 공간을 포괄하며 시작 상태를 목표 상태에 연결합니다. 일반적인 트리 확장 절차는 다음과 같습니다.

  1. 플래너가 상태공간에서 무작위 상태 xrand를 샘플링합니다.

  2. 플래너가 이미 탐색 트리에 있으며 xrand에 가장 가까운(상태공간의 거리 정의에 따라) 상태 xnear를 찾습니다.

  3. 플래너가 상태 xnew에 도달할 때까지 xnear에서 xrand로 확장합니다.

  4. 그런 다음 새 상태 xnew가 탐색 트리에 추가됩니다.

기하 RRT의 경우 planner 객체의 상태공간에 지정된 제약 조건을 위반하지 않고 두 상태 간의 확장과 연결을 해석적으로 찾을 수 있습니다.

생성

설명

planner = plannerRRT(stateSpace,stateVal)은 state space 객체 stateSpace와 state validator 객체 stateVal에서 RRT 플래너를 생성합니다. stateVal의 상태공간은 stateSpace와 동일해야 합니다. stateSpacestateValplannerStateSpace 속성과 StateValidator 속성도 설정합니다.

planner = plannerRRT(___,Name=Value)는 이전 구문의 입력 인수 외에 하나 이상의 이름-값 인수를 사용하여 속성을 설정합니다. StateSampler, MaxNumTreeNodes, MaxIterations, MaxConnectionDistance, GoalReachedFcn, GoalBias 속성을 이름-값 인수로 지정할 수 있습니다.

예제

속성

모두 확장

플래너를 위한 상태공간으로, state space 객체로 지정됩니다. stateSpaceSE2, stateSpaceDubins, stateSpaceReedsShepp, stateSpaceSE3과 같은 state space 객체를 사용할 수 있습니다. 또한 nav.StateSpace 객체를 사용하여 state space 객체를 사용자 지정할 수 있습니다.

플래너를 위한 상태 유효성 검사기로, state validator 객체로 지정됩니다. validatorOccupancyMap, validatorVehicleCostmap, validatorOccupancyMap3D와 같은 state validator 객체를 사용할 수 있습니다.

R2023b 이후

입력 공간에서 상태 샘플을 찾는 데 사용되는 상태공간 샘플러로, stateSamplerUniform, stateSamplerGaussian, stateSamplerMPNET 또는 nav.StateSampler 객체로 지정됩니다. 기본적으로 plannerRRT 객체는 상태에 균일 샘플링을 사용합니다.

탐색 트리의 최대 노드 개수(루트 노드 제외)로, 양의 정수로 지정됩니다.

예: MaxNumTreeNodes=2500

데이터형: single | double

최대 반복 횟수로, 양의 정수로 지정됩니다.

예: MaxIterations=2500

데이터형: single | double

트리에서 허용되는 모션의 최대 길이로, 스칼라로 지정됩니다.

예: MaxConnectionDistance=0.3

데이터형: single | double

목표 도달 여부를 평가하는 콜백 함수로, 함수 핸들로 지정됩니다. 자체 목표 도달 함수를 만들 수 있습니다. 함수는 다음 구문을 따라야 합니다.

 function isReached = myGoalReachedFcn(planner,currentState,goalState)

각 요소는 다음과 같습니다.

  • planner — 생성된 planner 객체로, plannerRRT 객체로 지정됩니다.

  • currentState — 현재 상태로, 요소를 3개 가진 실수형 벡터로 지정됩니다.

  • goalState — 목표 상태로, 요소를 3개 가진 실수형 벡터로 지정됩니다.

  • isReached — 현재 상태가 목표 상태에 도달했는지 여부를 나타내는 부울 변수로, true 또는 false로 반환됩니다.

코드 생성 워크플로에서 사용자 지정 GoalReachedFcn을 사용하려면 plan 함수를 호출하기 전에 이 속성을 사용자 지정 함수 핸들로 설정해야 하며 초기화 후에는 변경할 수 없습니다.

데이터형: function handle

상태 샘플링 중 목표 상태를 선택할 확률로, 범위 [0,1] 내에 있는 실수형 스칼라로 지정됩니다. 이 속성은 상태공간에서 상태를 무작위로 선택하는 과정에서 실제 목표 상태를 선택할 확률을 정의합니다. 확률을 0.05와 같은 작은 값으로 설정하여 시작할 수 있습니다.

예: GoalBias=0.1

데이터형: single | double

객체 함수

plan두 상태 간의 경로 계획
copyCreate copy of planner object

예제

모두 축소

상태공간을 생성합니다.

ss = stateSpaceSE2;

생성된 상태공간을 사용하여 occupancyMap 기반 상태 유효성 검사기를 생성합니다.

sv = validatorOccupancyMap(ss);

예제 맵에서 점유 맵을 만들고 맵 해상도를 10셀/미터로 설정합니다.

load exampleMaps
map = occupancyMap(simpleMap,10);
sv.Map = map;

유효성 검사기의 유효성 검사 거리를 설정합니다.

sv.ValidationDistance = 0.01;

상태공간 경계가 맵 제한과 동일하도록 업데이트합니다.

ss.StateBounds = [map.XWorldLimits;map.YWorldLimits;[-pi pi]];

경로 플래너를 생성하고 최대 연결 거리를 늘립니다.

planner = plannerRRT(ss,sv,MaxConnectionDistance=0.3);

출발 상태와 목표 상태를 설정합니다.

start = [0.5 0.5 0];
goal = [2.5 0.2 0];

디폴트 설정으로 경로를 계획합니다.

rng(100,'twister'); % for repeatable result
[pthObj,solnInfo] = plan(planner,start,goal);

결과를 시각화합니다.

show(map)
hold on
% Tree expansion
plot(solnInfo.TreeData(:,1),solnInfo.TreeData(:,2),'.-')
% Draw path
plot(pthObj.States(:,1),pthObj.States(:,2),'r-','LineWidth',2)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 3 objects of type image, line.

도시 블록의 3D 점유 맵을 작업 공간으로 불러옵니다. 장애물이 없는 셀로 간주할 임계값을 지정합니다.

mapData = load("dMapCityBlock.mat");
omap = mapData.omap;
omap.FreeThreshold = 0.5;

장애물 주변에서 안전하게 작동할 수 있도록 점유 맵을 확장하여 완충 지대를 추가합니다.

inflate(omap,1)

상태 변수의 범위가 지정된 SE(3) state space 객체를 생성합니다.

ss = stateSpaceSE3([0 220;0 220;0 100;inf inf;inf inf;inf inf;inf inf]);

생성된 상태공간을 사용하여 3차원 점유 맵 상태 유효성 검사기를 생성합니다. 점유 맵을 state validator 객체에 할당합니다. 샘플링 거리 간격을 지정합니다.

sv = validatorOccupancyMap3D(ss, ...
     Map = omap, ...
     ValidationDistance = 0.1);

최대 연결 거리를 늘리고 최대 반복 횟수를 줄인 RRT 경로 플래너를 생성합니다. 목표까지의 유클리드 거리가 임계값 1미터 미만인 경우에 경로가 목표에 도달했다고 결정하는 사용자 지정 목표 함수를 지정합니다.

planner = plannerRRT(ss,sv, ...
          MaxConnectionDistance = 50, ...
          MaxIterations = 1000, ...
          GoalReachedFcn = @(~,s,g)(norm(s(1:3)-g(1:3))<1), ...
          GoalBias = 0.1);

출발 자세와 목표 자세를 지정합니다.

start = [40 180 25 0.7 0.2 0 0.1];
goal = [150 33 35 0.3 0 0.1 0.6];

반복 가능한 결과를 위해 난수 생성기를 구성합니다.

rng(1,"twister");

경로를 계획합니다.

[pthObj,solnInfo] = plan(planner,start,goal);

계획된 경로를 시각화합니다.

show(omap)
axis equal
view([-10 55])
hold on
% Start state
scatter3(start(1,1),start(1,2),start(1,3),"g","filled")
% Goal state
scatter3(goal(1,1),goal(1,2),goal(1,3),"r","filled")
% Path
plot3(pthObj.States(:,1),pthObj.States(:,2),pthObj.States(:,3), ...
      "r-",LineWidth=2)

Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, scatter, line.

참고 문헌

[1] S.M. Lavalle and J.J. Kuffner. "Randomized Kinodynamic Planning." The International Journal of Robotics Research. Vol. 20, Number 5, 2001, pp. 378 – 400.

확장 기능

버전 내역

R2019b에 개발됨

모두 확장