/clock과 use_sim_time
시뮬레이션 속 10초는 진짜 10초일까?
두 시계
벽시계와 시뮬레이션 시계
Gazebo는 물리를 한 단계씩 계산하며 자기 시간을 셉니다. 컴퓨터가 느리면 실제보다 천천히 가고, 일시정지하면 멈춥니다. 이 시간을 시뮬레이션 시간(sim time)이라고 합니다. 두 시계의 빠르기 비율이 1편에서 본 실시간 비율입니다.
/clock
Gazebo 시간은 /clock으로 흐릅니다
6편의 브리지가 Gazebo의 시계를 rosgraph_msgs/msg/Clock 타입으로 /clock 토픽에 올립니다. 시뮬레이션 시간이 필요한 노드는 이 토픽을 듣고 지금이 몇 초인지 압니다.
스위치
use_sim_time을 켜야 따라갑니다
use_sim_time은 모든 노드가 가진 파라미터입니다(8강). 켜면 노드의 시계, 곧 self.get_clock().now()와 타이머가 벽시계 대신 /clock을 따라갑니다. 기본값은 꺼짐입니다.
따라 하기
시계와 스위치를 확인합니다
Gazebo를 띄운 채 ros2 topic echo /clock --once로 지금 시뮬레이션 시각을 한 번 봅니다. TurtleBot3 런치는 robot_state_publisher에 use_sim_time을 이미 켜서 넘깁니다.
시각 값은 예시입니다. Gazebo를 켠 뒤 흐른 시간만큼 나옵니다.
섞이면
한 노드만 벽시계면 시간이 어긋납니다
시뮬레이션에서 나온 데이터에는 Gazebo 시각이 찍혀 있습니다. 벽시계를 쓰는 노드가 받으면 시각이 맞지 않아 데이터를 버리거나 변환(TF)을 못 찾는 일이 생깁니다. RViz 화면이 비어 보이는 흔한 원인입니다.
시뮬레이션에 붙는 노드는 모두 use_sim_time을 켭니다.
켜는 법
노드를 띄울 때 함께 켭니다
ros2 run이면 --ros-args -p use_sim_time:=true를 붙입니다(8강). 런치 파일이 인자를 받아 주면 use_sim_time:=True로 넘기고, 직접 쓰는 런치라면 Node의 parameters에 적습니다(10강 6편).
다음 편에서 RViz를 1번 방법으로 띄우고, 15강의 SLAM과 Nav2도 이렇게 켭니다.
다음 편