시간 사용하기 (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가 던질 수 있는 추가적인 예외를 잡아내고 처리하는 방법도 배웠습니다.