시간 사용하기 (C++)
목표: lookupTransform() 함수를 사용하여 특정 시간에 변환을 얻는 방법과 tf2 트리에서 변환을 사용 가능할 때까지 기다리는 방법을 배우세요.
배경 정보
이전 튜토리얼에서는 tf2 브로드캐스터. 그리고 tf2가 좌표 프레임 트리를 추적하는 방법을 배웠습니다.
이 트리는 시간에 따라 변경되며, tf2는 모든 변환에 대한 시간 스냅샷을 저장합니다 (기본적으로 최대 10초까지).
지금까지 tf2 트리에서 가장 최근에 사용 가능한 변환에 액세스하기 위해 lookupTransform() 함수를 사용했으며, 해당 변환이 언제 녹화되었는지는 알지 못했습니다.
이 튜토리얼에서는 특정 시간에 변환을 얻는 방법을 배우게 됩니다.
작업
1 tf2와 시간
우리는 프레임 추가 튜토리얼 에서 끝난 곳으로 돌아갑시다.
learning_tf2_cpp 패키지로 이동합니다.
turtle_tf2_listener.cpp 파일을 열어 lookupTransform() 호출을 살펴보세요.
transformStamped = tf_buffer_->lookupTransform(
toFrameRel,
fromFrameRel,
tf2::TimePointZero);
여기서 tf2::TimePointZero 를 호출하여 시간을 0으로 지정했습니다.
Note
tf2 패키지에는 tf2::TimePoint 라는 고유한 시간 유형이 있으며 이는 rclcpp::Time 과 다릅니다.
패키지 tf2_ros 의 많은 API는 자동으로 rclcpp::Time 과 tf2::TimePoint 사이를 변환합니다.
여기에서 rclcpp::Time(0, 0, this->get_clock()->get_clock_type()) 을 사용할 수도 있지만, 어차피 tf2::TimePointZero 로 변환됩니다.
tf2에서 시간 0은 버퍼에서 “가장 최신 사용 가능한” 변환을 의미합니다.
이제 이 줄을 현재 시간인 this->get_clock()->now() 를 사용하여 변경하세요.
rclcpp::Time now = this->get_clock()->now();
transformStamped = tf_buffer_->lookupTransform(
toFrameRel,
fromFrameRel,
now);
이제 실행 파일을 다시 실행하려고 합니다.
ros2 launch learning_tf2_cpp turtle_tf2_demo.launch.py
실패하고 다음과 유사한 내용을 출력하는 것을 알 수 있습니다.
[INFO] [1629873136.345688064] [listener]: Could not transform turtle1 to turtle2: Lookup would
require extrapolation into the future. Requested time 1629873136.345539 but the latest data
is at time 1629873136.338804, when looking up transform from frame [turtle1] to frame [turtle2]
프레임이 존재하지 않거나 데이터가 미래에 있을 수 있다고 알려줍니다.
왜 이렇게 발생하는지 이해하기 위해 버퍼가 어떻게 작동하는지 이해해야 합니다. 첫째, 각 리스너는 다른 tf2 브로드캐스터에서 오는 모든 좌표 변환을 저장하는 버퍼가 있습니다. 둘째, 브로드캐스터가 변환을 보내면 그 변환이 버퍼에 들어가기까지 시간이 걸립니다 (보통 몇 밀리초). 따라서 “지금” 시간에 프레임 변환을 요청하면 해당 정보가 도착할 때까지 몇 밀리초를 기다려야 합니다.
2 변환 대기
tf2는 변환을 사용 가능할 때까지 대기하는 좋은 도구를 제공합니다.
이를 위해 lookupTransform() 에 타임아웃 매개 변수를 추가하면 됩니다.
다음과 같이 코드를 수정하여 이 문제를 해결하십시오 (마지막 타임아웃 매개 변수를 추가하십시오).
rclcpp::Time now = this->get_clock()->now();
transformStamped = tf_buffer_->lookupTransform(
toFrameRel,
fromFrameRel,
now,
50ms);
lookupTransform() 함수는 네 개의 인수를 사용할 수 있으며, 마지막은 선택적인 타임아웃입니다.
지정된 기간 동안 대기하며 타임아웃이 경과하면 중지됩니다.
3 결과 확인
이제 실행 파일을 다시 실행할 수 있습니다.
ros2 launch learning_tf2_cpp turtle_tf2_demo.launch.py
lookupTransform() 이 실제로 두 거북이 사이의 변환을 사용 가능할 때까지 차단될 것을 알 수 있습니다 (일반적으로 몇 밀리초가 걸립니다).
타임아웃이 경과하면 (이 경우 50밀리초) 변환을 아직 사용할 수 없는 경우에만 예외가 발생합니다.
요약
이 튜토리얼에서는 특정 타임스탬프에서 변환을 얻는 방법과 lookupTransform() 함수를 사용할 때 tf2 트리에서 변환을 사용 가능할 때까지 대기하는 방법을 배웠습니다.