ROS teleop 명령으로 R1mini 원격 조종하기

ROS에서 여러 노드들이 ros 메세지를 주고받기 위한 master의 위치를 지정하기 위해 ROS_MASTER_URI 를 설정하여야합니다. 보통 roscore가 실행되는 PC의 IP 주소라고 이해하면 됩니다. 자세한 내용은 다음 ROS wiki항목을 찾아보세요.

IP 주소 확인 #

먼저 내 PC와 로봇에 할당된 IP주소를 확인하기 위해 ifconfig 명령을 입력합니다.

아래 내용중에 192.168.1.## 부분이 라우터에서 할당된 IP주소입니다.

HOSTPC:~$ ifconfig
eno2: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether ##:##:##:##:##:##  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 367409  bytes 41452570 (41.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 367409  bytes 41452570 (41.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlo1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.25  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::d087:42:7297:6176  prefixlen 64  scopeid 0x20<link>
        ether ##:##:##:##:##:##  txqueuelen 1000  (Ethernet)
        RX packets 700080  bytes 633470367 (633.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 269370  bytes 80942881 (80.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ROS Master URI 설정 #

로봇과 PC 모두 bashrc 파일에 들어가주세요~

해당 파일 맨 아래에 (nano 에디터의 경우 alt+/ 단축키 활용) 아래 이미지의 export 문구를 추가합니다.

또는 터미널에 다음을 입력합니다.

$ echo "export ROS_MASTER_URI=http://192.168.1.25:11311">>~/.bashrc
$ echo "export ROS_HOSTNAME=192.168.1.25">>~/.bashrc
  • nano 에디터를 빠져 나갈 때는 ctrl+X –> Y –> Enter 순서로 진행합니다.

수정 된 bashrc 양 쪽 모두 source 해줍니다.

로봇 동작 시키기 #

[내 PC] roscore를 실행합니다.

hostpc:~$ roscore

[로봇 w/ssh] sudo chmod 666 /dev/tty* 명령으로 권한을 설정해줍니다.

r1mini:~$ sudo chmod 666 /dev/tty*

topic 확인하기 #

omo_r1mini_node에서 지원하는 메세지와 서비스 목록은 다음 링크를 참조하시기 바랍니다.

[로봇 w/ssh] omo_r1mini_bringup.launch 파일을 실행합니다.


r1mini:~$ roslaunch omo_r1mini_bringup omo_r1mini_bringup.launch

[로봇 w/ssh] 이 후, 로봇을 실행하는 터미널에서 이런 결과가 출력 되어야 합니다.

  • 위와 같은 메세지가 나타나지 않으면 CTRL+C를 누르고 omo_r1mini_bringup.launch를 다시 실행해주세요.

아래는 여기까지 진행한 후 현재 터미널 상황이구요.

  • roscore는 내PC에서, 로봇을 bringup하는 코드는 로봇에서 실행 된 상태입니다.

[내 PC] 다른 터미널을 하나 더 만들어줍니다.

[내 PC] rostopic list 명령으로 현재 publish/subscribe되는 메세지를 확인합니다.. (v는 발행 토픽과 구독 토픽을 정리하여 보여주는 옵션)

$ rostopic list -v

rosservice 명령 보내기 #

ROS의 service 기능을 사용하여 로봇에 특정한 명령을 내리거나 로봇의 상태를 요청할 수 있습니다. R1mini에서는 다음과 같은 서비스를 제공합니다.

rosservice list로 서비스 되는 명령들을 확인합니다.

$ rosservice list

service명령: set_led_color #

R1mini의 RGB led 색상을 바꾸는 명령입니다.

$ rosservice call /set_led_color "red: 250 
> green: 50
> blue: 50"

set_led_color 대신 save_led_color 명령을 보내면 색상 값이 eeprom에 저장되어 다시 부팅해도 동일한 색을 유지합니다.

$ rosservice call /save_led_color "red: 250 
> green: 50
> blue: 50"

service명령: battery_status #

battery 상태를 확인하는 명령입니다.

$ rosservice call /battery_status "{}"
  • 충전 시에는 10.5V 아래로 떨어지지 않도록 11~12V 사이를 유지해주세요.

service명령: set_buzzer #

r1mini에 내장된 부저를 켜고 끄는 명령입니다.
주의: 이 명령은 2021-12-1 배포된 펌웨어 V2.3부터 적용되었습니다. 펌웨어 업데이트 방법은 다음 문서를 참조하세요.
catkin_ws/src/omo_r1mini 에서 git pull 명령으로 업데이트하시기 바랍니다.

$ rosservice call /set_buzzer "set: true"
$ rosservice call /set_buzzer "set: false"

키보드 입력으로 로봇 조종하기 #

  • 참고 : 기어비 변경
  • 일단은 로봇의 테스트를 위해서 바퀴를 지면에서 띄우도록 합니다~

[로봇 w/ssh] omo_r1mini_bringup.launch를 실행합니다.

r1mini:~$ roslaunch omo_r1mini_bringup omo_r1mini_bringup.launch

[내 PC] roslaunch omo_r1mini_teleop omo_r1mini_teleop_key.launch를 실행합니다.

hostpc:~$ roslaunch omo_r1mini_teleop omo_r1mini_teleop_key.launch

[내 PC] teleop을 실행한 터미널을 활성화 해두면 키보드로 로봇을 움직일 수 있습니다.

데이터 #

수행 데이터를 확인하게 해주는 odom이라는 토픽이 있습니다.

명령을 준 부분과 수행하는 부분의 데이터 값 얼추 비슷한 것을 확인할 수 있습니다.

조이스틱으로 R1mini 조종하기 #

(2021/11/18 버전 이후부터 적용됩니다.)

omo_r1mini_teleop_joy.launch 를 실행하면 xbox 타입의 조이스틱으로 로봇을 조종할 수 있습니다.

패키지 설치를 위해 다음을 입력합니다.

hostpc:~$ sudo apt-get install ros-melodic-joy

joy_node 실행해보기 #

이 패키지를 실행하기 위해서는 joy_node가 정상적으로 동작해야 합니다.
터미널에 아래와 같이 입력하여 joy_node를 실행합니다.

$ roscore
$ rosrun joy joy_node
[ WARN] [1637499930.032725636]: Couldn't set gain on joystick force feedback: Bad file descriptor
[ INFO] [1637499930.035251970]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.

이제 joy 토픽을 읽어서 조이스틱 입력이 제대로 받아지는지 확인합니다.

$ rostopic echo joy
header: 
  seq: 224
  stamp: 
    secs: 1637499947
    nsecs: 376515561
  frame_id: "/dev/input/js0"
axes: [-0.0, -0.0, -0.0, -0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
---
  • axes는 스틱 입력을 -1.0~1.0 사이의 값으로 표현하고,
  • buttons는 각 버튼에 대한 값을 1또는 0으로 표현합니다.

모든 입력이 정상적이라면 cntrl+c 키를 눌러 joy_node를 중지하고 r1mini_bringup과 teleop_joy.launch를 실행합니다.

teleop_joy.launch 실행 #

omo_r1mini_teleop 패키지의 omo_r1mini_teleop_key.py 노드는 joy message를 subscribe하고 스틱입력과 버튼에 따라 /cmd_vel 메세지를 만들어 publish합니다.

r1mini:~$ roslaunch omo_r1mini_bringup omo_r1mini_bringup.launch
hostpc:~$ roslaunch omo_r1mini_teleop omo1mini_teleop_joy.launch

이제 조이스틱 조작을 통해 r1mini 로봇을 조종할 수 있습니다.
아래 그림은 조이스틱 명령으로 조작할 수 있는 항목을 표현한 것입니다.

  • 좌측 스틱: 전진/후진/좌/우 회전 명령을 만듭니다.
  • A버튼: cmd_vel 메세지를 publish하거나 끕니다.
  • X버튼: RGB LED의 색상을 무지개 색 순서로 전환합니다.
  • Y버튼: r1mini에 장착된 헤드라이트를 켜거나 끕니다.

joystick 문제해결 #

조이스틱이 동작하지 않습니까?

/dev/input/js0 를 찾을 수 없는 경우 알맞는 joystick 드라이버가 설치되지 않은것일 수 있습니다.
다음과 같이 입력하여 /dev/input에 어떠한 장치가 추가되었는지 확인해보세요.

$ ls /dev/input/

다음과 같은 목록이 나타나는지 확인합니다.

by-id    event11  event16  event20  event25  event3   event6  mice
by-path  event12  event17  event21  event26  event30  event7  mouse0
event0   event13  event18  event22  event27  event31  event8  mouse1
event1   event14  event19  event23  event28  event4   event9  mouse2
event10  event15  event2   event24  event29  event5   js0

만약 js0 등이 나타나지 않으면 xboxdrv를 설치해봅니다.

$ sudo apt-get install xboxdrv

그리고나서 해당 서비스를 실행합니다.

$ sudo systemctl enable xboxdrv.service
$ sudo systemctl start xboxdrv.service

캘리브레이션이 잘못된 경우 jstest-gtk 를 설치하여 조정할 수 있습니다.
다음과 같이 입력하여 패키지를 설치합니다.

$ sudo apt install jstest-gtk

윈도우 키를 입력하고 jstest를 실행하면 다음과 같은 화면이 나타납니다.

Properties를 선택하면 캘리브레이션 화면으로 이동합니다.
다음 화면에서 스틱 입력과 버튼을 캘리브레이션할 수 있습니다.