[ROS] ROS Quick Start - ROS 개념부터 환경구성까지

김희정·2023년 2월 1일
5

ROS

목록 보기
1/4
post-thumbnail

💎 들어가며

Why ROS?

상황: 자사 안내이송 로봇 관리자 솔루션 개발 역을 맡게되었고, 로봇 업체에서 제공한 관리자 솔루션을 참고하여 재개발해야한다.

But, 업체의 관리자 솔루션은 어디까지인가..?

개발해야 되는 시스템정의범위를 규정짓기 위해 테스트 서버를 통해 시스템 아키텍처를 분석해보았습니다.

분석 결과, 서버 ROS가 로봇 ROS를 통합 관리하는 구조였습니다.

  • 서버에는 여러가지 프로그램과 ROS 설치
  • 로봇에는 ROS가 설치

What I have to?

저의 목적(이 포스팅 시리즈에서 얻을 수 있는 것)은 로봇을 제어하는 ROS 패키지 개발이 아니며, 아래와 같습니다.

나의 공부 목적

  • 서버에 ROS 세팅
  • ROS 개념 및 원리 파악
  • 서버 ROS와 로봇 ROS 간의 연결 고리(Connection)을 찾는 것

자, 이제 ROS에 대해 공부해 볼까요?


1. What is ROS ?

Definition

로봇 운영체제(ROS, Robot Operating System)란, "오픈 소스 로봇 미들웨어 제품군"입니다.

ROS는 메타 운영체제로, 운영체제는 아니지만 비슷한 역할을 수행합니다.

  • 소프트웨어 개발을 위한 일련의 소프트웨어 프레임워크 역할
  • 하드웨어 추상화
  • 저 수준 장치 제어
  • 일반적으로 사용되는 기능 구현
  • 프로세스 간 메시지 전달
  • 패키지 관리

등등 컴퓨터 클러스터 용으로 설계된 서비스를 제공합니다.

메타 운영체제(Meta OS)란?

공식적으로 정의된 것은 아니나, 애플리케이션과 분산 컴퓨팅 자원 간의 가상화 레이어라고 할 수 있다.

전통적인 운영체제(OS)은 아니며, 오히려 전통적인 운영체제 위에서 동작한다.


✨ Features

1) 분산 프로세스

ROS에서 최소 단위의 프로세스노드는 각각 독립적으로 실행되고, 유기적으로 데이터를 주고받을 수 있습니다.


2) 이기종 하드웨어 간의 데이터 송수신

메세지 통신만 가능하다면, 운영체제와 프로그래밍 언어에 상관없이 메시지를 통해 데이터를 주고받을 수 있습니다.

⇒ 즉, 프로그래밍 언어에서 ROS로 메세지 통신을 지원하는 언어라면, 데이터를 주고받을 수 있다는 말입니다. 대표적인 예로 JavaScriptPython이 있습니다


3) 개발 도구

  • RViz: 시각화된 로봇의 외형과 동작 표현 및 센서 데이터 확인
  • rqt: 그래프화된 노드, 토픽의 연결 정보 및 센서 데이터를 확인할 수 있고, GUI 개발을 위한 Qt 기반의 프레임워크 제공
  • Gazebo: 물리엔진을 탑재하여 3차원 시뮬레이션을 지원

4) 로봇 관련 라이브러리

  • 다양한 센서 드라이전달
  • 로봇 관련 라이브러리 제공 (Geometry, Kinemetic, Reverse Kinemetic 등)
  • SLAM: 주변을 감지하며 현재 위치를 추종 및 지도를 제작
  • Navigation: 지도 내에서 장애물을 회피하며 최적의 경로로 목적지를 찾아감
  • MoveIt!: 매니퓰레이터(ManiPulator) 라이브러리와 GUI 형태의 도구를 제공

2. ROS Installation

2.1 Runtime Environment

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

ROS 패키지 관리자 설치

그런 다음, 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 updatesudo 명령(관리자 권한)을 사용해서는 안된다고 합니다. 나중에 권한 문제가 발생할 수 있다고 하네요!

2.2 Development Environment

ROS 패키지를 개발하고 빌드하기 위해서는 개발 환경(workspace)을 구축해야 합니다.

이번에는 ROS 개발환경을 구축하고, 환경설정을 적용합니다.

+ ROS 명령어를 사용하기 위해서는 매번 source 명령어를 이용하여 환경 설정 파일을 불러와야 합니다. 터미널 창을 열 때마다 자동으로 환경 설정 파일을 불러올 수 있도록 .bashrc 파일을 수정합니다.


Workspace 구축

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

Catkin이란?

ROS에서 사용하는 빌드 시스템
⇒ ROS 패키지를 배포할 때 사용합니다.

위와 같이 작업 공간을 구성하면 해당 디렉터리는 아래와 같은 구성됩니다.

📁 catkin_ws
ㄴ 📁 build - 라이브러리와 실행 프로그램과 같은 캣킨 작업 결과 중 일부 저장
ㄴ 📁 devel - 시스템이 현재 작업 공간과 그 안에 포함된 코드를 사용하도록 위치를 알려 주는 환경 설정 파일이 있는 곳 (~/catkin_ws/devel/setup.bash)
ㄴ 📁 src - 로봇을 구동 시키는 ROS 패키지를 저장하는 곳


3. ROS File System

ROS 파일은 모두 패키지(Package)로 구성되어 있습니다.


🔨 Package, Manifest

패키지(Package)란?

패키지는 ROS 소프트웨어 구성 단위입니다.

각 패키지에는 라이브러리, 실행 파일, 스크립트 또는 기타 아티팩트 등이 포함됩니다.

Manifest

Manifest (package.xml)란, 패키지를 설명하는 파일입니다.

패키지 간의 종속성을 정의하고 버전, 관리자, 라이센스 등과 같은 패키지에 대한 메타 정보를 저장합니다


💻 Commands

명령 프롬프트(Terminal, CMD)에서 ROS 명령어를 사용하기 위해서는 반드시 먼저 아래 명령을 수행해야합니다.

source /opt/ros/melodic/setup.bash

Examples

roscore

  • roscore: ros master구동하는 명령어.
    node를 실행하기 전에 필수적으로 선행돼야 합니다.
$ roscore

rospack

  • rospack: 패키지에 대한 경로를 얻을 수 있는 명령어
# 사용법
$ rospack find [패키지_이름]

# 예시
$ rospack find roscpp

roscd

  • roscd: ros 패키지나 스택 경로로 이동하는 명령어.
    단, $ROS_PACKAGE_PATH 경로 아래에 있는 패키지만 가능합니다.
    echo 명령어를 통해 위의 경로를 알아볼 수 있습니다.
# 사용법
$ roscd <package-or-stack>[/subdir]
$ echo $ROS_PACKAGE_PATH

# 예시
$ roscd roscpp
$ roscd roscpp/cmake

rosls

  • rosls: ros 패키지의 파일 목록 보기
$ rosls roscpp

😎 ros 명령어 총 정리

1) 파일시스템 관련 명령어 (bash)

  • roscd 지정한 ROS 패키지의 디렉터리로 이동.
  • rosls ROS 패키지의 파일 목록 확인.
  • rosed ROS 패키지의 파일을 편집
  • roscp ROS 패키지의 파일을 복사
  • rospd ros + pushd, ROS 디렉토리 인덱스에 디렉토리를 추가

2) 실행 관련 명령어

  • roscore 마스터 노드 실행.
  • rosrun 노드 실행.
  • roslaunch 여러 노드 실행 및 실행 옵션 설정
  • rosclean ROS log file 검사 및 삭제

3) 정보 관련 명령어

  • rostopic ROS 토픽 정보 확인.
  • roservice ROS 서비스 정보 확인.
  • rosnode ROS 노드 정보 확인.
  • rosbag ROS 메시지 기록, 재생.
  • rosmsg ROS 메시지 파일 정보 확인.
  • rossrv ROS 서비스 파일 정보 확인.
  • rosversion ROS 패키지 및 배포 릴리즈 버전 정보 확인

4) 빌드 관련 명령어 (catkin)

  • catkin_create_pkg catkin 빌드 시스템으로 패키지 자동 생성.
  • catkin_make catkin 빌드 시스템에 기반을 둔 빌드.
  • catkin_init_workspace catkin 빌드 시스템 작업 폴더 초기화.

🏃‍♂️ Package Execute

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


4. RosBridge Protocol

What is RosBridge?

RosBridge는 JSON 기반 명령을 ROS(로봇 미들웨어)로 전송하기 위한 사양으로 정의되고 있습니다.

RosBridge란 무엇일까?

ROS를 공부하면서, 저는 로봇이 움직이는 코딩을 사람이 아니라, 로봇과 통신할 서버 프로그램을 개발해야 하기 때문에 시스템 아키텍처를 파악하면서 제일 먼저 ROS와 부딪혔던 놈이 RosBridge입니다.

여러 Docs와 실습을 거친 끝에 저는 저만의 정의를 결론지었어요

RosBridge란?

ROS클라이언트 프로그램(우리가 개발할 프로그램) 간에 통신(protocol)을 지원해주기 위한 ROS 라이브러리 (우분투 ROS 패키지)입니다.

rosbridge가 지원하는 프로토콜은 대표적으로 웹소켓(WebSocket)이 있는데, 웹소켓 뿐 아니라 tcp, udp도 지원합니다.

아래의 그림과 같이 RosBridge를 통해 통신 프로토콜을 개설하고, 프로그램에서 ROS 프로토콜에 접속하여, ROS와 통신할 수 있게되는 원리입니다.


Rosbridge Package

Install & Execute

우선, 아래 명령을 통해 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

rosbridge_server package

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

Execute with launch file

간단한 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와 연결할 수 있으며, 프로그램과 연결할 준비가 완료되었습니다. 👏👏




💎 Reference


💎 마치며

이번 포스팅에서는 ROS의 개념부터 환경 세팅, 명령어 목록, rosbridge 서버 구성방법 등을 공부해보았습니다.

다음 포스팅에서는 ROS의 주요 용어(구성 단위) 및 패키지 실습에 관해 포스팅하겠습니다!! 🤗

profile
Java, Spring 기반 풀스택 개발자의 개발 블로그입니다.

0개의 댓글