2017년 4월 2일 일요일

#PLAY TURTLEBOT(ROS) IN REAL WORLD #실제로 TURTLEBOT을 실행시켜보자!



오늘은 학교에서 터틀봇을 이용하여 기본적인 예제를 직접 로봇에 적용하여 움직여보는 실습을 하게 되었다.

명령어들을 정리하여보자.

먼저, 환경설정을 알아보자.
<Hardware>
1) Raspberrypi3 with Ubuntu Mate 16.04
2) laptop with Ubuntu 16.04 Xenial
3) Asus camera
4) Lidar
5) Turtlebot
6) logitech lidar trace camera

<Software>
1) Ubuntu Mate 16.04(Raspberrypi3)
2) Ubuntu 16.04 Xenial
3) Ros kinetic (라즈베리파이3과 랩탑 모두에 설치)

자, 이제부터 실행 명령어들을 알아보자.
아, 실행전에 2017-03-31 기준으로 kinetic에서 turtlebot관련 package가 기본으로 깔리진 않는다. 따라서 다음의 명령어를 실행해주자.

$ sudo apt-get install ros-kinetic-turtlebot*

ros의 명령들을 찾고 싶다면 sudo apt-get install ros-kinetic "tab"키를 이용하여 찾아 설치하도록 하자.

-----------------------------------------------------------------------------------------------------------

먼저, 라즈베리파이3을 살펴보자.(라즈베리파이3에 Ros가 완전설치 완료후)
첫번째, usb 설정을 해주자. 왜냐면, usb의 이름이 우리가 알아볼 수 있는 이름으로 설정해두고 쓰는 것이 좀 더 진행에 있어서 수월하기 때문!

$ sudo vi /etc/udev/rules.d/71-kobuki.rules
#참고로,없는 파일을 임의로 생성해주는 것으로, 파일이름은 아무거나해도된다.
하지만, 앞의 숫자는 임의로 붙여주고 뒤엔 파일의 설명이나 이름을 적어주는 것이 나중에 이해하고 찾기 쉽다.(규칙을 지키는 것이 수월하다.)






#아래 내용을 추가해준다.

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="kobuki*", MODE:="0666", GROUP:="dialout", SYMLINK+="kobuki"

혹은, ros wiki에서는 다음과 같은 방법을 설명해주고 있다.
For convenience, to enable the device to appear on /dev/kobuki, use the following script to copy across the udev rule and restart udev (you'll need your sudo password):

$ rosrun kobuki_ftdi create_udev_rules
$ udevadm control --reload


그리고
$ sudo vi /etc/udev/rules.d/70-rplidar.rules
# 아래 내용을 추가해준다.

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"


다음과 같이 설정하고 나면,
$ cd /dev

$ find -name '*rplidar'

$ find -name '*kobuki'

#검색을 통해 장치가 올바르게 설정되었는지 확인하자.

-----------------------------------------------------------------------------------------------------------

이제,환경설정을 해보자

$ cd ~
$ sudo vi .bashrc

ros가 정상 설치되었다면, 아래쪽에 다음과 같이 설정이 되어 있을 것이다.
이 설정을 다음과 같이 바꾼다.
이 설정을 바꿀 때에는,
[라즈베리파이설정]
1) ifconfig를 통해 라즈베리파이3의 현재 와이파이 주소를 확인한다.
2) 그 주소를 라즈베리파이의 ROS_MASTER, ROS_IP로 설정한다.
(http://는 없애지 않는걸로 한다. 없으면 작동 x)
만약, 다음과 같이 192.168.0.11 이 라즈베리파이의 주소라면,http://192.168.0.11:11311로 ROS_MASTER를 설정한다.

[노트북설정]
1) ifconfig를 참조해 ROS_IP는 본인의 IP로 설정한다.
(참고로, ROS_HOSTNAME를 없애고 ROS_IP로 명시하도록 하는 걸 권장한다. 같은 의미지만 오류가 나는 경우가 있으므로.)
2) ROS_MASTER_URI는 로봇과 통신연결을 해 줄 라즈베리파이3의 IP로 설정한다.
따라서 다음과 같이 설정할 수 있다.


 tip. 라즈베리파이에선 로그인상태를 만들지 않는 것이 좋다.
하지만 사용자 권한은 존재하는 것이 좋으므로 사용자 비밀번호를 가지고 있으되, 로그인을 auto상태로 바꿔주자.
(System Setting/User Account)















  1. Go to User Accounts and select the user in question.(right upside_unlock)
  2. Switch the Automatic Login field to the ON position.
-----------------------------------------------------------------------------------------------------------

자, 이제 방화벽을 해제 해보자.
[라즈베리파이3]
$ ssh localhost #작동하는지 확인해보자. 참고로, 실행하지 않아도 좋다.
$ sudo raspi -config

다음과 같이 ssh 설정을 해주고
[PC]
$ ssh 컴퓨터이름@연결할 ip주소
ex ) $ ssh hhh@192.168.0.11
위 명령어가 실행되고 비밀번호를 알맞게 입력해준뒤에도 오류가 난다면
[라즈베리파이3]
$gufw #open the firewall with gui.
이 명령어를 실행시켜서 라즈베리파이의 방화벽을 끄도록 하자.(대부분은 하지 않아도 가능하다.)

[라즈베리파이3]
1$ roscore
2$ roslaunch turtlebot_bringup minimal.launch
실행시 띠로릭-하고 소리가 난다.

-----------------------------------------------------------------------------------------------------------

자, 이제 3D_Sensor를 설정해보자.
3$ env | grep TURTLEBOT_3D*
명령어를 통해 다음과 같이 확인한다.





kinect를 사용한다면 그대로 유지하고, 만약 나와같이 ASUS 카메라등 다른 기종을 쓴다면 따로 설정을 해주어야 한다. 앞으로 카메라를 계속 쓰일 것이니 아예 .bashrc파일을 고쳐주자.

[라즈베리파이3]
3$ vim ~/.bashrc
export TURTLEBOT_3D_SENSOR=asus_xtion_pro
를 추가해주자.
3$ source ~/.bashrc
3$ roslaunch turtlebot_bringup 3dsensor.launch

[PC]
1$ roslaunch turtlebot_teleop keyboard_teleop.launch
2$ rviz
자, 이제 로봇을 조종해보자.

-----------------------------------------------------------------------------------------------------------

참고로, 라즈베리파이와의 통신을 종료시킬때!
[PC]
$ sync
명령어를 여러번 실행시켜준 다음,
$ exit

-----------------------------------------------------------------------------------------------------------

다음으로 지도를 만들어보자.
[라즈베리파이3]

1$ roscore
2$ roslaunch turtlebot_bringup minimal.launch 

[PC]
3$ roslaunch turtlebot_teleop keyboard_teleop.launch
4$ rviz
5$ roslaunch turtlebot_navigation gmapping_demo.launch #여기에서 Asus Xtion을 불러오고있다. 따라서, 따로 3dsensor.launch를 부를필요 x
# 만약 여기서 혹은 rviz에서 오류가 난다면





위의 요소들이 value값들을 모두 "true"로 바꾼다.
[PC]
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
이제, 키보드를 움직여 원하는 장소를 돌아다니며 맵을 생성하자.

[라즈베리파이3]
6$  rosrun map_server map_saver -f /tmp/my_map
pc에 저장할 수도 있지만, 나중에 amcl 실행시에 로봇상에 있는 것이 좀 더 효율적임. 따라서 라즈베리파이에 저장하자.

***만약 pc상에 생성했다면 생성된 맵을 security-ftp로 보내보자!
[PC]
$ sftp hhh@192.168.0.11

[라즈베리파이3]
$ export TURTLEBOT_MAP_FILE=/tmp/my_map
$ roslaunch turtlebot_navigation amcl_demo.launch

[PC]
$ roslaunch turtlebot_rviz_launchers view_navigation

-----------------------------------------------------------------------------------------------------------

자, 다음으로는 RPLidar를 이용해서 지도를 생성해보자.
[라즈베리파이3]
$ cd ~/catkin_ws/src/
$ git clone https://github.com/robopeak/rplidar_ros
$ cd ~/catkin_ws
$ catkin_make
$ roslaunch rplidar_ros rplidar.launch

[PC]
$ rviz

2D scan data 확인해보자.
[라즈베리파이3]
$ udevadm info --name=ttyUSB[0,1] #장치이름 확인가능
$ udevadm info --name=ttyUSB1


$ sudo -s
$ roscd turtlebot_description
$ cd urdf
$ sudo vi turtlebot_library.urdf.xacro

안의 내용을 amcl에 나오는 화면과 로봇의 싱크를 맞춰서 조절해준다.
어떻게?
<joint name="laser" type="fixed">
  <origin xyz="0.06 0.00 0.37" rpy="0 3.14159 0"/>
...
xyz는 기본 3d좌표계이고,
rpy는 rol pitch yo로 공간좌표계를 말하는 걸로 차례대로 x회전축 y회전축 z회전축이다.


그리고, /scan토픽의 충돌방지를 위해 수정해준다.
$ roscd turtlebot_bringup
$ cd launch
$ vi 3dsensor.launch

<arg name="scan topic" default="scan"/>
-> <arg name="scan_topic" default="xtion_pro_scan"/>으로 바꾼다.

&&&

rplidar실행을 위해서 minimal.launch를 아래의 내용을 복사하여 적절히 수정한다.
$ roscd turtlebot_bringup
$ cd launch
$ vi minimal.launch

 <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen">
 <param name="serial_port" type="string" value="rplidar"/>
 <param name="serial_baudrate" type="int" value="115200"/>
 <param name="frame_id" type="string" value="base_laser_link"/>
 <param name="inverted" type="bool" value="true"/>
 <param name="angle_compensate" type="bool" value="true"/>
</launch>

$ roslaunch turtlebot_bringup minimal.launch
$ rosrun rviz rviz

-----------------------------------------------------------------------------------------------------------

추가적으로 usb_webcam을 사용해보자.

참고로, 현재 usb_cam을 공식적으로 제공하는 버전은 jade까지이다.
따라서 kinetic버전을 사용하는 사용자는 따로 방법을 찾아보아야한다. 찾은 두 가지 방법으로는
1)
$ mkdir -p ~/catkin-ws/src
$ cd ~/catkin-ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ..
$ catkin_make
$ source ~/catkin-ws/devel/setup.bash
다음에
$ roscd usb_cam
위의 명령어가 실행된다면 아무문제없이 usb_cam을 사용할 수 있지만 본인같은 경우는 OpenCV문제에 걸리게 되어서..
몇 시간을 헤매게 되었다지요!
2)
$ sudo apt-get install ros-kinetic-video-stream-opencv 
를 실행시킨 다음,

$ mkdir -p ~/catkin-ws/src
$ cd ~/catkin-ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ..
$ catkin_make
$ source ~/catkin-ws/devel/setup.bash

1)의 행동을 실행하게되면 해결되는 경우가 있습니다.

+ 참고로 노트북에서 웹캠이 탑재된 경우는
$ roscd usb_cam
$ cd launch
$ vim vim usb_cam-test.launch


위에서 세 번째 줄 쯤에 "video_device"의 "value"값을 /dev/video0 -> /dev/video1로 바꾸어주자.
물론, 본인의 장치를 컴퓨터에 인식시켜서 /dev안의 값이 바뀌는지 확인해서 작성해주어야한다. 이런 이름을 찾아야 되는 번거로운 일을 피하기 위해서 우리는 위에서 인식되는 usb의 이름을 바꾸는 작업을 실행해보았다.

댓글 없음:

댓글 쓰기