본문으로 바로가기

차동 이동 로봇 기구학과 Odometry 쉽게 이해하기

category 강좌/ROS2 2026. 5. 23. 13:39
left/right encoder
   ↓
바퀴 속도 계산
   ↓
기구학
   ↓
robot velocity 계산
   ↓
odometry 계산

1. 차동 이동 로봇이란?

차동 이동 로봇은 보통 왼쪽 바퀴와 오른쪽 바퀴를 각각 독립적으로 제어하는 로봇입니다.

가장 기본적인 형태는 다음과 같습니다.

 

 

 
 

 

왼쪽 바퀴와 오른쪽 바퀴의 속도 차이를 이용해서 로봇은 직진, 후진, 회전, 곡선 주행을 합니다.

 


$$
\text{로봇의 움직임} = \text{왼쪽 바퀴 속도와 오른쪽 바퀴 속도의 차이}
$$

 

 

2. 차동 로봇의 구동 원리

차동 로봇의 핵심은 단순합니다.

 

왼쪽 바퀴 속도와 오른쪽 바퀴 속도의 차이로 로봇의 움직임이 결정된다.
 
 
 

1) 양쪽 바퀴 속도가 같을 때

 

$$
v_l = v_r
$$

왼쪽 바퀴와 오른쪽 바퀴가 같은 속도로 앞으로 회전하면 로봇은 직진합니다.

왼쪽 바퀴 → 앞으로
오른쪽 바퀴 → 앞으로

결과: 로봇 직진
 


반대로 두 바퀴가 같은 속도로 뒤로 회전하면 로봇은 후진합니다.

$$
v_l = v_r < 0
$$

 

 

 

2) 오른쪽 바퀴가 더 빠를 때

오른쪽 바퀴가 왼쪽 바퀴보다 더 빠르면 다음과 같습니다.

$$
v_r > v_l
$$

오른쪽 바퀴가 더 많이 전진하고, 왼쪽 바퀴는 상대적으로 적게 전진합니다.
 
오른쪽 바퀴: 빠름
왼쪽 바퀴: 느림​

결과: 로봇이 왼쪽으로 회전

즉,

$$
v_r > v_l \Rightarrow \text{왼쪽 회전}
$$
 
 
 

3) 왼쪽 바퀴가 더 빠를 때왼쪽 바퀴가 오른쪽 바퀴보다 더 빠르면 다음과 같습니다.

$$
v_l > v_r
$$

이 경우 로봇은 오른쪽으로 회전합니다.

$$
v_l > v_r \Rightarrow \text{오른쪽 회전}
$$

 

 

 

4) 두 바퀴가 반대 방향으로 돌 때

두 바퀴가 서로 반대 방향으로 돌면 다음과 같습니다.

$$
v_l = -v_r
$$

이 경우 로봇은 제자리 회전합니다.

예를 들어 왼쪽 바퀴는 뒤로, 오른쪽 바퀴는 앞으로 회전하면 다음과 같습니다.

$$
v_l < 0, \qquad v_r > 0
$$

결과는 다음과 같습니다.

$$
\text{로봇은 왼쪽으로 제자리 회전}
$$

반대로 왼쪽 바퀴는 앞으로, 오른쪽 바퀴는 뒤로 회전하면 다음과 같습니다.

$$
v_l > 0, \qquad v_r < 0
$$

결과는 다음과 같습니다.

$$
\text{로봇은 오른쪽으로 제자리 회전}
$$

 

 

 

3. 차동 로봇의 기본 파라미터

 

차동 로봇을 수식으로 표현하려면 다음 값들이 필요합니다.

r : 바퀴 반지름
L : 왼쪽 바퀴와 오른쪽 바퀴 사이 거리
v_l : 왼쪽 바퀴의 선속도
v_r : 오른쪽 바퀴의 선속도
ω_l : 왼쪽 바퀴의 각속도
ω_r : 오른쪽 바퀴의 각속도
v : 로봇 중심의 선속도
ω : 로봇 중심의 각속도
θ : 로봇의 방향각, yaw
 

 

여기서 중요한 값은 바퀴 반지름 $r$과 바퀴 사이 거리 $L$입니다.

$$
r = \text{wheel radius}
$$

$$
L = \text{wheel separation 또는 wheel track}
$$

바퀴 각속도와 바퀴 선속도의 관계는 다음과 같습니다.

$$
v_l = r\omega_l
$$

$$
v_r = r\omega_r
$$

즉, 모터가 얼마나 빠르게 회전하는지 알면 바퀴가 지면 위에서 얼마나 빠르게 이동하는지도 계산할 수 있습니다.

 

 

 

4. 기본 용어 정리

 

1) Wheel Radius

wheel_radius는 바퀴 반지름입니다.

$$
\text{wheel_radius} = \text{바퀴 중심에서 바퀴 바깥쪽까지의 거리}
$$

단위:

$$
\mathrm{m}
$$

기호:

$$
r
$$

예를 들어 바퀴 지름이 \(66\,\mathrm{mm}\)라면:

$$
\text{지름} = 0.066\,\mathrm{m}
$$

$$
r = \frac{0.066}{2} = 0.033\,\mathrm{m}
$$

바퀴가 한 바퀴 돌 때 이동하는 거리는 원둘레입니다.

$$
\text{바퀴 1회전 이동거리} = 2\pi r
$$

예를 들어 \(r = 0.033\,\mathrm{m}\)이면:

$$
2 \times \pi \times 0.033 \approx 0.207\,\mathrm{m}
$$

즉 바퀴가 한 바퀴 돌면 이론적으로 약 \(20.7\,\mathrm{cm}\) 이동합니다.

실전에서는 이 값이 아주 중요합니다. wheel_radius가 실제보다 크게 설정되면 로봇은 실제보다 더 많이 이동했다고 계산합니다. 반대로 작게 설정되면 실제보다 덜 이동했다고 계산합니다.


2) Wheel Separation

wheel_separation은 왼쪽 바퀴 중심과 오른쪽 바퀴 중심 사이 거리입니다.

$$
\text{wheel_separation} = \text{좌우 구동 바퀴 중심 간 거리}
$$

단위:

$$
\mathrm{m}
$$

기호:

$$
L
$$

주의할 점은 wheel_separation이 로봇 전체 폭이 아니라는 것입니다.

틀린 기준:

$$
\text{wheel_separation} \neq \text{로봇 외형 전체 폭}
$$

맞는 기준:

$$
\text{whee_separation}
=
\text{왼쪽 구동 바퀴 접지 중심}
\leftrightarrow
\text{오른쪽 구동 바퀴 접지 중심}
$$

`wheel_separation`은 회전각 계산에 직접 들어갑니다.

$$
d_{\theta}
=
\frac{d_{\text{right}} - d_{\text{left}}}
{\text{wheel_separation}}
$$

또는 \(L\)을 사용하면:

$$
d_{\theta}
=
\frac{d_{\text{right}} - d_{\text{left}}}{L}
$$

따라서 `wheel_separation`이 틀리면 직진은 그럭저럭 맞아도 회전 odometry가 틀어집니다.


3) Encoder Tick

엔코더는 바퀴 또는 모터 축이 얼마나 회전했는지를 tick으로 알려주는 센서입니다.

예를 들어 바퀴 1회전에 \(2048\) tick이 나온다고 하면:

$$
\text{ticks_per_revolution} = 2048
$$

바퀴 반지름이 \(0.033\,\mathrm{m}\)이면 tick 하나당 이동 거리는:

$$
\text{distance_per_tick}
=
\frac{2\pi r}{\text{ticks_per_revolution}}
$$

$$
=
\frac{2 \times \pi \times 0.033}{2048}
$$

$$
\approx 0.0001012\,\mathrm{m/tick}
$$

즉 \(100\) tick은:

$$
100 \times 0.0001012 = 0.01012\,\mathrm{m}
$$

약 \(1.01\,\mathrm{cm}\)입니다.



4) Odometry

Odometry는 로봇이 스스로의 움직임을 누적해서 현재 위치를 추정하는 방법입니다.

차동구동 로봇에서는 보통 다음 정보를 사용합니다.

$$
\Delta_{\text{left}}
$$

$$
\Delta_{\text{right}}
$$

$$
\text{wheel_radius}
$$

$$
\text{wheel_separation}
$$

$$
dt
$$

결과로 아래 값을 계산합니다.

$$
x : \text{odom 좌표계에서 로봇의 } x \text{ 위치}
$$

$$
y : \text{odom 좌표계에서 로봇의 } y \text{ 위치}
$$

$$
\theta : \text{로봇 yaw 방향각}
$$

$$
v : \text{로봇 선속도}
$$

$$
\omega : \text{로봇 각속도}
$$

Odometry는 절대 위치가 아닙니다. 바퀴가 미끄러지거나, 바퀴 지름이 틀리거나, 바닥 마찰이 다르면 오차가 계속 누적됩니다. 이 누적 오차를 drift라고 합니다.

$$
\text{drift} = \text{누적 위치 추정 오차}
$$




5. 차동 로봇의 기구학
기구학, 즉 Forward Kinematics는 다음 질문에 답합니다.

> 왼쪽 바퀴와 오른쪽 바퀴가 이 속도로 돌면, 로봇은 어떤 속도로 움직이는가?

입력은 바퀴 속도입니다.

$$
\text{입력} = v_l,\ v_r
$$

출력은 로봇 중심의 선속도와 각속도입니다.

$$
\text{출력} = v,\ \omega
$$

차동 로봇의 기본 기구학 식은 다음과 같습니다.

$$
v = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$

여기서:

v   : 로봇 중심의 선속도
ω   : 로봇 중심의 각속도
v_r : 오른쪽 바퀴의 선속도
v_l : 왼쪽 바퀴의 선속도
L   : 양쪽 바퀴 사이 거리




1) 예제: 직진

조건은 다음과 같습니다.

$$
v_l = 0.5\,\mathrm{m/s}
$$

$$
v_r = 0.5\,\mathrm{m/s}
$$

$$
L = 0.4\,\mathrm{m}
$$

로봇 중심의 선속도는 다음과 같습니다.

$$
v = \frac{0.5 + 0.5}{2}
$$

$$
v = 0.5\,\mathrm{m/s}
$$

각속도는 다음과 같습니다.

$$
\omega = \frac{0.5 - 0.5}{0.4}
$$

$$
\omega = 0\,\mathrm{rad/s}
$$

따라서 결과는 다음과 같습니다.

$$
v = 0.5\,\mathrm{m/s}, \qquad \omega = 0\,\mathrm{rad/s}
$$

즉, 로봇은 $0.5\,\mathrm{m/s}$로 직진하고 회전하지 않습니다.



2) 예제: 곡선 주행

조건은 다음과 같습니다.

$$
v_l = 0.3\,\mathrm{m/s}
$$

$$
v_r = 0.7\,\mathrm{m/s}
$$

$$
L = 0.4\,\mathrm{m}
$$

로봇 중심의 선속도는 다음과 같습니다.

$$
v = \frac{0.7 + 0.3}{2}
$$

$$
v = 0.5\,\mathrm{m/s}
$$

각속도는 다음과 같습니다.

$$
\omega = \frac{0.7 - 0.3}{0.4}
$$

$$
\omega = 1.0\,\mathrm{rad/s}
$$

따라서 결과는 다음과 같습니다.

$$
v = 0.5\,\mathrm{m/s}, \qquad \omega = 1.0\,\mathrm{rad/s}
$$

즉, 로봇은 앞으로 이동하면서 왼쪽으로 회전합니다.



3) 예제: 제자리 회전

조건은 다음과 같습니다.

$$
v_l = -0.2\,\mathrm{m/s}
$$

$$
v_r = 0.2\,\mathrm{m/s}
$$

$$
L = 0.4\,\mathrm{m}
$$

로봇 중심의 선속도는 다음과 같습니다.

$$
v = \frac{0.2 + (-0.2)}{2}
$$

$$
v = 0\,\mathrm{m/s}
$$

각속도는 다음과 같습니다.

$$
\omega = \frac{0.2 - (-0.2)}{0.4}
$$

$$
\omega = 1.0\,\mathrm{rad/s}
$$

따라서 결과는 다음과 같습니다.

$$
v = 0\,\mathrm{m/s}, \qquad \omega = 1.0\,\mathrm{rad/s}
$$

즉, 로봇은 제자리에서 왼쪽으로 회전합니다.





6. 차동 로봇의 역기구학
역기구학, 즉 Inverse Kinematics는 다음 질문에 답합니다.

> 로봇을 원하는 속도로 움직이려면, 왼쪽 바퀴와 오른쪽 바퀴를 각각 얼마로 돌려야 하는가?

입력은 로봇의 목표 속도입니다.

$$
\text{입력} = v,\ \omega
$$

출력은 좌우 바퀴 속도입니다.

$$
\text{출력} = v_l,\ v_r
$$

차동 로봇의 기본 역기구학 식은 다음과 같습니다.

$$
v_r = v + \frac{\omega L}{2}
$$

$$
v_l = v - \frac{\omega L}{2}
$$

바퀴 선속도가 아니라 모터 각속도가 필요하다면 다음처럼 바꿉니다.

$$
\omega_r = \frac{v_r}{r}
$$

$$
\omega_l = \frac{v_l}{r}
$$

따라서 다음과 같이 정리할 수 있습니다.

$$
\omega_r = \frac{v + \frac{\omega L}{2}}{r}
$$

$$
\omega_l = \frac{v - \frac{\omega L}{2}}{r}
$$



1) 예제: 직진 명령


로봇에게 다음 명령을 준다고 가정합니다.

$$
v = 0.5\,\mathrm{m/s}
$$

$$
\omega = 0\,\mathrm{rad/s}
$$

$$
L = 0.4\,\mathrm{m}
$$

오른쪽 바퀴 속도는 다음과 같습니다.

$$
v_r = 0.5 + \frac{0 \times 0.4}{2}
$$

$$
v_r = 0.5\,\mathrm{m/s}
$$

왼쪽 바퀴 속도는 다음과 같습니다.

$$
v_l = 0.5 - \frac{0 \times 0.4}{2}
$$

$$
v_l = 0.5\,\mathrm{m/s}
$$

결과는 다음과 같습니다.

$$
v_l = v_r = 0.5\,\mathrm{m/s}
$$

즉, 왼쪽 바퀴와 오른쪽 바퀴를 같은 속도로 돌리면 로봇은 직진합니다.



2) 예제: 전진하면서 회전

조건은 다음과 같습니다.

$$
v = 0.5\,\mathrm{m/s}
$$

$$
\omega = 1.0\,\mathrm{rad/s}
$$

$$
L = 0.4\,\mathrm{m}
$$

오른쪽 바퀴 속도는 다음과 같습니다.

$$
v_r = 0.5 + \frac{1.0 \times 0.4}{2}
$$

$$
v_r = 0.7\,\mathrm{m/s}
$$

왼쪽 바퀴 속도는 다음과 같습니다.

$$
v_l = 0.5 - \frac{1.0 \times 0.4}{2}
$$

$$
v_l = 0.3\,\mathrm{m/s}
$$

결과는 다음과 같습니다.

$$
v_r > v_l
$$

즉, 오른쪽 바퀴가 왼쪽 바퀴보다 빠르므로 로봇은 왼쪽으로 회전하면서 전진합니다.



3) 예제: 제자리 회전 명령

조건은 다음과 같습니다.

$$
v = 0\,\mathrm{m/s}
$$

$$
\omega = 1.0\,\mathrm{rad/s}
$$

$$
L = 0.4\,\mathrm{m}
$$

오른쪽 바퀴 속도는 다음과 같습니다.

$$
v_r = 0 + \frac{1.0 \times 0.4}{2}
$$

$$
v_r = 0.2\,\mathrm{m/s}
$$

왼쪽 바퀴 속도는 다음과 같습니다.

$$
v_l = 0 - \frac{1.0 \times 0.4}{2}
$$

$$
v_l = -0.2\,\mathrm{m/s}
$$

결과는 다음과 같습니다.

$$
v_r = 0.2\,\mathrm{m/s}, \qquad v_l = -0.2\,\mathrm{m/s}
$$

즉, 오른쪽 바퀴는 앞으로, 왼쪽 바퀴는 뒤로 회전합니다.

로봇은 제자리에서 왼쪽으로 회전합니다.




7. 기구학과 역기구학의 차이
기구학과 역기구학은 방향이 다릅니다.

영어 Forward Kinematics Inverse Kinematics
입력 왼쪽/오른쪽 바퀴 속도 로봇의 목표 속도
출력 로봇의 선속도와 각속도 왼쪽/오른쪽 바퀴 속도
질문 바퀴가 이렇게 돌면 로봇은 어떻게 움직이나? 로봇을 이렇게 움직이려면 바퀴를 어떻게 돌려야 하나?
주로 사용되는 곳 엔코더 기반 속도 추정, Odometry /cmd_vel을 모터 명령으로 변환



정리하면 기구학은 다음 방향입니다.

$$
\text{wheel velocity} \rightarrow \text{robot velocity}
$$

역기구학은 다음 방향입니다.

$$
\text{robot velocity} \rightarrow \text{wheel velocity}
$$

ROS 2에서는 보통 다음과 같이 사용됩니다.

 

/cmd_vel
   ↓
역기구학
   ↓
left/right wheel command
   ↓
motor driver



엔코더 피드백에서는 다음 방향으로 사용됩니다.

 

left/right encoder
   ↓
바퀴 속도 계산
   ↓
기구학
   ↓
robot velocity 계산
   ↓
odometry 계산




8. Odometry란?
Odometry는 로봇의 위치와 자세를 추정하는 것입니다.

즉, 다음 질문에 답합니다.

> 로봇이 지금 어디에 있는가?  
> 로봇이 어느 방향을 보고 있는가?

Odometry의 출력은 보통 다음과 같습니다.

$$
x,\ y,\ \theta
$$

여기서,

x : odom 좌표계에서 로봇의 x 위치
y : odom 좌표계에서 로봇의 y 위치
θ : 로봇의 yaw 방향


차동 로봇에서 Odometry는 주로 바퀴 엔코더를 사용합니다.

왼쪽 바퀴 엔코더
오른쪽 바퀴 엔코더
시간 dt


이 값들을 이용해서 로봇이 얼마나 움직였는지 계산하고, 그 값을 계속 누적합니다.




9. 기구학과 Odometry의 차이
기구학과 Odometry는 자주 헷갈리지만 역할이 다릅니다.

$$
\text{기구학} = \text{순간 속도 계산}
$$

$$
\text{Odometry} = \text{위치와 자세 누적 추정}
$$

기구학은 현재 바퀴 속도로부터 로봇의 속도를 구합니다.

$$
v = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$

Odometry는 이 속도를 시간에 따라 적분합니다.

$$
x,\ y,\ \theta \text{를 계속 업데이트}
$$

예를 들어,

$$
v = 0.5\,\mathrm{m/s}
$$

$$
\omega = 0\,\mathrm{rad/s}
$$

$$
dt = 1\,\mathrm{s}
$$

이면 로봇은 1초 동안 약 $0.5\,\mathrm{m}$ 전진합니다.

Odometry에서는 다음처럼 위치를 갱신합니다.

$$
x_{new} = x_{old} + v\cos(\theta)dt
$$

$$
y_{new} = y_{old} + v\sin(\theta)dt
$$

$$
\theta_{new} = \theta_{old} + \omega dt
$$

즉,

$$
\text{기구학} = \text{속도를 구하는 공식}
$$

$$
\text{Odometry} = \text{속도를 이용해서 위치를 누적하는 과정}
$$

 

 

 

 

 

10. 차동 로봇 Odometry 계산 순서

실제 로봇에서는 보통 다음 순서로 계산합니다.

1. 왼쪽/오른쪽 엔코더 값을 읽는다.
2. 이전 엔코더 값과 비교해서 바퀴 회전량을 구한다.
3. 바퀴 회전량으로 바퀴 이동거리를 구한다.
4. 왼쪽/오른쪽 바퀴 이동거리로 로봇의 이동거리와 회전량을 구한다.
5. $x$, $y$, $\theta$를 업데이트한다.
6. `/odom` 메시지와 `odom → base_link` TF를 발행한다.

수식으로 보면 다음과 같습니다.

$$
\Delta s_l = r\Delta\phi_l
$$

$$
\Delta s_r = r\Delta\phi_r
$$

여기서:

Δs_l : 왼쪽 바퀴 이동거리
Δs_r : 오른쪽 바퀴 이동거리
r    : 바퀴 반지름
Δφ_l : 왼쪽 바퀴 회전각
Δφ_r : 오른쪽 바퀴 회전각



로봇 중심의 이동거리와 회전량은 다음과 같습니다.

$$
\Delta s = \frac{\Delta s_r + \Delta s_l}{2}
$$

$$
\Delta\theta = \frac{\Delta s_r - \Delta s_l}{L}
$$

단순한 Euler 적분은 다음과 같습니다.

$$
x_{new} = x_{old} + \Delta s\cos(\theta_{old})
$$

$$
y_{new} = y_{old} + \Delta s\sin(\theta_{old})
$$

$$
\theta_{new} = \theta_{old} + \Delta\theta
$$

더 정확하게는 회전 중간각을 사용할 수 있습니다.

$$
x_{new} = x_{old} + \Delta s\cos\left(\theta_{old} + \frac{\Delta\theta}{2}\right)
$$

$$
y_{new} = y_{old} + \Delta s\sin\left(\theta_{old} + \frac{\Delta\theta}{2}\right)
$$

$$
\theta_{new} = \theta_{old} + \Delta\theta
$$

두 번째 식은 회전하면서 이동할 때 조금 더 자연스럽고 오차가 적습니다.

 

 

 

 

11. 바퀴가 로봇 중앙에 부착된 경우

이제 중요한 내용을 보겠습니다.

 

차동 로봇의 기구학 공식은 보통 로봇 중심이 양쪽 바퀴 축의 중앙에 있다고 가정합니다.

 
 
 

이때는 앞에서 설명한 기본 공식이 그대로 적용됩니다.

Forward Kinematics:

$$
v = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$

Inverse Kinematics:

$$
v_r = v + \frac{\omega L}{2}
$$

$$
v_l = v - \frac{\omega L}{2}
$$

Odometry:

$$
\Delta s = \frac{\Delta s_r + \Delta s_l}{2}
$$

$$
\Delta\theta = \frac{\Delta s_r - \Delta s_l}{L}
$$

$$
x_{new} = x_{old} + \Delta s\cos\left(\theta + \frac{\Delta\theta}{2}\right)
$$

$$
y_{new} = y_{old} + \Delta s\sin\left(\theta + \frac{\Delta\theta}{2}\right)
$$

$$
\theta_{new} = \theta_{old} + \Delta\theta
$$

이 구조가 가장 기본이고 가장 설명하기 쉽습니다.

 

 

 

12. 바퀴가 로봇 중앙에서 이격된 경우

실제 로봇에서는 바퀴 축이 로봇의 기하학적 중심과 일치하지 않는 경우가 있습니다.

예를 들어 바퀴가 로봇 중심보다 뒤쪽에 달린 경우입니다.

 
 

여기서 문제가 생깁니다.

 

기본 차동 기구학 공식은 실제로는 바퀴 축 중심, 즉 wheel axle center에 대한 속도를 계산합니다.

하지만 ROS 2나 로봇 제어에서는 보통 `base_link` 중심을 로봇의 기준점으로 사용합니다.

따라서 다음 두 점을 구분해야 합니다.

wheel axle center : 바퀴 축 중심
base_link center  : 로봇 기준 중심
 
 
 
 
 

13. 바퀴 축 중심과 base_link 중심의 차이

바퀴 축 중심을 $A$, 로봇 기준 중심을 $B$라고 하겠습니다.

 
 

 

여기서:

A : 바퀴 축 중심
B : 로봇 기준 중심
a : 바퀴 축 중심에서 base_link 중심까지의 전후방 거리
 

좌표계를 로봇 기준으로 보면 보통:

x축 : 전방
y축 : 왼쪽
z축 : 위쪽
 

이라고 둡니다.



바퀴 축 중심이 `base_link`보다 뒤에 있으면 `base_link`는 wheel axle center보다 앞에 있습니다.

wheel axle center 기준으로 `base_link`의 위치는 다음과 같습니다.

$$
p = \begin{bmatrix} a \\ 0 \end{bmatrix}
$$

일반적으로 좌우 이격까지 포함하면 다음과 같습니다.

$$
r_{AB} = \begin{bmatrix} a \\ b \end{bmatrix}
$$

 

 

 

 

14. 바퀴가 이격된 경우에도 바퀴 자체의 기본 기구학은 같다

중요한 점은 이것입니다.

> 바퀴가 중앙에서 이격되어도 왼쪽/오른쪽 바퀴로부터 구하는 wheel axle center의 속도 공식은 같습니다.

즉, 바퀴 축 중심 $A$에 대해서는 여전히 다음이 성립합니다.

$$
v_A = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$

여기서 $v_A$는 바퀴 축 중심의 전방 속도입니다.

문제는 로봇 기준점 $B$, 즉 `base_link`의 속도를 어떻게 구할 것인가입니다.

 

 

 

 

15. 이격된 기준점의 속도 계산

강체 운동에서는 한 점의 속도를 알면 같은 물체 위의 다른 점의 속도를 구할 수 있습니다.

2D 평면에서 기본 관계는 다음과 같습니다.

$$
v_B = v_A + \omega \times r_{AB}
$$

여기서:

v_A  : 바퀴 축 중심의 속도
v_B  : base_link 중심의 속도
ω    : 로봇의 yaw 각속도
r_AB : A에서 B까지의 위치 벡터
더보기
 

즉,

$$
\text{B의 속도} = \text{A의 병진 운동 성분} + \text{회전 운동으로 인해 B에 추가로 생기는 속도}
$$

 

A에서 B까지의 위치가 다음과 같다고 하겠습니다.

$$
r_{AB} = \begin{bmatrix} a \\ b \end{bmatrix}
$$

3차원 벡터로 쓰면 다음과 같습니다.

$$
\omega = \begin{bmatrix} 0 \\ 0 \\ \omega \end{bmatrix}, \qquad
r_{AB} = \begin{bmatrix} a \\ b \\ 0 \end{bmatrix}
$$
 
 

 

더보기

두 벡터의 외적은 다음과 같습니다.

$$
A \times B =
\begin{bmatrix}
A_yB_z - A_zB_y \\
A_zB_x - A_xB_z \\
A_xB_y - A_yB_x
\end{bmatrix}
$$

이번 경우는 다음과 같습니다.

$$
\omega \times r_{AB}
=
\begin{bmatrix} 0 \\ 0 \\ \omega \end{bmatrix}
\times
\begin{bmatrix} a \\ b \\ 0 \end{bmatrix}
$$

계산하면 다음과 같습니다.

$$
\omega \times r_{AB}
=
\begin{bmatrix}
0 \cdot 0 - \omega b \\
\omega a - 0 \cdot 0 \\
0 \cdot b - 0 \cdot a
\end{bmatrix}
$$

따라서,

$$
\omega \times r_{AB}
=
\begin{bmatrix}
-\omega b \\
\omega a \\
0
\end{bmatrix}
$$

또한,

$$
v_A =
\begin{bmatrix}
v_{Ax} \\
v_{Ay} \\
0
\end{bmatrix}
$$

라고 하면,

$$
v_B =
\begin{bmatrix}
v_{Ax} \\
v_{Ay} \\
0
\end{bmatrix}
+
\begin{bmatrix}
-\omega b \\
\omega a \\
0
\end{bmatrix}
$$

따라서,

$$
v_B =
\begin{bmatrix}
v_{Ax} - \omega b \\
v_{Ay} + \omega a \\
0
\end{bmatrix}
$$

즉,

$$
v_{Bx} = v_{Ax} - \omega b
$$

$$
v_{By} = v_{Ay} + \omega a
$$

 

 

차동 로봇의 바퀴 축 중심은 옆으로 미끄러지지 않는다고 가정하므로 다음과 같습니다.

$$
v_{Ax} = v_A
$$

$$
v_{Ay} = 0
$$

따라서 `base_link` 기준 속도는 다음과 같습니다.

$$
v_{Bx} = v_A - \omega b
$$

$$
v_{By} = \omega a
$$

만약 `base_link`가 바퀴 축 중심보다 앞쪽에만 있고 좌우 이격은 없다면 다음과 같습니다.

$$
a \neq 0
$$

$$
b = 0
$$

이 경우,

$$
v_{Bx} = v_A
$$

$$
v_{By} = \omega a
$$

즉, `base_link` 중심은 회전할 때 옆방향 속도 성분을 갖습니다.

 

 

 

16. 기준점 위치에 따른 차이

차동 로봇의 기본 기구학은 바퀴 축 중심, 즉 wheel axle center를 기준으로 합니다.

$$
A = \text{wheel axle center}
$$

$$
B = \text{base_link}
$$

A에서 B까지의 위치를 다음처럼 둡니다.

$$
r_{AB} = \begin{bmatrix} a \\ b \end{bmatrix}
$$

여기서,

 

           기호                                       의미

$a$  $A$에서 $B$까지 전후 방향 거리
$b$ $A$에서 $B$까지 좌우 방향 거리
 
 
 

1) 바퀴 축 중심과 base_link가 같은 경우

바퀴 축 중심과 `base_link`가 같으면 다음과 같습니다.

$$
a = 0
$$

$$
b = 0
$$

그러면 $A$와 $B$가 같은 점이므로 별도 보정이 필요 없습니다.

$$
v_{Bx} = v_A
$$

$$
v_{By} = 0
$$

$$
\omega_B = \omega
$$

즉, 기본 차동 로봇 공식 그대로 사용하면 됩니다.

$$
v = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$
 
 
 
 

2) base_link가 바퀴 축보다 앞에 있는 경우

`base_link`가 바퀴 축보다 앞에 있으면 다음과 같습니다.

$$
a > 0
$$

$$
b = 0
$$

이 경우 바퀴 축 중심 $A$의 전방 속도는 그대로입니다.

$$
v_{Bx} = v_A
$$

하지만 로봇이 회전하면 앞쪽에 있는 `base_link` $B$는 원을 그리며 움직입니다.

그래서 횡방향 속도가 생깁니다.

$$
v_{By} = \omega a
$$

즉,

$$
v_{Bx} = v_A
$$

$$
v_{By} = \omega a
$$

$$
\omega_B = \omega
$$

중요한 점은 이것입니다.

$$
\text{로봇이 옆으로 미끄러지는 것이 아니다}
$$

$$
\text{base_link가 회전 중심에서 떨어져 있기 때문에 y 성분이 생기는 것이다}
$$
 
 
 
 

3) base_link가 좌우로도 치우친 경우

`base_link`가 앞뒤뿐 아니라 좌우로도 치우친 경우는 다음과 같습니다.

$$
a \neq 0
$$

$$
b \neq 0
$$

일반식은 다음과 같습니다.

$$
v_{Bx} = v_A - \omega b
$$

$$
v_{By} = \omega a
$$

$$
\omega_B = \omega
$$

즉, `base_link`가 앞뒤뿐 아니라 좌우로도 치우쳐 있으면 전방 속도에도 영향이 생깁니다.

하지만 일반적인 차동 로봇에서는 이런 구조를 잘 쓰지 않습니다.

실무에서는 보통 다음 중 하나를 선택합니다.

1. `base_link`를 바퀴 축 중심에 둔다.
2. odometry는 바퀴 축 중심에서 계산한다.
3. `base_link` 위치는 TF로 연결한다.
 
 
 
 

17. 이격된 로봇의 역기구학

역기구학은 원래 바퀴 축 중심 $A$ 기준 속도로 계산합니다.

$$
v_r = v_A + \frac{\omega L}{2}
$$

$$
v_l = v_A - \frac{\omega L}{2}
$$

그런데 속도 명령이 `base_link` 기준으로 들어온다면, 먼저 $v_A$를 구해야 합니다.

앞에서 다음 관계가 있었습니다.

$$
v_{Bx} = v_A - \omega b
$$

따라서,

$$
v_A = v_{Bx} + \omega b
$$

일반적인 역기구학은 다음과 같습니다.

$$
v_r = (v_{Bx} + \omega b) + \frac{\omega L}{2}
$$

$$
v_l = (v_{Bx} + \omega b) - \frac{\omega L}{2}
$$
 
 
 
 

가장 흔한 경우: 앞뒤 방향 이격만 있음

 

`base_link`가 바퀴 축보다 앞에만 있다면 다음과 같습니다.

$$
a > 0
$$

$$
b = 0
$$

그러면,

$$
v_A = v_{Bx}
$$

따라서 바퀴 속도는 기존 공식과 같습니다.

$$
v_r = v_{Bx} + \frac{\omega L}{2}
$$

$$
v_l = v_{Bx} - \frac{\omega L}{2}
$$

즉, 앞뒤 방향 이격만 있으면 역기구학 공식은 그대로 사용해도 됩니다.

다만 회전 중 `base_link`에는 다음 횡방향 속도가 생깁니다.

$$
v_{By} = \omega a
$$
 
 
 
 

18. 이격된 로봇의 기구학

엔코더에서 바퀴 속도를 읽으면 먼저 바퀴 축 중심 기준 속도를 계산합니다.

$$
v_A = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$

`base_link` 기준 속도가 필요하면 다음 변환을 적용합니다.

$$
v_{Bx} = v_A - \omega b
$$

$$
v_{By} = \omega a
$$

$$
\omega_B = \omega
$$

앞뒤 방향 이격만 있는 일반적인 경우에는 다음과 같습니다.

$$
a > 0
$$

$$
b = 0
$$

따라서,

$$
v_{Bx} = v_A
$$

$$
v_{By} = \omega a
$$

$$
\omega_B = \omega
$$

 

 

 

19. 바퀴 이격 로봇의 Odometry 적용 방법

 

가장 안전하고 실무적인 방식은 이것입니다.

$$
\text{Odometry 적분은 wheel axle center 기준으로 한다}
$$

$$
\text{그다음 TF로 base_link 위치를 연결한다}
$$

즉, odom 좌표계에서 직접 추정하는 것은 바퀴 축 중심 프레임입니다.

예를 들어 프레임을 이렇게 둡니다.

odom
 └── base_footprint 또는 wheel_axle_link
       └── base_link
 

또는:

odom
 └── wheel_axle_link
       └── base_link
 

여기서:

wheel_axle_link : 바퀴 축 중심
base_link       : 로봇 기하 중심 또는 센서 기준 중심



`wheel_axle_link`에서 `base_link`까지의 TF는 고정 변환입니다.

예를 들어 base_link가 바퀴 축 중심보다 0.2m 앞에 있다면:

wheel_axle_link → base_link

translation:
x = 0.2
y = 0.0
z = 0.0

rotation:
roll = 0
pitch = 0
yaw = 0



수식으로 쓰면 다음과 같습니다.

$$
{}^{A}p_B =
\begin{bmatrix}
0.2 \\
0.0 \\
0.0
\end{bmatrix}
$$

$$
{}^{A}R_B =
\begin{bmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
$$

이렇게 두면 Odometry 계산이 깔끔해집니다.

 

 

 

20. wheel axle center 기준 Odometry

바퀴 엔코더에서 이동거리를 계산합니다.

$$
\Delta s_l = r\Delta\phi_l
$$

$$
\Delta s_r = r\Delta\phi_r
$$

바퀴 축 중심 기준 이동량은 다음과 같습니다.

$$
\Delta s_A = \frac{\Delta s_r + \Delta s_l}{2}
$$

$$
\Delta\theta = \frac{\Delta s_r - \Delta s_l}{L}
$$

그다음 `wheel_axle_link` pose를 업데이트합니다.

$$
x_{A,new} = x_{A,old} + \Delta s_A \cos\left(\theta_{old} + \frac{\Delta\theta}{2}\right)
$$

$$
y_{A,new} = y_{A,old} + \Delta s_A \sin\left(\theta_{old} + \frac{\Delta\theta}{2}\right)
$$

$$
\theta_{new} = \theta_{old} + \Delta\theta
$$

이제 `base_link`의 위치는 `wheel_axle_link`에서 고정된 위치만큼 변환해서 얻습니다.

`base_link`가 `wheel_axle_link`보다 $a$만큼 앞에 있다면 다음과 같습니다.

$$
x_B = x_A + a\cos(\theta)
$$

$$
y_B = y_A + a\sin(\theta)
$$

$$
\theta_B = \theta
$$

이것이 바퀴가 중앙에서 이격된 로봇에서 가장 명확한 Odometry 적용 방식입니다.

 

 

 

21. base_link를 직접 Odometry 기준으로 쓰고 싶다면

경우에 따라 `/odom` 메시지의 child frame을 `base_link`로 내고 싶을 수 있습니다.

이때는 wheel axle center의 pose를 먼저 계산한 뒤, `base_link` pose로 변환해서 발행하면 됩니다.

일반식은 다음과 같습니다.

$$
x_B = x_A + a\cos(\theta) - b\sin(\theta)
$$

$$
y_B = y_A + a\sin(\theta) + b\cos(\theta)
$$

$$
\theta_B = \theta
$$

여기서:

a : wheel axle center에서 base_link까지 전방 거리
b : wheel axle center에서 base_link까지 좌측 거리

 


만약 앞뒤 방향 이격만 있으면 다음과 같습니다.

$$
b = 0
$$

따라서,

$$
x_B = x_A + a\cos(\theta)
$$

$$
y_B = y_A + a\sin(\theta)
$$

$$
\theta_B = \theta
$$

속도도 `base_link` 기준으로 바꾸려면 다음 식을 사용합니다.

$$
v_{Bx} = v_A - \omega b
$$

$$
v_{By} = \omega a
$$

$$
\omega_B = \omega
$$

앞뒤 이격만 있으면 다음과 같습니다.

$$
v_{Bx} = v_A
$$

$$
v_{By} = \omega a
$$

$$
\omega_B = \omega
$$

주의할 점은 `/odom` 메시지의 twist에 `linear.y`가 들어갈 수 있다는 점입니다.

일반적인 차동 로봇에서는 linear.y = 0으로 두는 경우가 많지만, base_link가 바퀴 축 중심에서 앞에 있으면 base_link 관점에서는 회전 중 횡방향 속도가 존재합니다.

$$
\text{linear.y} = v_{By} = \omega a
$$

 

 

 

22.  정리

 

차동 이동 로봇의 구동 원리는 다음과 같습니다.

$$
\text{왼쪽/오른쪽 바퀴 속도 차이로 이동과 회전을 만든다}
$$

기구학은 다음과 같습니다.

$$
\text{바퀴 속도} \rightarrow \text{로봇 속도}
$$

역기구학은 다음과 같습니다.

$$
\text{로봇 목표 속도} \rightarrow \text{바퀴 속도}
$$

Odometry는 다음과 같습니다.

$$
\text{바퀴 이동량을 시간에 따라 누적해서 로봇의 위치와 자세를 추정}
$$

 

가장 기본 공식은 다음입니다.

 

Forward Kinematics:

$$
v = \frac{v_r + v_l}{2}
$$

$$
\omega = \frac{v_r - v_l}{L}
$$

 
 
 
Inverse Kinematics:

$$
v_r = v + \frac{\omega L}{2}
$$

$$
v_l = v - \frac{\omega L}{2}
$$
 

 

 

Odometry:

$$
\Delta s = \frac{\Delta s_r + \Delta s_l}{2}
$$

$$
\Delta\theta = \frac{\Delta s_r - \Delta s_l}{L}
$$

$$
x_{new} = x_{old} + \Delta s\cos\left(\theta + \frac{\Delta\theta}{2}\right)
$$

$$
y_{new} = y_{old} + \Delta s\sin\left(\theta + \frac{\Delta\theta}{2}\right)
$$

$$
\theta_{new} = \theta_{old} + \Delta\theta
$$

 

 

 

바퀴 축 중심과 로봇 중심이 일치하면 위 공식을 그대로 쓰면 됩니다.

하지만 바퀴 축 중심과 `base_link`가 다르면 다음처럼 생각해야 합니다.

$$
\text{차동 기구학의 기준점은 wheel axle center다}
$$

$$
\text{Odometry도 wheel axle center 기준으로 적분하는 것이 가장 깔끔하다}
$$

$$
\text{base_link는 TF로 연결하는 것이 실무적으로 안전하다}
$$

따라서 바퀴가 중앙에서 이격된 로봇에서는 다음 구조를 추천합니다.

odom
 └── wheel_axle_link
       └── base_link



이렇게 하면 기구학, 역기구학, Odometry, TF 구조가 모두 명확해집니다.

728x90
728x90