Main Content

plannerRRTStar

최적 RRT 경로 플래너(RRT*) 생성

설명

plannerRRTStar 객체는 점근적 최적 RRT 플래너인 RRT*를 생성합니다. RRT* 알고리즘은 상태공간 거리 측면에서 최적해로 수렴합니다. 또한 그 실행 시간은 RRT 알고리즘 실행 시간의 상수 배입니다. RRT*는 기하 계획 문제를 풀기 위해 사용됩니다. 기하 계획 문제에서는 상태공간에서 가져온 두 개의 무작위 상태가 연결될 수 있어야 합니다.

생성

설명

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

planner = plannerRRTStar(___,Name=Value)는 위에 열거된 구문의 입력 인수 외에 하나 이상의 이름-값 인수를 사용하여 속성을 설정합니다. StateSampler, BallRadiusConstant, ContinueAfterGoalReached, 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 객체로 지정됩니다. 기본적으로 plannerRRTStar 객체는 상태에 균일 샘플링을 사용합니다.

근접 이웃 탐색 반경을 추정하는 데 사용되는 상수로, 양의 스칼라로 지정됩니다. 반경은 다음과 같이 추정됩니다.

r=min(γ(log(n)n)1d,η)

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

  • γBallRadiusConstant 속성의 값

  • n — 트리에서의 현재 노드 개수

  • d — 상태공간의 차원

  • ηMaxConnectionDistance 속성의 값

γ는 다음과 같이 정의됩니다.

γ=2d(1+1d)(VFreeVBall)

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

  • VFree — 탐색 공간 내 대략의 자유 부피(free volume)

  • VBalld 차원의 단위 볼의 부피

위의 식은 주어진 공간에 대해 "적절한" 크기의 BallRadiusConstant를 정의합니다. 이는 공간을 채우는 노드 개수가 늘어나고 반경이 줄어들수록 예상 이웃 개수가 로그적으로 늘어남을 의미합니다. 값이 클수록 매 반복당 d차원 볼 내의 평균 이웃 개수가 늘어나고 재연결할 후보가 많아집니다. 그러나 값이 제안된 최솟값보다 작으면 단일 근접 이웃이 구해질 수 있으며 점근적으로 최적의 결과를 도출하지 못합니다.

예: BallRadiusConstant=80

데이터형: single | double

목표에 도달한 후 플래너가 최적화를 계속할지 여부로, false 또는 true로 지정됩니다. 또한 플래너는 최대 반복 횟수 또는 최대 트리 노드 개수에 도달하면 이 속성값과 관계없이 종료됩니다.

예: ContinueAfterGoalReached=true

데이터형: logical

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

예: MaxNumTreeNodes=2500

데이터형: single | double

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

예: MaxIterations=2500

데이터형: single | double

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

예: MaxConnectionDistance=0.3

데이터형: single | double

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

 function isReached = myGoalReachedFcn(planner,currentState,goalState)

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

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

  • 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.mat
map = occupancyMap(simpleMap,10);
sv.Map = map;

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

sv.ValidationDistance = 0.01;

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

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

RRT* 경로 플래너를 생성하고 목표에 도달한 후 추가 최적화를 허용합니다. 최대 반복 횟수를 줄이고 최대 연결 거리를 늘립니다.

planner = plannerRRTStar(ss,sv, ...
          ContinueAfterGoalReached=true, ...
          MaxIterations=2500, ...
          MaxConnectionDistance=0.3);

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

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

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

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

결과를 시각화합니다.

map.show
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 = plannerRRTStar(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] Karaman, S. and E. Frazzoli. "Sampling-Based Algorithms for Optimal Motion Planning." The International Journal of Robotics Research. Vol. 30, Number 7, 2011, pp 846 – 894.

확장 기능

버전 내역

R2019b에 개발됨

모두 확장