USB 조이스틱
조이스틱 입력을 ROS 2의 /joy 토픽으로 발행하고, teleop_twist_joy를 사용해 /cmd_vel 속도 명령으로 변환합니다. 변환한 속도 명령으로 turtlesim도 제어합니다.
이 실습은 ROS 2의 joy 패키지와 teleop_twist_joy 패키지를 사용합니다.
준비물
- Ubuntu 24.04와 ROS 2 Jazzy가 설치된 PC
- USB 또는 블루투스 조이스틱
패키지 설치
조이스틱 입력 노드, 텔레오퍼레이션 노드, turtlesim을 설치합니다.
$ sudo apt update
$ sudo apt install -y ros-jazzy-joy ros-jazzy-teleop-twist-joy ros-jazzy-turtlesim
조이스틱 장치 확인
조이스틱을 연결한 뒤 입력 장치 파일을 확인합니다.
$ ls /dev/input/js*
/dev/input/js0 /dev/input/js1
입력이 정상적으로 들어오는지 확인하려면 jstest 도구를 사용할 수 있습니다.
$ sudo apt install -y joystick
$ jstest /dev/input/js1
Driver version is 2.1.0.
Joystick ( USB Gamepad ) has 6 axes (X, Y, Z, Rz, Hat0X, Hat0Y)
and 12 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6).
Testing ... (interrupt to exit)
Axes: 0: 24998 1: 32767 2: 2364 3: 8445 4: 0 5: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 11:off
조이스틱 노드 실행
앞에서 확인한 장치 번호를 지정해 joy_node를 실행합니다. /dev/input/js1을 사용한다면 device_id는 1입니다.
$ ros2 run joy joy_node --ros-args \
-p device_id:=1 \
-p deadzone:=0.05 \
-p autorepeat_rate:=20.0
새 터미널에서 /joy 토픽을 확인합니다.
$ ros2 topic list
/joy
/joy/set_feedback
/parameter_events
/rosout
$ ros2 topic echo /joy --once
header:
stamp:
sec: 1783928158
nanosec: 985106107
frame_id: joy
axes:
- -0.0
- -0.0
- 0.5854714512825012
- 0.09246671944856644
- 0.0
- 0.0
buttons:
- 0
# (생략)
axes 배열은 위에서부터 0번, 1번, 2번 순서로 읽습니다. 위 예시처럼 2번과 3번 축 값이 변한다면 설정 파일에서도 axis_linear.x와 axis_angular.yaw에 2번, 3번 축을 사용해야 합니다.
속도 명령으로 변환
teleop_twist_joy는 /joy 입력을 받아 로봇 주행에 사용하는 /cmd_vel 메시지로 변환합니다.
앞에서 실행한 joy_node는 켜 둔 상태로 유지하고, 조이스틱 설정 파일을 만듭니다.
$ mkdir -p ~/joystick_config
$ nano ~/joystick_config/usb_gamepad.yaml
아래 설정은 /joy에서 값이 변하는 2번 축을 전후진, 3번 축을 회전에 사용합니다. 실습에서는 enable 버튼을 누르지 않아도 바로 확인할 수 있도록 require_enable_button을 false로 설정합니다.
teleop_twist_joy_node:
ros__parameters:
require_enable_button: false
axis_linear:
x: 2
scale_linear:
x: 1.0
scale_linear_turbo:
x: 1.0
axis_angular:
yaw: 3
scale_angular:
yaw: 1.5
scale_angular_turbo:
yaw: 1.5
새 터미널에서 teleop_node를 실행합니다.
$ ros2 run teleop_twist_joy teleop_node --ros-args \
--params-file $HOME/joystick_config/usb_gamepad.yaml
새 터미널에서 /cmd_vel 토픽을 확인합니다. 아래는 오른쪽 스틱을 오른쪽 위로 움직인 상태의 예시입니다.
$ ros2 topic echo /cmd_vel --once
linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.5
---
turtlesim 제어
조이스틱으로 turtlesim의 거북이를 움직여 봅니다.
첫 번째 터미널에서 turtlesim을 실행합니다.
$ ros2 run turtlesim turtlesim_node
두 번째 터미널에서 앞에서 만든 설정 파일로 teleop_node를 실행합니다. /cmd_vel을 turtlesim의 /turtle1/cmd_vel 토픽으로 리매핑합니다.
$ ros2 run teleop_twist_joy teleop_node --ros-args \
--params-file $HOME/joystick_config/usb_gamepad.yaml \
-r /cmd_vel:=/turtle1/cmd_vel
스틱을 움직이면 turtlesim 창의 거북이가 움직입니다.