robot_state_publisher
URDF는 글일 뿐인데, TF는 누가 만들어 낼까?
하는 일
모델을 읽고 TF를 냅니다
robot_state_publisher 노드는 URDF와 관절 값을 받아, link마다 부모 기준 위치를 계산해 TF로 내보냅니다. 12강에서 손으로 하던 변환 발행을 모델 파일 하나로 대신하는 셈입니다.
입력 1
모델은 파라미터로 받습니다
URDF 글 전체를 robot_description 파라미터(8강)로 넘깁니다. 이 값이 없으면 노드가 시작하지 못합니다. 노드는 받은 URDF를 /robot_description 토픽으로 다시 내보내고, Transient Local(11강 4편)이라 RViz를 나중에 켜도 받습니다.
display.launch.py를 끈 상태에서 실행합니다. 켜 둔 채면 robot_state_publisher가 둘이 됩니다.
고정 관절
fixed는 /tf_static으로 한 번
fixed joint는 값이 바뀌지 않으니 시작할 때 /tf_static(12강 6편)에 한 번만 냅니다. 움직이는 joint는 관절 값이 들어올 때마다 /tf에 냅니다.
입력 2
움직이는 관절엔 관절 값이 필요
head가 지금 몇 라디안 돌아 있는지는 URDF에 없습니다. 그 값은 /joint_states 토픽의 sensor_msgs/msg/JointState 메시지로 받습니다. 값이 오지 않은 joint 아래의 link는 TF가 없어, RViz에서 제자리를 찾지 못합니다.
누가 내나
관절 값은 누가 보내 줄까
실제 로봇은 모터의 엔코더 값을, 시뮬레이터는 흉내 낸 값을 냅니다. 둘 다 없는 지금은 joint_state_publisher_gui로 사람이 직접 값을 넣습니다. 같은 joint 값을 두 곳에서 내면 모델이 떨리니 하나만 씁니다.
따라 하기
토픽과 TF 나무로 확인합니다
1편처럼 display.launch.py를 띄운 채 새 터미널에서 확인합니다. ros2 run tf2_tools view_frames(12강 4편)로 TF 나무를 그려 보면 프레임 이름이 URDF의 link 이름과 같습니다.
출력 일부만 보였습니다. RViz가 만드는 토픽 등이 더 있습니다.
다음 편