Стаття
Робототехніка · Алгоритми · ⏱ ≈ 13 хв читання · Останнє оновлення: 23 червня 2026 р.

RRT — швидкозростаючі випадкові дерева для планування шляху робота

Алгоритми планування руху на основі вибірки, такі як RRT (LaValle, 1998) та його оптимальний варіант RRT* (Karaman & Frazzoli, 2011), здійснили революцію в плануванні руху роботів, обійшовши складність явного представлення перешкод у просторі конфігурацій. Замість побудови повної дорожньої карти вони поступово вирощують дерево допустимих конфігурацій за допомогою випадкової вибірки — імовірнісно повне і, у випадку RRT*, асимптотично оптимальне. Сьогодні вони є стандартом для роботизованих маніпуляторів, автономних транспортних засобів та планування руху квадрокоптерів.

1. Простір конфігурацій

Конфігурація робота q — це повний опис його стану (кути в суглобах, 6D-поза тощо). Простір конфігурацій C — це множина всіх можливих конфігурацій. C_free ⊂ C виключає конфігурації, що стикаються з перешкодами.

Приклад: дволанковий маніпулятор у 2D q = (θ₁, θ₂) ∈ [0,2π]² (2D-простір конфігурацій) C_free = усі (θ₁,θ₂), де ланки маніпулятора не перетинаються з перешкодами Точковий робот у 2D: q = (x, y) ∈ ℝ² C_obs = сума Мінковського форми робота з перешкодами → стискаємо робота до точки, розширюємо перешкоди Задача планування руху: знайти неперервний шлях γ: [0,1] → C_free такий, що γ(0) = q_start, γ(1) = q_goal

2. Алгоритм RRT

RRT(q_start, q_goal, C, max_iter): T ← дерево з коренем q_start FOR i = 1 … max_iter: 1. q_rand ← SAMPLE(C_free) (рівномірно випадково у вільному просторі) 2. q_near ← NEAREST(T, q_rand) (найближчий вузол дерева за метрикою d) 3. q_new ← STEER(q_near, q_rand, Δq) (рух від q_near до q_rand на крок Δq) 4. IF COLLISION_FREE(q_near → q_new): T.ADD_VERTEX(q_new) T.ADD_EDGE(q_near, q_new) IF d(q_new, q_goal) < ε_goal: RETURN path(q_start → q_new) RETURN FAILURE Ключові властивості: Імовірнісно повний: P(знайти шлях) → 1 при iter → ∞ НЕ оптимальний: якість шляху залежить від розміру кроку Δq та вибірки Складність: O(n log n) з kd-деревом для NEAREST

3. Зміщення до цілі та варіант Connect

Зміщення до цілі: з імовірністю p_goal безпосередньо вибираємо q_rand = q_goal Типове p_goal = 0.05–0.10 Ефект: створює пряме «притягання» до області цілі, суттєво скорочуючи кількість ітерацій до збіжності у відкритих просторах. Надто велике зміщення → погане дослідження вузьких проходів. RRT-Connect (Kuffner і LaValle, 2000): вирощуємо ДВА дерева: T_start (з q_start) та T_goal (з q_goal) Кожна ітерація: розширюємо T_start у напрямку q_rand, потім розширюємо T_goal у напрямку останнього вузла T_start. З'єднуємо, коли відстань < ε. Перевага: заповнює простір ефективніше, ~у 5–10 разів швидше за RRT у типових середовищах.

4. RRT* — асимптотична оптимальність

RRT* доповнює побудову дерева двома додатковими кроками: CHOOSE_PARENT (перепідключення до найкращого батька): X_near ← усі вузли в межах кулі B(q_new, r) r = γ · (log(|T|) / |T|)^(1/d) (радіус, що зменшується) Обираємо x_min = argmin_{x ∈ X_near} [cost(x) + d(x, q_new)], де перевірка зіткнень уздовж (x_min → q_new) проходить REWIRE (покращення сусідів через q_new): FOR each x_near ∈ X_near: IF cost(q_new) + d(q_new, x_near) < cost(x_near): AND collision_free(q_new → x_near): перепідключаємо x_near до q_new Збіжність: cost(path_RRT*) → cost_optimal при n → ∞ RRT (без перепідключення): назавжди застрягає на субоптимальному шляху RRT*: монотонно покращує вартість зі зростанням кількості ітерацій

5. Інформований RRT*

Щойно знайдено допустимий шлях вартості c_best, обмежуємо вибірку евристично релевантною областю — витягнутим гіперсфероїдом, що містить усі конфігурації, здатні покращити поточне рішення: Осі еліпсоїда: a (велика) = c_best / 2 b (мала) = √(c_best² − d(q_start, q_goal)²) / 2 Центр = середина між q_start і q_goal Будь-яка точка поза цим еліпсоїдом не може лежати на коротшому шляху. → Спрямована вибірка різко зосереджує пошук на оптимальному шляху. Перевага для збіжності: RRT*: вибирає весь C_free рівномірно → повільне покращення вартості Інформований RRT*: коли c_best → c_optimal, еліпсоїд стискається до лінії → дуже швидкі останні 20% оптимізації

6. Двонаправлений RRT

RRT-Connect

Два дерева вирощуються одночасно зі старту й цілі. Кожна ітерація розширює одне дерево у напрямку останнього вузла іншого (жадібний CONNECT). Найшвидша збіжність для голономних роботів.

BiRRT*

Двонаправлений + перепідключення. З'єднує проміжок між двома деревами через «вузол з'єднання», після чого застосовує перепідключення RRT* до обох. Асимптотично оптимальний.

LBTRRT

Lower-Bound Tree RRT підтримує дерево нижньої межі поряд із деревом RRT. Надає рішення в будь-який момент із гарантованим коефіцієнтом апроксимації ε до оптимальної довжини шляху.

LQRRRT

Розширює RRT на кінодинамічні системи, використовуючи локальне керування, згенероване LQR. Враховує диференціальні обмеження (динаміка моноколеса, автомобіля, дрона), яких просте кермування сегментами не охоплює.

7. Реалізація на JavaScript

// RRT для точкового робота у 2D з круговими перешкодами
class RRT {
  constructor(start, goal, obstacles, bounds, {stepSize=20, goalBias=0.1, maxIter=5000}={}) {
    this.goal = goal; this.obstacles = obstacles; this.bounds = bounds;
    this.stepSize = stepSize; this.goalBias = goalBias; this.maxIter = maxIter;
    this.nodes = [start];         // {x, y, parentIdx}
    start.parentIdx = -1;
  }

  sample() {
    if (Math.random() < this.goalBias) return {...this.goal};
    return {
      x: this.bounds.minX + Math.random() * (this.bounds.maxX - this.bounds.minX),
      y: this.bounds.minY + Math.random() * (this.bounds.maxY - this.bounds.minY)
    };
  }

  nearest(q) {
    let best = 0, bestD = Infinity;
    for (let i = 0; i < this.nodes.length; i++) {
      const d = dist(this.nodes[i], q);
      if (d < bestD) { bestD = d; best = i; }
    }
    return best;
  }

  steer(from, to) {
    const d = dist(from, to);
    if (d <= this.stepSize) return {...to};
    const t = this.stepSize / d;
    return {x: from.x + t*(to.x-from.x), y: from.y + t*(to.y-from.y)};
  }

  collisionFree(a, b) {
    // Вибираємо точки вздовж сегмента, перевіряємо кожну на перешкоди
    const steps = Math.ceil(dist(a, b) / 5);
    for (let i = 0; i <= steps; i++) {
      const t = i / steps;
      const px = a.x + t*(b.x-a.x), py = a.y + t*(b.y-a.y);
      if (this.obstacles.some(o => dist({x:px,y:py}, o) <= o.r)) return false;
    }
    return true;
  }

  build() {
    for (let i = 0; i < this.maxIter; i++) {
      const q_rand = this.sample();
      const nearIdx = this.nearest(q_rand);
      const q_new = this.steer(this.nodes[nearIdx], q_rand);
      if (!this.collisionFree(this.nodes[nearIdx], q_new)) continue;
      q_new.parentIdx = nearIdx;
      this.nodes.push(q_new);
      if (dist(q_new, this.goal) < this.stepSize && this.collisionFree(q_new, this.goal))
        return this.extractPath(this.nodes.length - 1);
    }
    return null; // не знайдено
  }

  extractPath(idx) {
    const path = [];
    while (idx !== -1) { path.unshift(this.nodes[idx]); idx = this.nodes[idx].parentIdx; }
    path.push(this.goal);
    return path;
  }
}

function dist(a, b) { return Math.hypot(a.x-b.x, a.y-b.y); }

// Використання:
const rrt = new RRT(
  {x:50, y:50},  {x:750, y:550},
  [{x:300, y:200, r:80}, {x:500, y:400, r: 100}],
  {minX:0, maxX:800, minY:0, maxY:600}
);
const path = rrt.build();
if (path) console.log(`Знайдено шлях: ${path.length} проміжних точок`);

8. Варіанти та застосування

Промислові маніпулятори

RRT у просторі кутів суглобів планує безконфліктні траєкторії для маніпуляторів із 6 ступенями свободи. Простір конфігурацій 6D, перешкоди — складні заметені об'єми. MoveIt! використовує OMPL (Open Motion Planning Library).

Автономні транспортні засоби

Кінодинамічний RRT з кінематикою автомобіля (велосипедна модель) планує допустимі шляхи. Поєднується з модельно-прогнозним керуванням для відстеження. Поширений у відкритих стеках Apollo, Autoware.

Квадрокоптери

RRT* у SE(3) або 3D-просторі позицій з поліноміальним згладжуванням траєкторії. Поєднується з оптимізацією траєкторії (CHOMP, TrajOpt) для задоволення обмежень динамічної допустимості.

Хірургічні роботи

Концентричні трубчасті роботи потребують планування в просторі конфігурацій у 6D-конфігураціях трубок із перевіркою зіткнень із анатомічними моделями, отриманими з КТ. Також використовуються імовірнісні дорожні карти.

🗺️ Відкрити пошук шляху →