โ† ๊ฐ•์˜ ๋ชฉ๋ก

Lecture 8. ์œ ๋„ & ์ œ์–ด ์žฅ๋ฒฝ ํ•จ์ˆ˜ (CBF)

"์–ด๋””๋กœ ๊ฐˆ์ง€" ๊ฒฐ์ •ํ•˜๋Š” ์œ ๋„(guidance)์™€ "์ ˆ๋Œ€ ๋ถ€๋”ชํžˆ์ง€ ์•Š๋Š”" ์•ˆ์ „ ํ•„ํ„ฐ.

๋ชฉ์ฐจ

  1. ์œ ๋„(Guidance)๋ž€?
  2. LOS ๊ฒฝ๋กœ ์ถ”์ข… + ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ
  3. ์ œ์–ด ์žฅ๋ฒฝ ํ•จ์ˆ˜(CBF) ์ด๋ก 
  4. CBF ์•ˆ์ „ ํ•„ํ„ฐ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ
  5. ์ฝ”๋“œ ยท ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ธฐ

1. ์œ ๋„๋ž€?

๊ฒฝ๋กœ ๊ณ„ํš(L6)์ด ํฐ ๊ทธ๋ฆผ์˜ ๊ธธ์„ ์ •ํ•œ๋‹ค๋ฉด, ์œ ๋„๋Š” ๋งค ์ˆœ๊ฐ„ "๋‹ค์Œ์œผ๋กœ ์–ด๋А ๋ฐฉํ–ฅ์„ ๋ด์•ผ ํ•˜๋‚˜?"๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ฐฉํ–ฅ์ด ์ •ํ•ด์ง€๋ฉด ์ œ์–ด๊ธฐ(L7)๊ฐ€ ์‹ค์ œ ๋ชจํ„ฐ์— ๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

2. LOS (Line-of-Sight) ๊ฒฝ๋กœ ์ถ”์ข…

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์œ ๋„๋ฒ•: ๊ฒฝ๋กœ์ƒ์—์„œ ์ผ์ • ๊ฑฐ๋ฆฌ ์•ž($L_a$)์— ๊ฐ€์ƒ ๋ชฉํ‘œ์ ์„ ๋‘๊ณ , ๊ทธ์ชฝ์„ ๋ฐ”๋ผ๋ณด๋„๋ก ์กฐํ–ฅํ•ฉ๋‹ˆ๋‹ค.

$$ \delta = \arctan\!\left(\frac{k\, e_\text{ct}}{L_a}\right) $$

$e_\text{ct}$๋Š” ๊ฒฝ๋กœ๋กœ๋ถ€ํ„ฐ์˜ ์ง๊ฐ ๊ฑฐ๋ฆฌ(cross-track error), $k$๋Š” ๊ฒŒ์ธ์ž…๋‹ˆ๋‹ค. ํ•ด์–‘ ์ž์œจ์ˆ˜์ƒ์„ (ASV)์—์„œ๋Š” enclosure-based LOS ๋ฐฉ์‹์ด ํ‘œ์ค€์ž…๋‹ˆ๋‹ค โ€” ๊ฒฝ๋กœ์™€ ์ผ์ • ๋ฐ˜๊ฒฝ ์›์˜ ๊ต์ ์„ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค(Fossen).

๐ŸŽฎ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ: LOS ๊ฒฝ๋กœ ์ถ”์ข… (์ง์„  ๊ฒฝ๋กœ)

์ง์„  ๊ฒฝ๋กœ(์ดˆ๋ก)๋ฅผ ํ–ฅํ•ด ์„ ๋ฐ•(ํŒŒ๋ž‘)์ด LOS๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ์ „๋ฐฉ ์ฃผ์‹œ๊ฑฐ๋ฆฌ $L_a$์™€ ๊ฒŒ์ธ์„ ๋ฐ”๊ฟ” ํšก์˜ค์ฐจ ์ˆ˜๋ ด ์†๋„๋ฅผ ๋น„๊ตํ•ด ๋ณด์„ธ์š”.

3. ์ œ์–ด ์žฅ๋ฒฝ ํ•จ์ˆ˜ (CBF)

ํ”ผ๋“œ๋ฐฑ ์ œ์–ด๊ธฐ(PID, Pure Pursuit)๋Š” "์–ผ๋งˆ๋‚˜ ์ž˜ ๋”ฐ๋ผ๊ฐ€๋А๋ƒ"๋ฅผ ๋‹ค๋ฃจ์ง€, "์ ˆ๋Œ€ ๋ถ€๋”ชํžˆ์ง€ ์•Š๋„๋ก"์€ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. CBF๋Š” ์ด ๊ฐ„๊ทน์„ ์ˆ˜ํ•™์  ์•ˆ์ „ ์ธ์ฆ์œผ๋กœ ๋ฉ”์›๋‹ˆ๋‹ค.

"์•ˆ์ „ํ•œ ์˜์—ญ"์„ ํ•จ์ˆ˜ $h(x) \ge 0$๋กœ ์ •์˜ํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์žฅ์• ๋ฌผ ์ค‘์‹ฌ $(x_o, y_o)$์—์„œ ๋ฐ˜๊ฒฝ $r$ ์•ˆ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ ค๋ฉด:

$$ h(x) = (x - x_o)^2 + (y - y_o)^2 - r^2 \ge 0 $$

๊ทธ๋ฆฌ๊ณ  ์ด ์•ˆ์ „ ์ง‘ํ•ฉ์ด "์•ž์œผ๋กœ๋„ ์นจ๋ฒ”๋˜์ง€ ์•Š๋„๋ก" ๋‹ค์Œ ์กฐ๊ฑด์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

$$ \dot{h}(x) + \gamma\, h(x) \ge 0 $$

์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ž…๋ ฅ $u$๋งŒ ํ—ˆ์šฉํ•˜๋ฉด, ์žฅ์• ๋ฌผ์— ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก $\dot{h}$๊ฐ€ ์ž๋™์œผ๋กœ ์ปค์ง€๋ฉด์„œ ๋ง‰์•„์ค๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ณด์ด์ง€ ์•Š๋Š” ์ž๊ธฐ์žฅ์ด ๋กœ๋ด‡์„ ๋ฐ€์–ด๋‚ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ $\gamma h$ ๋Œ€์‹  class-K ํ•จ์ˆ˜ $\alpha(h)$๋ฅผ ์”๋‹ˆ๋‹ค. $\alpha$๋Š” $\alpha(0)=0$์ด๊ณ  ์ˆœ์ฆ๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด ๋ฌด์—‡์ด๋“  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ์„ ํƒ์ด $\alpha(h)=\gamma h$์ด๋ฉฐ, $\gamma$๊ฐ€ ํด์ˆ˜๋ก ์žฅ์• ๋ฌผ์— ๊ฐ€๊นŒ์ด ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(๊ณต๊ฒฉ์ ).

$$ \dot{h}(x, u) + \alpha(h(x)) \ge 0 $$

Forward invariance ์ •๋ฆฌ (Ames et al., 2017): ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” $u$๊ฐ€ ๋งค ์ˆœ๊ฐ„ ์กด์žฌํ•˜๋ฉด, ์ดˆ๊ธฐ์— $h(x_0)\ge 0$์ด๋ฉด ๋ชจ๋“  $t\ge 0$์—์„œ $h(x(t))\ge 0$์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‹œ์ž‘์ด ์•ˆ์ „ํ•˜๋ฉด ์˜์›ํžˆ ์•ˆ์ „.

์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ QP(Quadratic Program)๋ฅผ ํ’‰๋‹ˆ๋‹ค.

$$ u^* = \arg\min_u \|u - u_\text{nominal}\|^2 \;\;\text{s.t.}\;\; \dot{h} + \gamma h \ge 0 $$
์™œ ์ข‹์€๊ฐ€? โ€” ์‚ฌ์šฉ์ž๋Š” ํ‰์†Œ๋Œ€๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ณ , CBF๋Š” ์œ„ํ—˜ํ•œ ๋ช…๋ น๋งŒ ์‚ด์ง ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. "์•ˆ์ „ ํ•„ํ„ฐ"๋ผ ๋ถ€๋ฅด๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๐ŸŽฎ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ: CBF ์•ˆ์ „ ํ•„ํ„ฐ

๋กœ๋ด‡(ํŒŒ๋ž‘)์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ x์ถ•์„ ๋”ฐ๋ผ ์ผ์ •ํ•œ ์†๋„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์ƒ์— ์žฅ์• ๋ฌผ์ด ์žˆ์œผ๋ฉด CBF ์•ˆ์ „ ํ•„ํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ช…๋ น์„ ์ˆ˜์ •ํ•ด y ๋ฐฉํ–ฅ์œผ๋กœ ํšŒํ”ผํ•ฉ๋‹ˆ๋‹ค. $\gamma$๊ฐ€ ์ž‘์„์ˆ˜๋ก ์ผ์ฐ, ํฌ๋ฉด ๋Šฆ๊ฒŒ ํšŒํ”ผํ•ฉ๋‹ˆ๋‹ค.

$\gamma$๊ฐ€ ์ž‘์œผ๋ฉด ๋งค์šฐ ์ผ์ฐ ํšŒํ”ผํ•˜๊ณ (๋ณด์ˆ˜์ ), ํฌ๋ฉด ์žฅ์• ๋ฌผ์— ๊ฑฐ์˜ ๋‹ฟ์„ ๋•Œ๊นŒ์ง€ ์ง์ง„ํ•ฉ๋‹ˆ๋‹ค(๊ณต๊ฒฉ์ ). CBF๋ฅผ ๋„๋ฉด ๋ช…๋ น์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

5. ์ฝ”๋“œ ์˜ˆ์ œ (๊ฐœ๋… ์˜์‚ฌ์ฝ”๋“œ)

import cvxpy as cp
import numpy as np

def cbf_filter(u_nom, x, obstacles, gamma=1.5):
    u = cp.Variable(2)
    constraints = []
    for (ox, oy, r) in obstacles:
        dx, dy = x[0]-ox, x[1]-oy
        h    = dx*dx + dy*dy - r*r
        hdot = 2*dx*u[0] + 2*dy*u[1]
        constraints.append(hdot + gamma*h >= 0)
    cp.Problem(cp.Minimize(cp.sum_squares(u - u_nom)), constraints).solve()
    return u.value

6. ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ธฐ