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로 두면 편하다.)
    • 오른쪽을 가르키게 손을 고정하면, 오른손 좌표계 왼손 좌표계가 나온다.
    • 윈도우 계열(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

https://cvg.cit.tum.de/_media/teaching/ss2023/mvg2023/material/chapter02_motion_and_scene_representation_part1.pdf

 

 

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.

반응형