Ch3 ROS 개발환경 구축
1-1) ROS 한줄 설치
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_kinetic.sh
- ROS 한줄 설치 방법
- wget(Web Get)은 web상의 단일 file을 download받아 현재 folder에 저장할 때 사용
- http://wiki.ros.org/noetic/Installation
- http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment
1-2) ROS 수동 설치
$ sudo apt install chrony
$ sudo ntpdate ntp.ubuntu.com
- NTP(Network Time Protocol) 설정을 위해 chrony 설치
- 설치 후 ntpdate 명령어를 통해 ntp server 지정
- Server와 Computer의 현재 시간 오차를 표시해주어 설정한 서버 시간에 맞추게 됨
- 서로 다른 PC간에 같은 NTP server를 지정함으로써 시간 오차를 최소한으로 줄임
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
- Source list(ros-latest.list)에 ROS 저장소(packages.ros.org)를 추가하여 computer에서 해당 저장소로부터의 software를 허용하게 함
$ sudo apt install curl
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
- curl 설치
- curl (Client URL) : 다양한 통신 protocol을 이용하여 command line이나 source code로 server와 통신할 수 있게 하는 기술. 다양한 command line tool과 library를 지원한다
- ROS 저장소로부터 package를 내려받기 위해 공개 key 추가
$ sudo apt update && sudo apt upgrade
- Source list에 package 저장소의 주소를 추가하였으므로 package list를 다시 indexing하고, ROS 설치 전에 설치된 ubuntu 관련 package들 최신화
- sudo apt update : 등록된 apt repository의 package list가 저장되어 있는 apt-cache(캐쉬 목록)를 repository로부터 update 해줌
$ sudo apt install ros-noetic-desktop-full
- Desktop용 ROS package들 설치 (2D/3D simulator, 2D/3D perception package들 포함)
$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
- ROS_ROOT, ROS_PACKAGE_PATH등의 여러 환경 변수들이 정의되어 있는 환경설정 파일을 불러옴
$ sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
- Package를 build하기 위해 필요한 dependency들 설치
$ sudo apt install python3-rosdep
$ sudo rosdep init
$ rosdep update
- rosdep 설치 후 초기화
- rosdep은 compile이나 ROS상의 core component들을 구동하는데 필요한 system dependency들을 찾아 손쉽게 설치할 수 있게 하는 도구
- 기본 설정 외에 추가 항목들
- alias는 별칭이라는 뜻으로, Linux에서 사용자가 명령어를 다른 이름으로 바꿔 사용할 수 있는 쉘 내부 명령어
- ROS에서 자주 사용하는 긴 명령어들을 eb, sb등의 별칭으로 등록해놓음
$ sudo apt install gedit
- 문서 file 편집을 위한 gedit 설치
$ gedit ~/.bashrc
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOSTNAME=localhost
#export ROS_MASTER_URI=http://192.168.1.100:11311
#export ROS_HOSTNAME=192.168.1.100
$ source ~/.bashrc
- gedit을 통해 bashrc 파일을 연 후 맨 아랫줄에 사용할 network 정보 입력
- source ~/.bashrc를 통해 변경사항 적용
- Master - Host 통신시 localhost에는 computer의 IP 주소 입력
$ sudo apt install net-tools
$ ifconfig
- ifconfig 명령어를 통해 아래와 같은 현재 computer의 IP 주소값을 알 수 있다. (eth은 유선, wlan은 무선)
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
- mkdir 사용시 '-p' 옵션은 중간 경로까지 모두 자동으로 생성해줌
- ROS는 catkin이라는 ROS 전용 build system을 사용함
$ catkin_make
- Package compile
- Compile 후 위와 같이 build, devel 두개의 folder가 생성됨
- build : catkin build system의 build 관련 file(모든 object file(Compile을 통해 2진수로 변환된 file)과 artifact(산출물)) 저장
- devel : build 후 실행 관련 file 저장. Build target이 설치되기 전 위치하는 folder로 package 설치 전 executable, libraries가 위치함 (msg, srv header file과 사용자 package library, 실행 file 저장)
- src : 사용자 source code를 저장하는 공간. 이 folder에 여러 package를 넣고 build할 수 있다
$ export | grep ROS
- grep 명령어를 통해 ROS의 환경 설정을 알 수 있다
- grep 명령어는 입력으로 전달된 file에서 특정 문자열을 찾을 때 사용
- ROS 동작 테스트
$ source ~/catkin_ws/devel/setup.bash
$ roscore
- Catkin build system 관련 환경 파일을 불러온 후 master node 실행
- 특정 workspace를 shell에서 사용하기 위해선 setup.bash를 불러와야 함
$ rosrun turtlesim turtlesim_node
- 터미널 창을 새로 연 후 위 명령어 실행 (터미널 하나에서 하나의 프로세스만 가능)
- turtlesim node 실행
- turtlesim은 ros_tutorials repository 하위에 속해있는 ROS tutorial package로, ROS를 처음 접하는 사용자들에게 튜토리리얼을 제공하기 위해 제작된 학습용 package임
$ rosrun turtlesim turtle_teleop_key
- teleop 실행 후 노트북의 키를 입력하여 거북이를 움직임
$ rosrun rqt_graph rqt_graph
- ROS에서 사용 가능한 IDE : https://wiki.ros.org/IDEs 각종 IDE 환경 설정법
- Qtcreator + Qt Creator Plugin for ROS : 가장 추천하는 IDE. ROS에서는 많은 프로그램들을 qt 기반으로 짜 놓음(GUI toolbox인 rqt가 qt base로 짜여진 프로그램). 큰 프로젝트에서 보통 사용
- Qt : GUI Program 개발에 자주 쓰이는 cross platform framework
- Visual Studio Code + ROS Extension : 위에 비해 가볍고 빠름. 사용시 큰 문제는 없음. ROS Extension 설치 후 사용. 작은 프로젝트에서 주로 사용
- Eclips : 많은 사람들이 사용하지만 무거움
Ch 4. ROS의 중요 컨셉 (중요. 이 개념을 이해해야 프로그래밍에 큰 무리가 없음)
- 가장 중요한 ROS의 3가지 용어
- Node
- ROS의 대표적인 특징. 최소 단위의 실행 가능한 process, 프로그램을 의미. ROS package의 실행파일.
- 각 과정이 나눠져 있어 다른 사람이 가져다 쓰기 편함 (ROS는 Open Source). 기존의 기능을 가져온 후 새로운 내용 추가 가능.
- ROS에서는 기본적으로 프로그램을 node로 짜게 되어있으며. 개발자 임의대로 node를 나눌 수 있음
- ex) 안면인식장치 개발 (카메라로 raw data(영상)을 받은 후 필터로 후처리를 통해 사람을 구별, 직원이면 문을 염)
- Raw data(가공되기 전의 최초의 측정 자료) 받기 -> Filter 1 -> Filter 2 -> ... -> 문 열기 의 각 과정이 하나의 프로세스
- 즉, 위의 각 과정들이 하나의 node가 됨. 혹은 filter 1~3을 하나의 node로 만들 수도 있음
- 각 node의 data는 message 통신을 통해 주고 받음
- 사용자가 이미 실행중인 node를 같은 network에서 실행시키면 이전에 실행됐던 node는 종료됨
- Package
- 하나 이상의 node 혹은 node 실행을 위한 정보 등을 묶어놓은 것. 2018년 기준 5천개 정도가 있음
- Message
- Node간의 통신 형태
- Message를 통해 node간의 data를 주고 받음. 변수 형태로, integer, floating point, boolean등의 상당히 많은 종류가 있음
- Topic, Service, Action의 종류가 있다 (90% 이상의 ROS Program은 Topic 사용)
- Topic : 연속성을 가진 단방향, 비동기 통신(1:1부터 다:다 통신 가능). 센서 데이터 전송 시 많이 사용
- Publisher : Message 발신 node. Publisher는 정해진 수인인(Subscriber)이 없다
- Subscriber : Message 수신 node
- Topic Message 통신은 Publisher나 Subscriber node가 중지하지 않는 이상 messgae를 계속해서 publish하고 subsrcibe 한다
- Service : 양방향 통신. Topic과 다르게 일회성, 동기 통신 (결과값 전송 후 접속이 끊겨 다시 보내려면 재접속 필요)
- Server : Service 발신 node. Client의 request가 있을 때만 reponse함 ex) Robot 이동 관련 process 처리 후 도착했음을 client에 알림
- Client : Service 요청 node. ex) Robot에 특정 좌표로 이동을 명령
- 로봇에 특정 동작 수행을 명령하거나 특정 조건에 따라 이벤트를 발생해야 할 node에 사용
- 일회성 통신 방식이므로 network에 부하가 적어 topic의 대체 수단으로도 사용됨
- Action : Client가 요청 전송 시 중간중간 feedback 전송 후 최종 결과 전달. 많이 사용하지는 않음 (복잡한 task에서 사용)
- 심화 내용 : Message 통신 - ROS에서의 기본이 되는 기술적 포인트는 node간의 message 통신
1) Roscore 실행(Master 구동 : XMLRPC 구동)
$ roscore
- roscore는 ROS의 기본 실행 명령으로써 package에서 하나의 node를 실행하는데 사용. 무조건 한번은 실행시켜야 함
- Node의 개수에 상관없이 실행되는 각 node들의 정보들을 관리해 node간의 통신을 연결시키는 매게체 역할을 함
- Master와 각 node들은 XMLRPC를 이용하여 통신한다
- XMLRPC(XML Remote Procedure Call) : HTTP를 통한 간단하고 이식성 높은 원격 호출 방법으로, encoding시에는 xml을 사용하고 전송할 때는 HTTP protocol을 사용
- RPC : 멀리 떨어져있는 (Remote) 컴퓨터 상의 program이 다른 computer내의 서브프로그램(procedure)을 불러냄(call)
- Protocol : 원격 통신시 각 장치간 메시지를 주고 받는 양식과 규칙의 체계
2) Subscriber node 구동
$ rosrun package_name node_name
- 구동 후 subscriber node의 정보(node의 이름, 전송할 topic의 이름, 전송할 message의 형태, node의 IP, Port 번호)를 master에게 전달 (Master는 server, 노드2는 cilent 역할)
- IP, Port 번호, 즉 Network 정보를 바탕으로 다른 node와 접속시키기 위함
3) Publisher node 구동
$ rosrun package_name node_name
- 2번과 동일하게 publisher node의 정보를 master에 전달
4) Publisher 정보 알림
- Master가 topic, message 형태 두 정보를 matching해서 각 node들의 해당 정보들이 서로 같으면 publisher의 정보를 subscriber에 전달 (연락처를 전달한다 생각)
- Master가 subscriber node에 subscriber가 접속하기 원하는 publisher의 이름, 주소 등의 정보를 전송한다
5) Publisher node에 접속 요청
- Subscriber node가 Master로부터 받은 publisher node의 IP, Port 번호 정보를 이용해서 publisher node에 직접적으로 TCPROS 접속 요청
- TCPROS : Message 및 Service에서 사용되는 TCP/IP 방식
6) 접속 응답
- 접속 응답에 해당되는 자신의 TCP URI 주소와 Port 번호 전송
- URI (Uniform Resource Identifier) : Internet상의 Resource를 나타내는 Identifer. Internet에서 요구되는 기본조건으로써 Internet Protocol에 항상 붙어다닌다
7) TCP 접속
- TCPROS를 이용하여 Subscriber node가 Publisher node와 직접 연결
- Publisher node의 통신 방식이 XMLRPC에서 TCPROS로 바뀜
8-1) Message 전송(Topic의 경우)
- Publisher node가 Subscriber node에게 Message 전송
- 이후로는 TCP/IP통신이라 보면 됨. Master 필요 X
8-2) Service의 경우
- Service의 경우 1회에 한해 접속. Service 요청 및 Service 응답이 수행된 후 서로간의 접속을 끊음
- 앞의 turtlesim 예제를 통해 통신 개념 다시 잡기
- Keyboard를 눌러 각 key에 해당하는 병진/회전 속도의 data를 message의 형태인 smd, val이라는 이름으로 줌
- rosrun은 command line tool 중 하나로 node 하나를 실행시킬 때 사용
$ rosrun turtlesim turtlesim_node
- turtlesim이라는 package 안에 있는 turtlesim node를 실행시킴(subscriber node실행)
$ rosrun turtlesim turtle_teleop_key
- Publisher node(teleop node) 실행
- Master에 node 정보 전달
- 1번쨰 줄은 node이름, 2번째 줄은 topic의 이름, 3번째 줄은 message 형태로 보낼 병진/회전 속도, 4번째 줄은 IP, Port 번호
- Master가 matching을 통해 subscriber node에게 publisher node의 정보를 줌
- Subscriber node가 publisher node에게 접속 요청
- Publisher node가 접속 허용 후 그림의 방향으로 message 전달
- 실제로 geometry_msgs/Twist를 통해 휴머노이드/모바일 로봇, 드론을 움직임
- Message는 node간에 data를 주고 받을 때 사용하는 data의 형태. Topic, Service, Action 모두 Message 사용
- 한 Message 안에 다수의 Message가 있는 경우도 있음
- Message를 사용자가 만들 수도 있음
- Parameter : Node에서 사용되는 parameter를 말하며, default 설정값들이 지정되어 있고 필요에 따라 이 parameter를 읽거나 쓸 수 있다 (Window의 .ini 설정 파일과 동일)
- 외부에서 쓰기 기능을 통해 설정 값을 실시간으로 바꿀 수 있어 상황에 따라 유연하게 대처할 수 있다
- 어떤 Global Variable을 network에 지정한 후 외부에서 변경시키고 다른 node에서 받아서 process를 변화시킬 수 있음
- 특정 기능의 사용 여부를 parameter로 설정한 후 외부에서의 변경을 통해 process가 compile을 하지 않고 변경 가능
- ROS Master(roscore)의 기능 중 일부로써 roscore 실행 시 Parameter server 또한 역할 수행
- .ini 파일은 program 실행시 초기화 정보를 담고 있는 설정 파일
- Parameter는 엄밀히 따지면 message 통신은 아니나 message를 이용은 함
- ex) USB Port, 카메라 색 보정 값, 속도나 명령어들의 최대/최솟값
- https://wiki.ros.org/msg : Message 관련 정보
- https://wiki.ros.org/common_msgs : 일반적으로 많이 사용되는 message들을 모아놓음
- Message의 기본은 단순 자료형 (Int, floating point, boolean 형)
- ex) Twist Message
- linear : 병진 속도
- angular : 회전 속도
- Twist Message를 사용하는 것은 x, y, z축의 병진/회전 속도 총 6개의 data를 float64형으로 보내겠다는 뜻
- 위는 message 안에 message를 품고 있는 형태(데이터 구조)
- Array로 data를 보냄
- LaserScan은 2D 거리값을 쭉 array로 보냄
- Camera RGB값을 픽셀별로 array로 쭉 보냄
- Keyboard를 누르면 그에 해당하는 message가 전송됨
- Name, TF, Client Library, 이기종 Device간의 통신
1) Name : Node, message(Topic, Service, Action, Parameter)의 이름(Identifier)
- 같은 name의 node를 2개 이상 실행시키지 못함
- 2개 이상 실행시키고 싶을 경우 name을 바꿔 실행 가능
- 내용이 복잡해 뒤에서 다시 다룸
2) TF(Transform. 좌표 변환) : 상대 좌표로 서로 연관되어 있는 각 관절의 움직임을 어떻게 모델링 할 것인가?
3) Client Library : 나중에 찾아볼 것. 강의에선 ROS C++ 사용
4) 이기종 Device간의 통신
- ROS File System
- ROS는 ROS 설치 folder(/opt/ros) 와 사용자 작업 folder(~/catkin_ws) 로 구분된다
- ROS 설치 folder에는 ROS desktop 버전을 설치하면 /opt folder에 ros라는 이름으로 folder가 생성되며 그 안에 roscore를 포함한 핵심 유틸리티와 rqt, rviz, 로봇 관련 library, simulation, navigation 등이 설치된다
- /opt (Optional) : 추가적인 program들이 설치되는 folder
- Utility : OS에서 제공하는 것 외의 추가 기능을 제공하는 작은 program
- 사용자가 이 부분의 file을 건들릴 일은 거의 없음
- bin : 실행 가능한 binary file (중요 file)
- env.* : 환경 설정 file
- etc : ROS 및 catkin 관련 설정 file
- include : Header file
- lib : Library file
- share : ROS package
- setup.* : 환경 설정 file
- 사용자 작업 folder는 사용자가 원하는 곳에 folder를 생성할 수 있는데 Linux 사용자 folder인 ~/catkin_ws ('~'는 linux에서 '/home/사용자명' 에 해당하는 folder 의미)를 사용한다
- build : catkin build 관련 file
- devel : msg, srv header file과 사용자 package library, 실행 file
- src : 사용자 source code의 공간. 이 folder에 여러 package를 넣고 build할 수 있다
- Package는 아래와 같은 구성을 가진다
- include : Header file
- launch : roslaunch에 사용되는 launch file
- msg : Message file
- src : Source code file
- CMakeLists.txt : Build 설정 file
- package.xml : Package 설정 file
- 이 외에도
- node : rospy용 script
- srv : Service file
- 등이 있다
- ROS Build System
- ROS build system은 기본적으로 CMake(Cross Platform Make)를 사용하며, CMake를 ROS에 맞도록 수정하여 ROS에 특화된 catkin build system을 제공한다
- ROS package를 multi-platform에서 build할 수 있도록 하기 위해 CMake를 사용한다 (CMake는 Linux, Window, BSD 등 여러 운영체제에서 사용 가능하다)
강의 출처 :
https://www.youtube.com/watch?v=mRR-3GqVlIU&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=3
https://www.youtube.com/watch?v=skqzz_xQQXg&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=4
https://help.ubuntu.com/kubuntu/desktopguide/ko/directories-file-systems.html
'Study_ROS > [ROBOTIS ROS Courses]' 카테고리의 다른 글
[ROBOTIS ROS Courses] Ch8. 로봇, 센서, 모터 ~ Ch10. 모바일 로봇 (0) | 2023.01.24 |
---|---|
[ROBOTIS ROS Courses] Ch7. ROS 기본 프로그래밍 (0) | 2022.09.17 |
[ROBOTIS ROS Courses] Ch6. ROS 도구(RViz, rqt, Gazebo) (0) | 2022.09.17 |
[ROBOTIS ROS Courses] Ch5. ROS 명령어 + 용어 정리 (0) | 2022.09.10 |
[ROBOTIS ROS Courses] Ch1. 로봇 소프트웨어 플렛폼 ~ Ch2. 로봇 운영체제 ROS (0) | 2022.08.30 |