Study/[ROS] ROS Basic

ROS Basics(1)

soohwan_justin 2020. 10. 31. 15:42

이 포스트는 theconstructsim.com의 ROS BASICS 를 참고하였습니다.

이번 포스트에서 다룰 내용은

- ROS 프로그램 구조를 만들고 launch하기

- 기본 ROS 프로그램 만들기

-  기본 ROS 개념 알기 : Nodes, Parameter Server, Envrionment Variables, Roscore

 

 

 

Install ROS

참고 자료

- 공식 Wiki : http://wiki.ros.org/melodic/Installation/Ubuntu

- 개정증보판 ROS 로봇 프로그래밍(표윤석, 루비페이퍼)

 

제 환경은 Ubuntu18.04, ROS는 melodic입니다. Ubuntu 16.04를 사용하시는 분은 melodic을 kinetic으로, 20.04를 사용하시는 분은 noetic으로 바꾸시면 됩니다. 편집기는 atom을 사용했습니다. 파일 편집은 본인이 편한 편집기를 사용하시면 됩니다.

 

1. 서로 다른 PC 간에 통신을 할 경우, ROS Time의 오차가 생길 수 있으므로 그 오차를 줄이기 위한 NTP를 설치합니다.

$ sudo apt-get install –y chrony ntpdate

$ sudo ntpdate –q ntp.ubuntu.com

 

2. 소스 리스트 추가

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

 

3. 키 설정

$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

 

4. 패키지 업데이트 및 ROS 설치 

$ sudo apt-get update && sudo apt-get upgrade

$ sudo apt-get install ros-melodic-desktop-full

$ sudo apt-get install ros-melodic-rqt*

 

5. rosdep 초기화

$ sudo apt-get install python-rosdep

$ sudo rosdep init

$ rosdep update

 

6. rosinstall 설치

$ sudo apt-get install python-rosinstall

 

7. 환경 설정

$ source /opt/ros/melodic/setup.bash

 

8. 작업 폴더 생성 및 초기화(catkin_ws를 workspace라고도 합니다)

$ mkdir –p ~/catkin_ws/src

$ cd ~/catkin_ws/src

$ catkin_init_worksapce

$ cd ~/catkin_ws/

$ catkin_make

$ source ~/catkin_ws/devel/setup.bash

 

9. 다음 명령으로 설치 확인(ros 패키지를 실행하기 위해서는 roscore를 반드시 실행해야합니다. 한 번만 실행하면 됩니다.)

$ roscore

 

10. ROS 환경설정

$ source /opt/ros/melodic/setup.bash

$ source ~/catkin_ws/devel/setup.bash

 

11. 편집기로 ~/.bashrc 파일 수정

$ atom ~/.bashrc

 

12. 다음과 같은 내용을 bashrc파일 밑에 추가

# Set ROS Melodic
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash

# Set ROS Network
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311

# Set ROS alias command
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'

 

위와 같이 내용 추가 시, 커맨드 창에 cw 입력 시 catkin_ws 디렉토리로 이동하고, cs 입력 시 catkin_ws/src 디렉토리로 이동하며, cm 입력 시 catkin_ws 디렉토리로 이동 후 catkin_make 명령을 실행합니다. 자주 이동하는 디렉토리이니 이렇게 설정하고 사용하시면 편리합니다.

위와 같이 내용 추가 후에는 커맨드 창에 다음과 같이 입력하여 변경 사항을 적용합니다.

$ source ~/.bashrc

 

13. 이후 사용될 패키지 설치

$ sudo apt-get install ros-melodic-laser-proc ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan ros-melodic-rosserial-arduino ros-melodic-rosserial-python ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro ros-melodic-compressed-image-transport ros-melodic-rqt-image-view ros-melodic-gmapping ros-melodic-navigation

 

14. 시뮬레이션에 사용될 turtlebot 패키지 설치(앞으로 git clone 명령어로 패키지를 다운받을 경우, catkin_ws/src 폴더에서 진행합니다. 이 디렉토리로 빠르게 이동하려면 12. 와 같이 설정 후, cs를 입력하면 됩니다.)

$ cs

$ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git

$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git

$ git clone https://github.com/ROBOTIS-GIT/hls_lfcd_lds_driver.git

$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git

$ cm

 

What's a package?

ROS는 ROS의 프로그램들을 구성하기 위해 패키지(package)를 사용합니다. 패키지란, 어떤 특정한 ROS 프로그램이 포함하는 모든 파일 이라고 생각하시면 되며, 예를 들어 cpp파일, python파일, configuratoin파일, compilation 파일, launch 파일, parameter파일 등이 있습니다.

 

패키지 안의 이 모든 파일들은 다음과 같은 구조를 따르며, 처음 패키지를 생성하면 아래와 같은 파일과 폴더가 자동으로 만들어집니다. 패키지는 catkin_ws/src 폴더에서 catkin_create_package 명령어로 생성합니다.

- launch 폴더 : launch 파일들을 포함

- src 폴더 : 소스 파일들 포함(cpp, python)

- CMakeLists.txt : compilation을 위한 cmake rules의 리스트

- package.xml : 패키지 정보와 의존성

 

 

어떤 특정 ROS 패키지의 디렉토리로 가려면, 다음과 같이 입력 시 그 패키지의 디렉토리로 바로 이동합니다.

$ roscd <package_name>

 

 

What's a launch file?

위에서 ROS는 프로그램을 실행하기 위해 launch 파일을 사용한다고 했는데, 이 파일은 어떻게 생겼는지 확인해보겠습니다. 아까 위에서 turtlebot3 패키지들을 설치했는데, 이 패키지 중 하나를 확인해보겠습니다.

$ roscd turtlebot3_teleop

$ cd launch

$ atom turtlebot3_teleop_key.launch

 

<launch>
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <param name="model" value="$(arg model)"/>

  <!-- turtlebot3_teleop_key already has its own built in velocity smoother -->
  <node pkg="turtlebot3_teleop" type="turtlebot3_teleop_key" name="turtlebot3_teleop_keyboard"  output="screen">
  </node>
</launch>

 

위와 같이 <launch> 태그 안에 <node>태그가 있는 내용의 파일을 볼 수 있는데, 여기서 확인할 것은 <node>태그에서의 파일들입니다.

1. pkg="package_name" : 실행을 위한 ROS 프로그램의 코드를 포함하는 패키지의 이름

2. type="file_name" : 그 패키지 안에서 우리가 실행하려고 하는 프로그램 파일의 이름

3. name="node_name" : 2. 에서 실행할 ROS node의 이름

4. output="type_of_output" :  2.에서 실행한 프로그램의 출력이 어떤 채널을 통해 print될지 결정

 

 

Create a package

이제 직접 패키지를 만들어보겠습니다. 패키지를 만들기 위해서는 우리는 특정한 ROS workspace에서만 작업을 해야하며, 이 workspace는 위에서 언급했듯이 catkin workspace(catkin_ws)라고 하며, ROS package들은 반드시 이 디렉토리에 있어야 실행이 가능합니다(apt-get 명령어로 다운받은 패키지는 다른 디렉토리에 존재하지만, git clone 명령으로 다운받은 패키지는 반드시 이 디렉토리에 있어야 합니다.)

 

패키지는 항상 catkin_ws/src 디렉토리에서 만들어야 합니다. 해당 디렉토리에서 다음과 같이 패키지를 만들어보겠습니다.

 

$ cs

$ catkin_create_pkg my_package rospy

$ ls

 

ls 명령으로 확인 시, my_package라는 패키지가 생긴 것을 확인할 수 있습니다. catkin_create_pkg는 ROS 패키지를 만드는 명령어입니다.

$ catkin_create_pkg <package_name> <package_dependencies>

<package_name>은 자신이 만들고 싶은 패키지의 이름, <package_dependencies>는 해당 패키지를 실행하기 위해 필요한 의존성 패키지입니다.

 

 

My first ROS program

패키지를 만들었으니, 이제 이 패키지로 뭔가를 해야 할 것 같습니다. python 실행 파일을 만들 것인데, simple.py라는 이름의 파이썬 코드를 만들고, 다음과 같이 간단하게 코드를 짜보겠습니다. 위에서 말했듯이 /catkin_ws/my_package/src 디렉토리에 위 파일을 만들어야 합니다.

 

#! /usr/bin/env python

import rospy

rospy.init_node('Justin')
print "Help me Justin, you're my only hope"

 

그리고, 해당 파일에 실행 권한을 부여해야 합니다. 다음과 같이 입력합니다.

$ sudo chmod +x simple.py

 

다음으로, 위 파일을 실행하기 위한 launch 파일을 만들어보겠습니다. launch 파일은 launch 디렉토리에서 만듭니다. 패키지를 만들면 CMakeLists.txt와 package.xml, src 디렉토리밖에 없기 때문에 launch 디렉토리를 추가로 만들어줍니다.

$ roscd my_package

$ mkdir launch

$ cd launch

$ atom my_package.launch

 

그리고, 다음과 같이 파일을 편집합니다.

<launch>
    <!-- My Package launch file -->
    <node pkg="my_package" type="simple.py" name="Justin"  output="screen">
    </node>
</launch>

 

그리고, catkin_make 후 실행합니다.

 

$ cm

$ roscore

$ roslaunch my_package my_package.launch

 

위와 같이 python 코드에서 입력한 메세지가 출력되는 것을 볼 수 있습니다.

 

그런데, 가끔씩 패키지를 만든 직후에 실행하려고 하면 해당 패키지를 찾지 못하는 경우가 발생합니다. 이럴 때는 ROS가 패키지 목록을 refresh하도록 다음과 같은 명령을 실행하면 됩니다.

$ rospack profile

 

 

ROS Nodes

Node가 무엇인가 하는 것은 전자, 컴퓨터 쪽을 공부하신 분이라면 대충 감이 오실테니... 자세한 설명은 하지 않겠습니다. 아까 위의 예제를 실행하고, 다음과 같이 현재 실행중인 node를 확인하기 위한 명령을 실행해보겠습니다.

 

$ rosnode list

 

위와 같이 실행해보면 /rosout 하나만 나올텐데, 아까 launch 파일을 확인해보면 node의 이름은  "Justin"이어야 합니다. /rosout은 roscore를 실행하면 기본적으로 있는 node입니다.

이는 파이썬 프로그램이 만들었던 node를, 프로그램이 종료되면서 node를 없애기 때문인데, 이 node를 확인해보기 위해 python 코드를 다음과 같이 작성해보겠습니다. 이전의 예제를 수정하셔도 되고, 새로운 코드를 작성하셔도 됩니다. 새로운 코드를 작성했을 경우, 실행 권한을 부여하고 launch 파일에서도 type="simple.py"에서 실행 파일 이름을 새로 작성한 파일의 이름으로 수정해야 합니다.

 

#! /usr/bin/env python

import rospy

rospy.init_node("Justin")
rate = rospy.Rate(2)               # We create a Rate object of 2Hz
while not rospy.is_shutdown():     # Endless loop until Ctrl + C
   print "Help me Justin, you're my only hope"
   rate.sleep()                    # We sleep the needed time to maintain the Rate fixed above
    
# This program creates an endless loop that repeats itself 2 times per second (2Hz) until somebody presses Ctrl + C
# in the Shell

 

위 파일을 실행하면 ctrl+C를 눌러 종료할 때까지 메세지가 계속 나오게됩니다. 종료하기 전에 rosnode list 명령어로 node를 확인해보세요.

 

해당 노드에 대한 정보를 알고싶으면 다음과 같은 명령어를 사용하면 됩니다.

$ rosnode info /Justin

 

 

Compile a package

패키지를 만들면, 이 패키지를 작동하도록 하기 위해서는 컴파일을 해야합니다. 다음 명령은 ROS가 사용하는 컴파일 명령입니다.

 

$ catkin_make

 

이 명령은 src 디렉토리 전체를 컴파일합니다. 이 명령은 catkin_ws 디렉토리에서만 동작하며, 위에서 설명한 대로 ~/.bashrc를 편집하면 간단하게 $ cm 만 입력하면 catkin_make를 할 수 있습니다.

 

나중에는 src디렉토리에 패키지가 많아지게 될텐데, 추가로 패키지를 하나 만들 때마다 전체를 다 컴파일 하는 것은 비효율적입니다. 어떤 특정한 패키지만 컴파일 하는 옵션은 다음과 같습니다.

 

$ catkin_make --only-pkg-with-deps <package_name>

 

 

Parameter Server

Parameter Server는 ROS가 parameter를 저장하기 위해 사용하는 dictionary입니다. 이 parameter들은 runtime시 node들에 의해 사용될 수 있으며, 보통 configuration parameters처럼 static data에 사용됩니다.

 

이 parameters를 확인하기 위해서는 다음 명령을 사용합니다.

 

$ rosparam list

 

어떤 특정한 parameter값을 확인하기 위해서는 다음과 같은 명령어를 사용합니다.

 

$ rosparam get <parameter_name>

 

어떤 특정한 parameter값을 설정하기 위해서는 다음과 같이 입력합니다.

 

$ rosparam set <parameter_name> <value>

 

이런 parameter들은, 나중에 패키지를 만들거나 사용할 때, 예를들어 어떤 메시지를 주기적으로 1초에 10번씩 보내도록 설정했을 때, 1초에 몇 번씩 보낼지를 변수로 설정해두고, 위 명령으로 그 값을 필요에 따라 수정한다고 생각하시면 됩니다. 사용 예시는 나중에 더 자세하게 나올 것입니다.

 

 

Roscore

위의 모든 것들이 동작하도록 하기 위해서는 roscore를 실행해야합니다. roscore는 모든 ROS 시스템을 관리하는 메인 프로세스 입니다. roscore를 실행하는 명령은 다음과 같습니다.

 

$ roscore

 

 

 

Environment Variables

 

ROS는 적절하게 동작하기 위해 환경 변수의 집합을 사용하는데, 이를 확인하기 위해서는 아래와 같은 명령을 사용합니다.

 

$ export | grep ROS

 

 

 

여기서 중요한 환경 변수들은 ROS_MASTER_URI와 ROS_PACKAGE_PATH입니다.

ROS_MASTER_URI는 roscore가 실행 될 url을 설정합니다. 보통 local_host로 설정하지만, 두 대 이상의 PC를 사용하여 원격으로 각 ROS 시스템끼리 통신을 할 때는 이 값을 같게 맞춰주어야 합니다.

ROS_PACKAGE_PATH는 ros package들이 들어있는 디렉토리를 나타냅니다. /home/user/catkin_ws/src/는 사용자가 직접 만들거나 git clone 명령어로 다운받은 패키지들이 저장되고, /opt/ros/melodic/share 에는 apt-get 명령으로 설치한 패키지들이 저장됩니다.

'Study > [ROS] ROS Basic' 카테고리의 다른 글

ROS Basics(5. Action, Server and Client)  (0) 2021.08.29
ROS_Basics(4. Service. Server and Client)  (0) 2020.11.03
ROS Basics(3. Topic, Subscriber)  (0) 2020.11.02
ROS Basics(2. Topic, Publisher)  (0) 2020.10.31