Twist와 TwistStamped
로봇에게 "이 빠르기로 가"는 어떻게 적을까?
Twist
속도를 직선과 회전으로 나눕니다
Twist의 linear는 직선 속도(m/s), angular는 회전 속도(rad/s)입니다. 로봇 기준으로 x는 앞, y는 왼쪽, z는 위쪽이고, angular.z가 양수면 반시계 방향(왼쪽)으로 돕니다.
두 칸
바퀴 로봇은 두 칸만 씁니다
TurtleBot3 같은 두 바퀴 로봇은 옆으로 미끄러지거나 뜰 수 없습니다. 그래서 앞뒤 속도 linear.x와 제자리 회전 angular.z 두 칸만 쓰고, 나머지는 0으로 둡니다.
값은 예시입니다. 초속 0.2 m로 가면서 초당 0.5 rad씩 돕니다.
섞어 보기
두 값을 섞으면 원을 그립니다
linear.x만 주면 곧게 가고, angular.z만 주면 제자리에서 돕니다. 둘을 함께 주면 앞으로 가면서 방향이 바뀌어 원을 그립니다.
공식 튜토리얼에서 거북이로 원을 그릴 때 쓰는 값도 x 2.0, z 1.8입니다.
TwistStamped
TwistStamped = Header + Twist
geometry_msgs/msg/TwistStamped는 4편의 Header에 Twist를 붙인 것입니다. 정의 파일도 std_msgs/Header header와 Twist twist 두 줄뿐입니다.
그래서 속도는 한 겹 안쪽 twist.linear.x에 들어갑니다. ros2 interface show geometry_msgs/msg/TwistStamped로 확인해 보세요.
로봇마다 다르다
turtlesim은 Twist, TurtleBot3는 TwistStamped
같은 "속도 명령"이라도 받는 쪽이 정한 타입으로 보내야 합니다. turtlesim의 /turtle1/cmd_vel은 Twist, Jazzy용 TurtleBot3의 /cmd_vel은 TwistStamped입니다.
TurtleBot3에 Twist를 보내면 타입이 달라 이어지지 않고, 로봇은 서 있기만 합니다.
14강 5편에서 ros2 topic info로 직접 확인합니다.
보낼 때
TwistStamped는 twist 안에 적습니다
ros2 topic pub으로 보낼 때 TwistStamped는 속도를 twist 안에 한 겹 더 넣습니다. header: auto는 Header를 지금 시각과 빈 frame_id로 채웁니다.
보내기 전에 ros2 topic type으로 타입부터 확인하세요. TurtleBot3에 보내는 것은 14강에서 합니다.
다음 편