Twist와 TwistStamped

3강에서 쓰던 명령을 그대로 쳤는데, 로봇이 꼼짝 않는다면?

증상

명령은 됐는데 로봇은 그대로

3강 6편처럼 ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.1}}"를 보내 봅니다. 터미널은 잘 보내고 있다고 말하는데, Gazebo 속 로봇은 움직이지 않습니다.

teleop은 꺼 두고 해 봅니다. 켜 두면 4편에서 본 대로 계속 0을 보냅니다.

두 타입

TwistStamped = Header + Twist

4강 5편에서 본 두 타입입니다. TwistStamped는 Twist 앞에 언제, 어느 좌표계 기준인지 적는 header를 붙인 것입니다. turtlesim은 Twist를, Jazzy용 TurtleBot3는 TwistStamped를 받습니다.

짝 맞추기

타입이 다르면 이어지지 않습니다

토픽 이름이 같아도 메시지 타입이 다르면 ROS는 퍼블리셔와 서브스크라이버를 잇지 않습니다(3강 3편). 눈에 띄는 오류 없이 조용히 안 되는 일이 많아서 더 헷갈립니다.

확인

topic info에 타입이 둘

이럴 때 ros2 topic info /cmd_vel을 칩니다(3강 5편의 습관). 타입이 하나면 Type: 뒤에 한 줄로 나오지만, 서로 다른 타입이 섞이면 목록으로 두 개가 보입니다. 누가 어느 타입인지는 -v를 붙여 봅니다.

화면 폭 때문에 Type 줄을 둘로 나눴습니다.

고치기

TwistStamped로 보내면 갑니다

메시지 타입을 TwistStamped로 바꾸고, 속도 값은 twist 안으로 한 겹 더 넣습니다. header는 비워 두면 기본값으로 채워집니다.

Ctrl+C로 끊어도 마지막 속도가 남습니다. 멈추려면 ros2 topic pub --once /cmd_vel geometry_msgs/msg/TwistStamped "{}"로 0을 한 번 보냅니다.

내 노드

코드에서도 타입을 맞춥니다

6강 8편의 Twist 노드를 TurtleBot3에 쓰려면 세 군데를 고칩니다. 가져오는 타입, 퍼블리셔 타입, 그리고 값을 넣는 자리(msg.twist.linear.x)입니다. 시각은 노드 시계로 찍습니다.

브리지 설정을 Twist로 바꾸는 길도 있지만(6편), 여기서는 기본 설정을 따릅니다.

다음 편

ROS 메시지는 Gazebo에 어떻게 닿을까요?

6편Gazebo 토픽은 어떻게 ROS로 올까? 14강 목록