상황: 자사 안내이송 로봇 관리자 솔루션 개발 역을 맡게되었고, 로봇 업체에서 제공한 관리자 솔루션을 참고하여 재개발해야한다.
But, 업체의 관리자 솔루션은 어디까지인가..?
개발해야 되는 시스템의 정의와 범위를 규정짓기 위해 테스트 서버를 통해 시스템 아키텍처를 분석해보았습니다.
분석 결과, 서버 ROS가 로봇 ROS를 통합 관리하는 구조였습니다.
저의 목적(이 포스팅 시리즈에서 얻을 수 있는 것)은 로봇을 제어하는 ROS 패키지 개발이 아니며, 아래와 같습니다.
나의 공부 목적
- 서버에 ROS 세팅
- ROS 개념 및 원리 파악
- 서버 ROS와 로봇 ROS 간의 연결 고리(Connection)을 찾는 것
자, 이제 ROS에 대해 공부해 볼까요?
로봇 운영체제(ROS, Robot Operating System)란, "오픈 소스 로봇 미들웨어 제품군"입니다.
ROS는 메타 운영체제로, 운영체제는 아니지만 비슷한 역할을 수행합니다.
등등 컴퓨터 클러스터 용으로 설계된 서비스를 제공합니다.
메타 운영체제(Meta OS)란?
공식적으로 정의된 것은 아니나, 애플리케이션과 분산 컴퓨팅 자원 간의 가상화 레이어라고 할 수 있다.
전통적인 운영체제(OS)은 아니며, 오히려 전통적인 운영체제 위에서 동작한다.
ROS에서 최소 단위의 프로세스인 노드
는 각각 독립적으로 실행되고, 유기적으로 데이터를 주고받을 수 있습니다.
메세지 통신만 가능하다면, 운영체제와 프로그래밍 언어에 상관없이 메시지를 통해 데이터를 주고받을 수 있습니다.
⇒ 즉, 프로그래밍 언어에서 ROS로 메세지 통신을 지원하는 언어라면, 데이터를 주고받을 수 있다는 말입니다. 대표적인 예로 JavaScript
와 Python
이 있습니다
RViz
: 시각화된 로봇의 외형과 동작 표현 및 센서 데이터 확인rqt
: 그래프화된 노드, 토픽의 연결 정보 및 센서 데이터를 확인할 수 있고, GUI 개발을 위한 Qt 기반의 프레임워크 제공Gazebo
: 물리엔진을 탑재하여 3차원 시뮬레이션을 지원SLAM
: 주변을 감지하며 현재 위치를 추종 및 지도를 제작Navigation
: 지도 내에서 장애물을 회피하며 최적의 경로로 목적지를 찾아감MoveIt!
: 매니퓰레이터(ManiPulator) 라이브러리와 GUI 형태의 도구를 제공ROS의 핵심 패키지(실행 환경) 를 세팅합니다.
이 포스팅에서는 Ubuntu 18.04 LTS, ros melodic 버전을 설치하였습니다.
Linux에서 packages.ros.org
의 패키지를 찾을 수 있도록 아래와 같이 세팅합니다
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# Key Setting
$ sudo apt install curl # if you haven't already installed curl
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
아래 명령을 통해 ROS 패키지를 설치합니다. 경우에 따라 알맞은 패키지를 설치하면 됩니다. 잘 모르겠는 경우에는 Full 버전 (ros-melodic-desktop-full
패키지)를 설치합니다.
$ sudo apt update
# Desktop-Full Install: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators/perception
$ sudo apt install ros-melodic-desktop-full -y
# Desktop Install: ROS, rqt, rviz, and robot-generic libraries
$ sudo apt install ros-melodic-desktop -y
# ROS-Base: (Bare Bones) ROS Packages, build, and communication libraries, No GUI Tools
$ sudo apt install ros-melodic-ros-base -y
# Individual Package: You can also install a specific ROS Package
$ sudo apt install ros-melodic-${PACKAGE} -y
이제 ROS 런타임 환경이 준비되었습니다.
터미널에서 ROS 명령을 사용할 수 있도록 아래와 같이 세팅합니다
$ echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
# Apply changes
$ source /opt/ros/melodic/setup.bash
그런 다음, rosdep
을 설치하고 초기화합니다.
rosdep
이란?ROS 패키지 관리자
입니다. rosdep을 이용하여 패키지를 관리(설치, 삭제, 의존성 관리)할 수 있습니다.즉, 아래와 같이, 패키지 설치 명령을 통해 ROS 관련 패키지를 설치합니다.
rosdep install AMAZING_PACKAGE
[참조] ROS Wiki
# rosdep 관련 패키지 설치
$ sudo apt install python-rosdep python-rosinstall
python-rosinstall-generator python-wstool build-essential -y
$ sudo apt install python-rosdep -y
$ sudo rosdep init
$ rosdep update
💡 이때, 주의할 점은 rosdep update
시 sudo 명령(관리자 권한)
을 사용해서는 안된다고 합니다. 나중에 권한 문제가 발생할 수 있다고 하네요!
ROS 패키지를 개발하고 빌드하기 위해서는 개발 환경(workspace)을 구축해야 합니다.
이번에는 ROS 개발환경을 구축하고, 환경설정을 적용합니다.
+ ROS 명령어를 사용하기 위해서는 매번 source 명령어를 이용하여 환경 설정 파일을 불러와야 합니다. 터미널 창을 열 때마다 자동으로 환경 설정 파일을 불러올 수 있도록 .bashrc 파일을 수정합니다.
Workspace 폴더를 만들고 catkin_init_workspace
명령을 통해 workspace로 세팅합니다.
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws/
$ catkin_make
$ . ~/catkin_ws/devel/setup.bash
.bashrc
파일에 아래 내용을 넣어줍니다.
# vi 편집기가 없다면 설치
$ apt install vim
$ vim ~/.bashrc
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash
# 환경 변수 설정 (MASTER_URL, HOSTNAME)
<MASTER_IP> <ROBOT_HOSTNAME>
export ROS_MASTER_URI=http://<MASTER_IP>>:11311
export ROS_HOSTNAME=<REMOTE_IP>
Catkin이란?
ROS에서 사용하는 빌드 시스템
⇒ ROS 패키지를 배포할 때 사용합니다.
위와 같이 작업 공간을 구성하면 해당 디렉터리는 아래와 같은 구성됩니다.
📁 catkin_ws
ㄴ 📁 build - 라이브러리와 실행 프로그램과 같은 캣킨 작업 결과 중 일부 저장
ㄴ 📁 devel - 시스템이 현재 작업 공간과 그 안에 포함된 코드를 사용하도록 위치를 알려 주는 환경 설정 파일이 있는 곳 (~/catkin_ws/devel/setup.bash)
ㄴ 📁 src - 로봇을 구동 시키는 ROS 패키지를 저장하는 곳
ROS 파일은 모두 패키지(Package)로 구성되어 있습니다.
패키지는 ROS 소프트웨어 구성 단위입니다.
각 패키지에는 라이브러리, 실행 파일, 스크립트 또는 기타 아티팩트 등이 포함됩니다.
Manifest (package.xml)란, 패키지를 설명하는 파일입니다.
패키지 간의 종속성을 정의하고 버전
, 관리자
, 라이센스
등과 같은 패키지에 대한 메타 정보를 저장합니다
명령 프롬프트(Terminal, CMD)에서 ROS 명령어를 사용하기 위해서는 반드시 먼저 아래 명령을 수행해야합니다.
source /opt/ros/melodic/setup.bash
roscore
: ros master
를 구동하는 명령어.$ roscore
rospack
: 패키지에 대한 경로를 얻을 수 있는 명령어# 사용법
$ rospack find [패키지_이름]
# 예시
$ rospack find roscpp
roscd
: ros 패키지나 스택 경로로 이동하는 명령어.$ROS_PACKAGE_PATH
경로 아래에 있는 패키지만 가능합니다.echo 명령어
를 통해 위의 경로를 알아볼 수 있습니다.# 사용법
$ roscd <package-or-stack>[/subdir]
$ echo $ROS_PACKAGE_PATH
# 예시
$ roscd roscpp
$ roscd roscpp/cmake
rosls
: ros 패키지의 파일 목록 보기$ rosls roscpp
roscd
지정한 ROS 패키지의 디렉터리로 이동.rosls
ROS 패키지의 파일 목록 확인.rosed
ROS 패키지의 파일을 편집roscp
ROS 패키지의 파일을 복사rospd
ros + pushd, ROS 디렉토리 인덱스에 디렉토리를 추가roscore
마스터 노드 실행.rosrun
노드 실행.roslaunch
여러 노드 실행 및 실행 옵션 설정rosclean
ROS log file 검사 및 삭제rostopic
ROS 토픽 정보 확인.roservice
ROS 서비스 정보 확인.rosnode
ROS 노드 정보 확인.rosbag
ROS 메시지 기록, 재생.rosmsg
ROS 메시지 파일 정보 확인.rossrv
ROS 서비스 파일 정보 확인.rosversion
ROS 패키지 및 배포 릴리즈 버전 정보 확인catkin_create_pkg
catkin 빌드 시스템으로 패키지 자동 생성.catkin_make
catkin 빌드 시스템에 기반을 둔 빌드.catkin_init_workspace
catkin 빌드 시스템 작업 폴더 초기화.Node를 실행시키는 방식에는 rosrun, roslaunch 로 크게 두 가지가 있습니다.
이 둘의 차이점은
rosrun
: roscore 실행 후, 단 하나의 노드(Node)를 실행시키는 것roslaunch
: roscore 실행 없이 launch 파일을 통해 한번에 여러 개의 노드(Node)를 동시에 실행시키는 것입니다.rosrun
명령을 통해 노드를 실행합니다.
이때, 노드(node)
는 무조건적으로 패키지(package)
안에 있기 때문에 실행할 node 앞에 package를 먼저 써줘야 합니다.
# ros master 구동
$ roscore
# 사용법
$ rosrun <package> <executable>
# 예시
$ rosrun roscpp_tutorials talker
# 예시2 - 파라미터 전달
$ rosrun package node _parameter:=value
# 예시3 - 이름명 전달
$ rosrun package node __name:=name
ros launch - 실행 경로 외에서 패키지 실행
# 사용법
$ roslaunch <package> <launch-file-name.launch>
rosnode list
명령을 통해 현재 구동중인 노드 목록 확인합니다.
$ rosnode list
RosBridge는 JSON 기반 명령을 ROS(로봇 미들웨어)로 전송하기 위한 사양으로 정의되고 있습니다.
- rosbridge_suite 패키지: rosbridge 프로토콜을 구현하고 WebSocket 전송 계층을 제공하는 ROS 패키지 모음
- 소스 코드: https://github.com/RobotWebTools/rosbridge_suite
RosBridge란 무엇일까?
ROS를 공부하면서, 저는 로봇이 움직이는 코딩을 사람이 아니라, 로봇과 통신할 서버 프로그램을 개발해야 하기 때문에 시스템 아키텍처를 파악하면서 제일 먼저 ROS와 부딪혔던 놈이 RosBridge
입니다.
여러 Docs와 실습을 거친 끝에 저는 저만의 정의를 결론지었어요
RosBridge란?
ROS와 클라이언트 프로그램(우리가 개발할 프로그램) 간에 통신(protocol)을 지원해주기 위한 ROS 라이브러리 (우분투 ROS 패키지)입니다.
rosbridge가 지원하는 프로토콜은 대표적으로 웹소켓(WebSocket)이 있는데, 웹소켓 뿐 아니라 tcp, udp도 지원합니다.
아래의 그림과 같이 RosBridge를 통해 통신 프로토콜을 개설하고, 프로그램에서 ROS 프로토콜에 접속하여, ROS와 통신할 수 있게되는 원리입니다.
우선, 아래 명령을 통해 rosbridge-bridge-server
를 설치합니다.
$ apt-get install ros-melodic-rosbridge-server
rosluanch
를 통해 rosbridge 서비스를 실행합니다.
$ source /opt/ros/melodic/setup.bash
$ roslaunch rosbridge_server rosbridge_websocket.launch
rosbridge는 ROS의 패키지이며, 각 패키지는 하나 이상의 노드를 갖습니다.
따라서 rosbridge를 실행했다면, rosnode 명령을 통해 실행 중인 node을 확인하실 수 있습니다.
$ rosnode list
/rosapi
/rosbridge_websocket
/rosout
Topic. 패키지에 대한 정보를 어떻게 얻을까?
우선 패키지 정보를 확인해보고 싶다면, roscd
명령어를 통해 원하는 패키지(rosbridge_server
)로 이동해봅시다.
기본적으로 파일 구조
를 탐색합니다. ⇒ ll 명령어 (ls -l)
# rosbridge_server 패키지 폴더로 이동
$ roscd rosbridge_server
# 현재 폴더 탐색
$ ls -l
total 12
drwxr-xr-x 1 root root 4096 Feb 3 10:54 cmake
drwxr-xr-x 2 root root 4096 Feb 1 12:05 launch
-rw-r--r-- 1 root root 1838 Oct 19 03:34 package.xml
# launch 폴더 탐색
$ ls -l launch/
# 편집기로 package.xml 파일 열기
$ vi package.xml
그런 다음, 메타파일(package.xml)
을 분석합니다. 현재 설치된 버전 유지보수자(maintainer) rospy에 의존하고 있는 등등 여러가지 정보를 볼 수 있네요.
<?xml version="1.0"?>
<?xml-model
href="http://download.ros.org/schema/package_format3.xsd"
schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>rosbridge_server</name>
<version>0.11.16</version>
<description>A WebSocket interface to rosbridge.</description>
<license>BSD</license>
<url type="website">http://ros.org/wiki/rosbridge_server</url>
<url type="bugtracker">https://github.com/RobotWebTools/rosbridge_suite/issues</url>
<url type="repository">https://github.com/RobotWebTools/rosbridge_suite</url>
<author email="jonathan.c.mace@gmail.com">Jonathan Mace</author>
<maintainer email="rctoris@wpi.edu">Russell Toris</maintainer>
<maintainer email="jihoonlee.in@gmail.com">Jihoon Lee</maintainer>
<buildtool_depend>catkin</buildtool_depend>
<buildtool_depend condition="$ROS_PYTHON_VERSION == 2">python-setuptools</buildtool_depend>
<buildtool_depend condition="$ROS_PYTHON_VERSION == 3">python3-setuptools</buildtool_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 2">python-autobahn</exec_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 3">python3-autobahn</exec_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 2">python-backports.ssl-match-hostname</exec_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 2">python-tornado</exec_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 3">python3-tornado</exec_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 2">python-twisted-core</exec_depend>
<exec_depend condition="$ROS_PYTHON_VERSION == 3">python3-twisted</exec_depend>
<exec_depend>rosbridge_library</exec_depend>
<exec_depend>rosbridge_msgs</exec_depend>
<exec_depend>rosapi</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>rosauth</exec_depend>
<test_depend>rostest</test_depend>
</package>
# rosbridge launch 파일
$ roscd rosbridge_server/launch/
$ vi rosbridge_websocket.launch
간단한 launch 파일
을 구성하여, rosbridge를 실행해봅시다. launch 파일을 구성하면, port
와 같은 옵션
을 변경할 수 있습니다.
# 폴더 생성
$ mkdir -p ~/catkin_ws/launch/
# 파일 편집 or 생성 후 편집
$ vi ~/catkin_ws/launch/websocket.launch
# TODO: 아래 내용 붙여넣기 후 저장
# launch 파일 실행
$ roslaunch ~/catkin_ws/launch/websocket.launch
# Launch 파일 예시
<launch>
<include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" >
<arg name="port" value="9000"/>
</include>
</launch>
이제 ws://127.0.0.1:9000
url로 ros와 연결할 수 있으며, 프로그램과 연결할 준비가 완료되었습니다. 👏👏
이번 포스팅에서는 ROS의 개념부터 환경 세팅, 명령어 목록, rosbridge 서버 구성방법 등을 공부해보았습니다.
다음 포스팅에서는 ROS의 주요 용어(구성 단위) 및 패키지 실습에 관해 포스팅하겠습니다!! 🤗