시간 사용하기 (Python)
목표: lookup_transform 함수에서 timeout 을 사용하여 tf2 트리에서 변환을 기다리는 방법을 배우세요.
배경 정보
이전 튜토리얼에서는 tf2 브로드캐스터. 그리고 tf2가 좌표 프레임 트리를 추적하는 방법을 배웠습니다.
이제는 lookup_transform 함수에서 timeout 을 사용하여 지정된 기간 동안 변환을 기다릴 수 있는 방법을 더 자세히 배우겠습니다.
이 도구는 변환을 발행하는 속도가 다양하거나 신뢰할 수 없는 네트워킹 및 무시할 수 없는 지연시간으로 수신되는 경우에 유용할 수 있습니다.
이 튜토리얼에서는 lookup_transform 함수의 timeout을 사용하여 tf2 트리에서 변환을 기다리는 방법을 배우게 됩니다.
작업
1 리스너 노드 업데이트
turtle_tf2_listener.py 파일을 열고, 76번째 줄에서 lookup_transform() 호출에 전달되는 timeout=Duration(seconds=1.0) 매개 변수를 제거합니다.
다음과 같이 보이도록 수정하십시오.
trans = self._tf_buffer.lookup_transform(
to_frame_rel,
from_frame_rel,
now)
또한 파일 상단에 추가로 처리해야 할 예외를 가져오십시오.
from tf2_ros import LookupException, ConnectivityException, ExtrapolationException
새로 가져온 예외와 raise 문을 추가하여 81번 라인의 예외 처리를 편집하여 예외를 확인합니다
except (LookupException, ConnectivityException, ExtrapolationException):
self.get_logger().info('transform not ready')
raise
return
이제 실행 파일을 실행하려고 하면 실행 파일이 실패하고 있음을 알 수 있습니다:
ros2 launch learning_tf2_py turtle_tf2_demo.launch.py
2 리스너 노드 수정
이제 lookup_transform() 함수가 실패하는 것을 볼 수 있습니다. 이는 프레임이 존재하지 않거나 데이터가 미래에 있을 수 있다고 알려줍니다.
이를 수정하려면 76번째 줄의 코드를 아래와 같이 수정하십시오 (timeout 매개 변수를 반환하십시오).
trans = self._tf_buffer.lookup_transform(
to_frame_rel,
from_frame_rel,
now,
timeout=rclpy.duration.Duration(seconds=1.0))
lookup_transform 은 네 가지 인수를 사용할 수 있으며, 마지막은 선택적인 timeout입니다.
지정된 기간 동안 해당 기간이 경과하기를 기다립니다.
Note
이 변경을 한 후에는 위에서 추가한 except() 블록에서 raise 문을 제거하거나 코드가 계속 실패합니다.
3 결과 확인
이제 수정된 리스너 노드로 실행 파일을 다시 시작할 수 있습니다.
ros2 launch learning_tf2_py turtle_tf2_demo.launch.py
두 거북이 사이의 변환을 사용할 수 있을 때까지 lookup_transform() 은 실제로 차단됩니다(일반적으로 몇 밀리초가 걸립니다). 일단 타임아웃에 도달하면(이 경우 1초), 변환을 사용할 수 없는 경우에만 예외가 발생합니다.
요약
이 튜토리얼에서는 lookup_transform 기능과 타임아웃 기능에 대해 자세히 알아봤습니다.
또한 tf2가 던질 수 있는 추가적인 예외를 잡아내고 처리하는 방법도 배웠습니다.