Chap.4부터 드디어 Mobile Vehicle에 대해서 다룬다.
Chap.4 - Mobile Robot Vehicles
Chap.4에서는 2가지 vehicle에 대해서 다룬다.
하나는 바퀴가 달린 일반적인 모바일 로봇, 다른 하나는 우리나라에서 드론이라고 불리는 quadrotor이다.
나는 드론은 다루지 않으니 나중에 시간이 되면 따로 정리하겠다.
4.1 - Mobility
Mobility는 모바일 로봇이 얼마나 잘 움직이냐에 대한 척도이다.
기차는 실제로 2차원으로 움직이지만 철길(선)으로만 움직인다고 생각하면 1차원으로 움직인다고 볼 수 있다.
따라서 기차의 DoF는 1이고, 모터 또한 1개이므로 fully actuated(충분히 작동)라고 한다.
해상 보트의 경우는 앞뒤, 양옆 뿐만 아니라 회전까지 다루므로 3차원 움직임을 가진다.
따라서 DoF는 3이다. 그런데 보트의 모터는 총 2개이므로 DoF > motor 이다. 이 경우를 under actuated하다고 한다.
하늘을 나는 비행수단들은 x, y, z, roll-pitch-yaw로 총 6의 DoF를 가진다.
그런데 보통 DoF는 6인데 실질적으로 actuator는 4개만 사용한다.
fully actuated가 아니기 때문에 아주 자유로운 동작은 불가능하지만 그대신 중력을 이용하여 양력과 합성하여 추력을 얻거나 한다.
자동차의 DoF도 x, y, theta로 3이다. 그런데 자동차는 보통 2개의 actuator(앞뒤 이동, 회전용 모터)를 가지며, 자동차 역시 under actuated system이라고 할 수 있다.
위는 여러 Vehicle에 대해서 DoF와 actuator를 정리한 표이다. g는 중력을 이용함을 의미한다.
4.2 - Car-like Mobile Robots
원래 자동차는 사륜이지만 여기서는 간단히 설명하기 위해서 bicycle model로 변형하여 진행한다.
ICR은 앞바퀴와 뒷바퀴의 중심선이 만나는 점이다. {O}는 기준 좌표계, {V}는 모바일 로봇의 좌표계이다.
theta는 {O} 기준으로 로봇이 틀어진 정도를, r은 로봇 기준으로 앞바퀴의 각도이다(r은 ICR 사이 각과 같다).
앞바퀴와 뒷바퀴의 회전반경이 R1과 R2로 다르지만 그래도 같은 ICR을 가지고 있음을 알 수 있다.
현재 로봇은 v의 속도로 앞으로 이동하고 있다고 가정한 상황이다.
v는 로봇이 앞 뒤로 움직이는 속도를 의미하기 때문에 v의 y방향으로의 성분은 0이다.
v = rw이고 theta의 미분은 각속도이므로 맨 아래와 같은 식이 나타났다.
위에서 왼쪽은 자동차 좌표계 기준에서의 변수들이고, 오른쪽은 월드 좌표계 기준에서의 변수이다.
이를 구하는 과정은 다음을 참고한다.
맨 아래의 식은 속도 v를 같다고 둔 결과이다. 이는 다음과 같이 정리된다.
$$ \frac{\dot{y}}{\dot{x}} = \frac{sin{\theta}}{cos{\theta}} = tan{\theta} $$
이때 $$ \pi/2 $$ 인 경우
진행 방향 x로의 속도는 0이고, y가 무한대여야 하므로 이는 말이 안되는 경우이다. 따라서 바퀴가 2개 달린 Vehicle은 절대 90도로 진행될 수 없다.
바퀴가 4개 달린 경우 ICR은 어떻게 정해지는 지를 나타내는 그림이다.
보면 앞바퀴 2개의 회전 각도가 미세하게 다름을 알 수 있다. 만약 앞바퀴 2개가 같은 각도로 돌아 간다면
두 바퀴의 중심을 이은 선은 결코 만나지 않게 될 것이며, 따라서 ICR이 정의되지 않는다.
이 경우에는 회전이 이상하게 이뤄진다.
이를 해결하기 위해 앞에 Link를 부착하여 회전하는 방향에 따라 안쪽 앞바퀴가 더 틀어지도록 한다.
이렇게 하면 중심을 이은 선이 서로 만날 수 있어서 ICR이 정의된다.
4.2.1 - Moving to a Point
단순히 어떤 지점(Point)을 향해 로봇을 가게 하는 것이다. (*는 우리가 원하는 수치임을 의미)
K는 비례상수이고 뒤의 Root 부분은 유클리디안 거리(목표 point에서 현재 위치를 빼고 제곱하고 루트를 씌운 값)이다.
속도는 Point에 멀수록 빠르게, 가까울수록 느리게 변한다.
로봇이 틀어져 있는 각도는 위와 같이 구한다. 여기서 로봇이 어느 방향을 바라보고 있는지는 아직 모르기 때문에 *를 붙여서 목표를 향해 바라보고 있다고 '희망'하고 있다.
gamma r은 handle steering과 관련된 값이다. K는 비례 상수이고, 가운데 operator는 단순히 각도의 차이를 나타내는 기호이다. 로봇을 목표를 향해 똑바로 쳐다보게 하려면 r = 0이 되어야 한다.
4.2.2 - Following a Line
목표를 지나가는 한 직선 ax + by + c = 0을 따라가도록 하는 방식이다.
현재의 로봇의 위치 (x, y)에서 직선까지의 거리 d를 거리 공식을 이용하여 구하면 위와 같다.
거리 d를 줄이는 방향으로 로봇이 진행되며, d에 비례상수 K를 곱하여 맨 아래의 steering 변수에 적용한다.
이는 로봇과 직선과의 수직 거리에 관한 식만 고려한 것이다.
두번째로는 로봇이 바라보는 각도가 목표 각도(월드 좌표계 기준)에 일치하도록 만드는 것을 고려한다.
theta*는 우리가 원하는 각도이고 theta는 현재 로봇의 각도이다. 각도를 구하는 식은 위에서 설명했고, 각도의 차이가 0이 되도록 한다.
이 2개의 고려 사항을 Steering 변수 r에 적용하여 로봇이 목표 지점으로 향하도록 핸들을 조정하도록 할 수 있다.
이를 고려하여 로봇을 목표 지점까지 이동한 결과이다.
4.2.3 - Following a Path
4.2.1의 steering 변수만 이용하여 로봇의 움직임을 제어하는 경우에는 Oscillation이 발생하기 때문에
PID 제어를 할 필요가 있다. (자동제어 파트, 구글링 필요)
위는 PI 제어를 하는 경우이고, steady-state error를 0으로 수렴하도록 만든 것이다.
d*은 PI 제어를 하기 위해 인위적으로 추가한 거리 error값이다.
이를 이용하면 안정적으로 목표 지점에 수렴할 수 있다.
왼쪽은 I제어를 추가하여 error가 최소로 수렴하여 원하는 원궤도를 유지하도록 한 결과이다. 보면 파란선(로봇의 경로), 빨간선(원하는 경로) 간의 약간의 차이는 존재하지만 거의 동일한 궤도를 가지게 되었음을 알 수 있다. 이때 K는 직접 시뮬레이션을 돌리면서 조정할 필요가 있다. 비례상수 K를 아무렇게나 지정하는 경우에 이상한 궤도가 만들어진다.
오른쪽은 처음에 속도가 크게 증가했다가 error가 0에 수렴하면서 궤도가 어느정도 맞으니 감속하고 궤도에 맞는 목표 속도로 수렴하는 것을 나타낸다.
4.2.4 - Moving to a Pose
이전까지는 목표를 향해 가는 것만을 고려했다. 이제는 목표지점에서 Pose까지 취하도록 하는 방법을 다룬다.
ρ(목표까지 거리), α(목표각도와 현재각도의 차이), β(목표에서 틀어야 하는 각도)
여기서는 목표에서 틀어야 하는 각도인 β가 추가로 고려된다. 다시 틀어야 하는 각도이므로 앞에 (-) 부호를 붙인다.
Vn은 pose를 고려하지 않고 목표 지점에 도착했을 때 진행방향 속도 v에 대한 법선 벡터이다.
위에서 구한 ρ, α, β를 진행방향 속도 v와 steering 변수 r에 비례상수만 곱하여 구할 수 있다.
Κρ, Kα는 목표지점까지 로봇을 이동시키기 위해 필요한 변수이고, Κβ은 목표지점에서 원하는 pose가 되도록 β=0이 되게 하는 변수이다.
아래의 matrix 식은 위에서 구한 ρ, α, β의 미분 값들을 그대로 풀어 헤친 것이다.