1. 공간적 표준 (좌표, SI 단위)
ROS2는 SI단위를 사용한다. meter, second, volt...
1.1 좌표계
정말 중요한 개념이다. 원본은 책과 rep-103을 참고하자.
- 오른손 좌표계를 사용한다.
- 컴퓨터 비전 분야에서는 Z forward, X right, Y down 좌표계를 사용한다. (깊이를 계산할 때 Z를 앞으로 둬야 편하게 계산 가능하기 때문이다. image plane을 x y로 두면 편하다.)
- 오른쪽을 가르키게 손을 고정하면, 오른손 좌표계 왼손 좌표계가 나온다.
- 윈도우 계열(DirectX 계열, 언리얼 엔진), Apple의 Metal은 왼손 좌표계를 쓴다.
- Khronos 의 Vulkan, Opengl은 오른손 좌표계를 쓴다.
- computer vision은 위아래가 바뀐 오른손 좌표계를 쓴다.
- _optical은 카메라 좌표계이다. -> 로봇 좌표계로 TF를 해줘야 한다.
- 항공기나 잠수함의 경우 NED(x North, y East, z Down)좌표계를 사용할 수 있다.
- _ned를 붙혀서 좌표계의 naming convention을 지키자.
- 로봇 분야에선 X forward, Y left, Z up 좌표계를 사용한다.
- IMU를 살 때 NED(x North, y East, z Down)인지 ENU(x East, y North, z Up)인지 잘 확인해야 한다.
- RGB를 순서대로 Red:X, Green:Y, Blue:Z이다.
- Global coordinate은 ENU(East North Up)를 기본으로 사용한다.
- 주의 해야할 것은 조그만한 map을 기준으로 해야한다. GPS 신호를 그대로 써서 본초좌오선을 기준으로 xy 위도 경도를 나타낼 경우, float32 의 자료구조의 한계로 전체를 표현할 수 없다. 주변기기와 시각화 툴들이 float32를 기본으로 사용하기 때문에 type casting 비용을 줄이기 위해 float32를 많이 쓴다.
- robot_localization 패키지의 navsat_transform_node을 통해 상대좌표로 바꿀 수 있다.
| Realsense | Robot vs Camera frame |
|---|---|
![]() |
![]() |

1.2 회전 표현
Quaternion, Rotation Matrix, 고정축(vector + roll & pitch & yaw, 각속도에 사용됨), Euler Angle (거의 사용 x)
관련 내용은 예전 블로그에 남아있다.
https://luckydipper.github.io/math%20physics/2022/11/20/Math-Physics-rotation-representation.html
2. 시간 표준
3가지 방법을 통해 시간을 나타낼 수 있다.
2.1 System Clock
ROS2에서 가장 많이 쓰이는 clock으로 UTC(Coordinate Universal Time)으로 표기되어 전 세계 어디에서나 사용 가능하다.
C++의 chrono, rclpy의 time 모듈을 사용한다.
2.2 ROS Time
node가 생성될 때 use_sim_time이란 파라미터를 기본으로 가지고 있다. 시뮬레이션 환경에서 시간을 조절할 때에 쓰인다. 아래와 같이 사용하면 topic이 subscribe 될 때까지 시간을 0으로 초기화 가능하다. use_sim_time 파라미터가 true이면 ROS Time이 이용된다.
ros2 run time_rclcpp_example --ros-args -p use_sim_time:=True
2.3 Steady Time
Hardware time으로, 단조증가한다.
2.4 Time API
time, duration, rate 3가지 class로 쓸 수 있다.
Time class는 시간을 다루는 clssdl이다. nanosecond와 second를 반환하며, nanosecond가 더 정확하다.
rclcpp::Time now = node->now();
now.nanoseconds();
Duration Class는 시간이 아닌 기간을 다룰 수 있다.
rclcpp::Duration duration(1,0);
msg.stamp = now + duration;
time_publisher->publish(msg);
Rate Class는 특정 주기를 유지시켜 주는 API를 제공한다. Rate는 System clock WallRate는 Steady clock을 이용한다.
rclcpp::WallRate loop_rate(1);
while(rclcpp::ok()){
loop_rate.sleep();
}
3. 코드
- std_msgs/msg/header에는 stamp와 frame_id를 포함한다.
//rcl/time.h
enum rcl_time_source_type_t{
RCL_TIME_SOURCE_UNINITALIZED = 0,
RCL_ROS_TIME,
RCL_SYSTEM_TIME,
RCL_STEADY_TIME
}
ref.
'Engineering > ROS' 카테고리의 다른 글
| Ros Serial로 IMU 데이터를 얻는 방법 (0) | 2025.10.15 |
|---|---|
| ROS2 Node 스케줄링, 구조, 인터페이스 파라미터 (3) | 2025.01.14 |
| ROS2 참고 사이트 (2) | 2025.01.10 |
| ROS2 빌드, 파일 시스템 (4) | 2025.01.08 |
| Docker로 ROS를 사용하면 안 되는 이유 (3) | 2025.01.06 |

