본문 바로가기

Project/KUSMO

[KUSMO] 8/13 ~ 15 (Ubuntu 20.04 듀얼부팅, SLAM, Navigation, Simulation)

728x90

8/13

$ sudo apt update
$ sudo apt upgrade
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_noetic.sh
$ chmod 755 ./install_ros_noetic.sh 
$ bash ./install_ros_noetic.sh
  • Remote PC에 ROS Noetic 설치
  • apt update는 실제로 system을 update하는 것이 아닌 설치 가능한 package lists를 최신화 
  • apt upgrade는 위에서 확인한 최신 버전으로 packages를 실제로 update 진행 

 

$ sudo apt list			// 현재 설치된 list를 불러옴
$ sudo apt list --upgradable	// 현재 설치된 list중에서 업그레이드가 가능한 목록 표시

* 위 두 명령어를 통해 현재 list를 확인할 수 있다

 

$ sudo apt-get install ros-noetic-joy ros-noetic-teleop-twist-joy \
  ros-noetic-teleop-twist-keyboard ros-noetic-laser-proc \
  ros-noetic-rgbd-launch ros-noetic-rosserial-arduino \
  ros-noetic-rosserial-python ros-noetic-rosserial-client \
  ros-noetic-rosserial-msgs ros-noetic-amcl ros-noetic-map-server \
  ros-noetic-move-base ros-noetic-urdf ros-noetic-xacro \
  ros-noetic-compressed-image-transport ros-noetic-rqt* ros-noetic-rviz \
  ros-noetic-gmapping ros-noetic-navigation ros-noetic-interactive-markers
  • ROS 의존 패키지들 설치

 

$ sudo apt install ros-noetic-dynamixel-sdk
$ sudo apt install ros-noetic-turtlebot3-msgs
$ sudo apt install ros-noetic-turtlebot3
  • Debian Packages를 통해 TurtleBot3 설치

 

- Network Configuration

$ sudo apt install net-tools
  • install net tools to use ifconfig

 

ifconfig

 

  •  노트북의 IP Address(192.168.0.3)

 

  • gedit 설치 후 실행
$ sudo apt install gedit
$ gedit ~/.bashrc

change local host to pc`s ip address

 

$ source ~/.bashrc
  • 변경사항 저장

* 원격으로 접속하여 쉘 기반의 텍스트 에디터를 사용할 수 밖에 없는 경우는 nano 편집기(editor) 사용

$ nano ~/.bashrc

 

 

1) SBC Setup

  • ROS Noetic Image file 저장 후 압축 해제
  • Raspberry PI Imager를 이용해 굽고 그 파일을 SD카드에 넣음
  • GParted GUI tool을 키고 아래 과정을 통해 Partition Resize 진행 

출처 : https://emanual.robotis.com/docs/en/platform/turtlebot3/sbc_setup/

 

- WiFi Network 설정

$ cd /media/$USER/writable/etc/netplan
  • 새 터미널 창을 열고 SD카드의 netplan directory로 이동
  • Netplan은 linux system에서 networking configuration에 사용하는 command line utility로써, network interface 구성 시 yaml 파일을 사용함
  • yaml은 구성 파일(Configuration File) 작성에 자주 사용되는 Data Serizlize(직렬화) 언어
    • Data Serialize는 다양한 종류의 데이터를 일정한 형식으로 직렬화하여 데이터의 손실을 방지하는 방식
    • Configuration File이란 OS 또는 프로그램의 설정을 저장, 수정 또는 제어하는데 사용되는 파일

 

$ sudo nano 50-cloud-init.yaml

  • nano editor 실행 후 WIFI_SSID를 현재 사용중인 wifi의 이름으로 바꾸고 WIFI_PASSWORD를 현재 wifi의 비밀번호로 바꿈
  • Ctrl + S로 저장 후 Ctrl + X로 editor를 나옴
$ sudo netplan generate
$ sudo netplan apply
  • 변경사항 적용

 

- Raspberry PI에 SD카드 삽입 후 실행

  • 초기 ID는 ubuntu, 비밀번호는 turtlebot
  • 터미널 창을 연 후 아래 과정 수행

 

- ROS Network Configuration

$ ifconfig
  • Raspberry PI의 WiFi 주소 확인

 

$ gedit ~/.bashrc
  • bashrc 파일을 연 후 ROS_MASTER_URI와 ROS_HOSTNAME 설정 부분을 아래 처럼 수정
export ROS_MASTER_URI=http://{IP_ADDRESS_OF_REMOTE_PC}:11311
export ROS_HOSTNAME={IP_ADDRESS_OF_RASPBERRY_PI_3}
$ source ~/.bashrc
  • 수정사항 저장

 

- LDS-02 Configuration (Lidar Sensor)

$ sudo apt update
$ sudo apt install libudev-dev
$ cd ~/catkin_ws/src
$ git clone -b develop https://github.com/ROBOTIS-GIT/ld08_driver.git
$ cd ~/catkin_ws/src/turtlebot3 && git pull
$ rm -r turtlebot3_description/ turtlebot3_teleop/ turtlebot3_navigation/ turtlebot3_slam/ turtlebot3_example/
$ cd ~/catkin_ws && catkin_make
  • LDS-02 driver 설치, TurtleBot3 package update
  • git clone과 rm 명령이 이미 되어 있음. 앞의 과정에서 진행된 내용들이라 생각됨

 

$ echo 'export LDS_MODEL=LDS-02' >> ~/.bashrc
$ source ~/.bashrc
  • LDS-02 모델을 bashrc 파일에 export
  • echo는 주어진 문자열을 터미널에 출력하는 명령어로써, 위 명령어는 'export LDS_MODEL=LDS-02' 를 bashrc 파일에 씀

- SBC Setup 완료

 

 

2) OpenCR Setup

  • Raspberry Pi와 OpenCR를 서로 연결한 후 진행
$ sudo dpkg --add-architecture armhf
$ sudo apt-get update
$ sudo apt-get install libc6:armhf
  • OpenCR firmware를 upload하기 위해 필요한 packages를 Raspberry Pi에 설치
  • dpkg는 Debian Package를 관리할 때 사용하는 명령어

 

$ export OPENCR_PORT=/dev/ttyACM0
$ export OPENCR_MODEL=waffle_noetic
$ rm -rf ./opencr_update.tar.bz2
  • OpenCR Port와 로봇의 Model 설정

 

$ wget https://github.com/ROBOTIS-GIT/OpenCR-Binaries/raw/master/turtlebot3/ROS1/latest/opencr_update.tar.bz2 
$ tar -xvf opencr_update.tar.bz2
  • Firmware와 loader 다운로드, 파일 추출

 

$ cd ./opencr_update
$ ./update.sh $OPENCR_PORT $OPENCR_MODEL.opencr
  • Firmware를 OpenCR에 upload

 

3) Bringup

$ roscore
  • 노트북에서 roscore 실행 (하나의 node 새로 실행)

 

$ ssh ubuntu@{IP_ADDRESS_OF_RASPBERRY_PI}
  • 새로운 terminal창을 연 후 라즈베리파이와 ssh 통신

 

$ export TURTLEBOT3_MODEL=${waffle_pi}
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
  • TurtleBot3 application를 시작하기 위한 basic packages를 bringup
  • OpenCR을 구동시켜 모터 제어 환경 구성 -> Odometry 계산 수행 준비

 

 

4) Teleoperation(원격 조종) 사용

$ export TURTLEBOT3_MODEL=${waffle_pi}
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
  • 노트북에서 키보드를 사용한 teleoperation 을 위해 turtlebot3_teleop_key node launch 
  • 첫번째 export 명령어는 아래처럼 TURTLEBOT3_MODEL paramater를 .bashrc file에 미리 선언함으로써 생략할 수 있다
$ echo 'export TURTLEBOT3_MODEL=waffle_pi' >> ~/.bashrc
$ source ~/.bashrc
  • Node가 정상적으로 launch됐을 시 아래와 같은 화면이 나옴

a, w, s, d, x로 로봇 조종 가능

 

 

8/14

- SLAM 진행 

  • SLAM(Simultaneous Localization and Mapping)이란? : 동시적 위치추정 및 지도작성을 의미하는 SLAM은 임의 공간에서 이동하며 그 공간의 지도를 그리고 현재 위치를 추정하는 기술이다
$ roscore
  • roscore 실행

 

$ export TURTLEBOT3_MODEL=${waffle_pi}
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
  • bringup 진행

 

$ ssh ubuntu@192.168.0.25
$ export TURTLEBOT3_MODEL=${TB3_MODEL}
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
  • 새 terminal 창을 연 후 Raspberry Pi의 IP주소를 통해  ssh 통신
  • Raspberry Pi에 TURTLEBOT3_MODEL parameter 설정 후 기본 packages bringup

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_slam turtlebot3_slam.launch
  • 다시 새 terminal 창 실행 후 SLAM node를 launch
  • 여기서도 마찬가지로 .bashrc 파일에 TURTLEBOT3_MODEL parameter를 저장할 수 있다
$ echo 'export TURTLEBOT3_MODEL=waffle_pi' >> ~/.bashrc
$ source ~/.bashrc

 

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
  • teleop 실행 후 로봇 조작

 

SLAM using teleoperation

 

$ rosrun map_server map_saver -f ~/map
  • map_saver node를 launch시켜 작성된 map 저장
  • 작성된 map은 map_saver node가 launch된 directory에 저장됨 
  • -f는 파일이 저장될 위치와 파일의 이름을 지정함

 

  • map은 로봇의 Odometry, TF, 와 Lidar로 scan한 data를 토대로 그려짐
    • Odometry : 주행기록계라는 뜻으로 시간에 따른 위치 변화를 추정하는 개념으로, GPS와 같은 절대적 위치가 아닌 출발 지점으로부터의 상대적인 위치를 추정한다. Motor의 Encoder의 회전수를 통해 거리를 측정하고, IMU센서를 통해 기울기를 측정하여 로봇의 위치 추정
    • IMU(Inertial Measurement Unit) Sensor : 관성을 측정하여 물체가 기울어진 각도를 측정함
    • TF(Transform) : 좌표변환이라는 뜻으로 scan data 변환을 위해 사용됨. (추가 공부후 작성)

 

 

8/15

- Navigation 진행

  • Navigation : 주어진 환경에서 로봇을 특정 위치로 옮기는 것. 앞서 SLAM으로 만든 기하학적 정보를 포함한 map 활용. 로봇의 Encoder, IMU sensor, Distance 센서를 통해 Navigation 수행

 

$ roscore
$ ssh ubuntu@{IP_ADDRESS_OF_RASPBERRY_PI}
$ export TURTLEBOT3_MODEL=${TB3_MODEL}
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
  • 노드 생성 ~ bringup

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
  • Navigation launch

 

 

1. Estimate Initial Pose

  • 위 과정은 AMCL parameter를 초기화하는, Navigation에서 매우 중요한 과정이므로 Navigation 실행 전에 수행해야 함
    • AMCL : 2차원으로 움직이는 로봇의 위치를 확률적으로 파악하는 system으로서 입자 필터를 사용하여 지도상에서 로봇의 자세를 추적함

1) Rviz 상단의 '2D Pose Estimate' 클릭

2) Map 상에서 로봇이 실제로 있는 위치를 클릭한 후 로봇의 정면이 바라보고 있는 방향으로 녹색 화살표 지정

3) Lidar 센서의 데이터가 map에 덮어질 때까지 1~2 반복

4) teleoperation node launch

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

5) 로봇을 조금씩 움직이며 주변 환경의 정보를 수집하여 기존 map과 matching 해가며 로봇의 추종된 위치를 줄임. 이 과정에서 녹색 화살표들이 줄어듦. 이는 확률이 점점 수렴함을 의미. (녹색 화살표는 로봇이 위치하고 있을 확률을 표시)

출처 : https://emanual.robotis.com/docs/en/platform/turtlebot3/navigation/

6) Ctrl + C로 teleop를 끔. Navigation Package에서 publish하는 로봇의 병진/회전 속도와 teleop의 병진속도/회전속도가 섞임 (같은 message가 섞임). Message는 노드 간 통신시 사용하는 format

 

2. Set Navigation Goal

1) 상단의 '2D Nav Goal' 클릭

2) 로봇을 보낼 목적지를 클릭하고 도착 후 로봇이 바라볼 방향으로 화살표 지정

  • 화살표의 root 부분은 목적지의 x, y축이고 angle 'θ'는 화살표의 방향에 따라 결정됨
  • 위의 3가지가 결정되면 로봇이 움직임

 

- Simulation 진행

1. Gazebo Simulation

  • Gazebo는 로봇 개발에 필요한 3D simulation을 위한 robot, sensor, environment model등을 지원하고 물리 엔진을 탑제하여 실제와 근사한 결과를 얻을 수 있는 3D Simulator
  • Gazebo는 ROS Gazebo package를 사용하므로 Gazebo version에 맞는 ROS1 Noetic이 설치되어 있어야 함
$ cd ~/catkin_ws/src/
$ git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
$ cd ~/catkin_ws && catkin_make
  • TurtleBot3 Simulation Package는 turtlebot3, turtlebot3_msgs package가 전제 조건으로 필요함
  • catkin workspace의 src 폴더에 Simulation package 설치

* 총 3개의 Simulation World 사용 가능(한 World에서 다른 World를 사용하려 할 시 전에 사용했던 World를 완전히 종료시켜야 함)

1) Empty World
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

 

2) TurtleBot3 World
$ export TURTLEBOT3_MODEL=waffle
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch

 

3) TurtleBot3 House
$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_house.launch
  • 위 3가지 World중 하나를 실행시킨 후 teleop로 로봇 구동

 

2. SLAM Simulation

  • 앞선 3가지 World중 하나를 선택한 후 진행 (SLAM으로 mapping을 진행할 시엔 TurtleBot3 World나 TurtleBot3 House가 적합함)
$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
  • 새로운 terminal 창 실행 후 SLAM node 실행
  • Gmapping SLAM method가 기본적으로 설정되어 있음 

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
  • teleop 실행 후 로봇 구동
SLAM Simulation in TurtleBot3 World

 

$ rosrun map_server map_saver -f ~/map
  • Mapping 완료 후 map 저장

 

3. Navigation Simulation

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
  • SLAM Simulation과 마찬가지로 Gazebo의 3가지 Worlds중에 하나 선택

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
  • Run Navigation Node

 

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/gazebo_map.yaml
  • 앞의 Navigation에서와 동일하게 Initial Pose Estimate 후 teleop를 통해 로봇을 구동시켜 추종 위치의 확률을 수렴시킴
  • 이후 teleop 종료 후 '2D Nav Goal'을 통해 로봇을 이동시킴

 

 

  • Navigation 진행 시의 TF Tree와 Node Graph

 

 

 


참고자료 : 

https://emanual.robotis.com/docs/en/platform/turtlebot3/slam/

 

ROBOTIS e-Manual

 

emanual.robotis.com

https://blog.naver.com/PostView.naver?blogId=ycpiglet&logNo=222139215170&categoryNo=139&parentCategoryNo=0 

 

[ROS] Odometry(오도메트리, Odom)란 무엇인가?

Odometry : (차의) 주행 거리 측정 시간에 따른 위치 변화를 추정하기 위해 모션 센서의 데이터를 사용하...

blog.naver.com

http://wiki.ros.org/

 

Documentation - ROS Wiki

ROS (Robot Operating System) provides libraries and tools to help software developers create robot applications. It provides hardware abstraction, device drivers, libraries, visualizers, message-passing, package management, and more. ROS is licensed under

wiki.ros.org

https://www.youtube.com/watch?v=zasvSKaobVI&t=355s