Twist 발행 노드
키보드 없이, 코드만으로 거북이에게 원을 그리게 하려면?
목표
teleop 대신 내 노드가 보냅니다
2강에서 키보드로 몰 때는 /teleop_turtle이 /turtle1/cmd_vel에 Twist를 보냈습니다. 같은 토픽에 같은 타입을 보내는 노드를 직접 만들면, 거북이는 누가 보냈는지 따지지 않고 그대로 따릅니다.
turtle_driver는 이 편에서 붙인 노드 이름입니다.
Twist
가는 속도와 도는 속도
geometry_msgs/msg/Twist는 직진 속도 linear와 회전 속도 angular, 두 3차원 벡터입니다(4강 5편). 바닥을 다니는 거북이는 앞으로 가는 linear.x(m/s)와 제자리에서 도는 angular.z(rad/s)만 씁니다.
코드
타이머로 Twist를 계속 보냅니다
5편의 talker와 같은 틀에서 타입과 토픽 이름만 바꿨습니다. 0.1초마다 같은 Twist를 /turtle1/cmd_vel로 보냅니다.
맨 위 import는 1편의 두 줄에 from geometry_msgs.msg import Twist를 더하고, main은 2편과 같되 HelloNode() 자리에 TurtleDriver()를 씁니다. 속도는 2.0처럼 소수로 넣습니다. 정수 2를 넣으면 AssertionError: The 'x' field must be of type 'float'가 납니다.
결과
반지름 2짜리 원을 그립니다
앞으로 가면서 계속 왼쪽으로 돌면 원이 됩니다. 반지름은 linear.x ÷ angular.z라서 2입니다. angular.z가 양수면 왼쪽(반시계 방향)으로 돕니다.
turtlesim 연못의 한 변은 약 11입니다. 거북이는 가운데(5.5, 5.5)에서 출발합니다.
왜 계속 보내나
한 번만 보내면 1초 뒤 멈춥니다
turtlesim은 마지막 명령을 받은 지 1초가 지나면 거북이를 세웁니다. 그래서 Twist는 한 번이 아니라 타이머로 계속 보냅니다. 명령이 끊기면 멈추게 하는 것은 실제 로봇에서도 흔한 안전장치입니다.
따라 하기
거북이를 띄우고 내 노드를 켭니다
package.xml에는 geometry_msgs를 exec_depend로, setup.py에는 driver 명령을 더하고 빌드합니다. turtlesim을 띄운 뒤 ros2 run my_package driver를 실행하면 거북이가 원을 그립니다.
ros2 topic hz로 0.1초마다, 곧 1초에 10번 보내는지 확인합니다(3강 7편). 숫자는 9.998처럼 조금씩 흔들리고, 출력의 둘째 줄(min, max 등)은 줄였습니다.
다음 편