Engineering/ROS

ROS2 표준 시간, 좌표계

luckydipper 2025. 1. 12. 20:14

1. 공간적 표준 (좌표, SI 단위)

ROS2는 SI단위를 사용한다. meter, second, volt...

1.1 좌표계

정말 중요한 개념이다. 원본은 책과 rep-103을 참고하자.

  • 오른손(외적) 법칙을 사용한다.
  • 컴퓨터 비전 분야에서는 Z forward, X right, Y down 좌표계를 사용한다. (깊이를 계산할 때 Z를 앞으로 둬야 편하게 계산 가능하기 때문이다. image plane을 x y로 두면 편하다.)
  • 로봇 분야에선 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이다.
  • 지리적 위치 단거리 표현하는 경우 ENU(East North Up)를 기본으로 사용한다. (실내보다는 드론 자율주행 로봇)
  • 특이한 좌표계의 경우 접미사로 _optical, _ned가 쓰인다.
    • _optical은 카메라 좌표계이다. -> 로봇 좌표계로 TF를 해줘야 한다.
    • _ned 도 사용한다.
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' 카테고리의 다른 글

ROS2 Node Interface, Parameter, Namespace  (0) 2025.01.14
ROS2 참고 사이트  (0) 2025.01.10
ROS2 빌드, 파일 시스템  (0) 2025.01.08
Docker로 ROS를 사용하면 안 되는 이유  (0) 2025.01.06
ROS2, DDS와 QoS  (0) 2025.01.04