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편), 여기서는 기본 설정을 따릅니다.
다음 편