본문 바로가기

쓰기

ROS(Robot Operating System) 개념과 활용
2015.08.13 15:33

ROS(Robot Operating System) 개념과 활용 - 8. roslaunch 사용과 launch 파일 작성하기

조회 수 17572
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 저번에 USB 카메라를 이용하면서 usb_cam-test.launch 파일을 실행시켜 보았습니다. usb_cam-test.launch 파일을 실행시키면 USB 카메라와 직접적으로 상호작용하는 '/usb_cam' 노드와 '/usb_cam/image_raw' 토픽을 받아 화면에 출력하는 '/image_view' 노드가 동시에 구동되었습니다. 개발 과정 이외에 실제로 어떤 시스템을 구동시키는 경우, 노드를 하나씩 실행시키는 것은 번거로우며 그렇게 하기도 어렵다는 것을 생각해볼 수 있습니다. 이번에는 여러 가지 노드를 동시에 실행시키며, 각 노드에 해당되는 파라미터 값도 동시에 적용시킬 수 있는 roslaunch 기능에 자세히 알아보도록 하겠습니다.


 우선 이번에 roslaunch를 조사하면서 새로 알게 된 사실인데, roslaunch는 기존에 master가 구동되고 있지 않다면 master를 자동적으로 실행시킵니다. 예전에는 launch 파일 내에서 마스터를 실행시키도록 별도의 설정을 해 주어야 했으나 현재 사용하고 있는 indigo 버전에서는 roslaunch 실행 전에 roscore를 따로 구동시킬 필요가 없습니다.


 roslaunch 기능을 수행하기 위해서는 패키지 안에 launch 파일이 포함되어 있어야 합니다. launch 파일은 XML 형식으로 작성이 가능하며, 어떤 노드를 어떻게 실행시켜야 하는지에 대한 정보를 가지고 있습니다. launch 파일은 해당 패키지 내에서 /launch 디렉토리를 만들고 그 아래에 생성하면 됩니다. 파일 이름은 마음대로 정할 수 있지만, 가능하면 패키지 이름과 동일하게 짓는 것이 외우기에 편리합니다. A라는 패키지의 B라는 launch 파일을 실행시키는 방법은 다음과 같습니다.


$ roslaunch A B.launch


 launch 파일은 tag와 attribute로 구성되어 있습니다. launch 파일에서 사용하는 태그와 각각 사용 가능한 주요 애트리뷰트는 아래와 같습니다. 선택적으로 사용 가능한 애트리뷰트는 (op)으로 표시하였습니다. (참조: http://wiki.ros.org/roslaunch/XML)


<launch> -> launch 파일을 시작합니다. launch 파일은 반드시 <launch> 태그로 시작하여 </launch> 태그로 종료됩니다.


<node> -> 노드를 실행시킵니다.

pkg="mypackage"                              -> 노드가 포함되어 있는 패키지를 지정합니다.

type="nodetype"                                -> 노드 실행 파일 이름을 기입합니다.

name="nodename"                            -> 노드 이름을 지정합니다. 노드 내부에서 설정한 이름보다 우선적으로 사용됩니다.

machine="machine-name"(op)          -> 지정한 기기에서 노드를 실행합니다.

respawn="true"(op)                            -> 노드가 종료되는 경우 자동적으로 재시작합니다.

respawn_delay="seconds"(op)           -> 노드에 failure가 발견되는 경우 재시작 전까지 지정된 시간 동안 대기합니다.

output="log|screen"(op)                    -> 값이 screen인 경우 노드의 stdout/stderr를 화면에 출력합니다. log인 경우 stderr를 화면에 출력하고 로그 파일을 $ROS_HOME/log 경로에 생성합니다.


<machine> -> 노드를 실행시킬 기기를 지정합니다. 모든 노드가 로컬 네트워크에서 구동되는 경우 사용하지 않습니다.

name="machine-name"                     -> 기기의 이름을 지정합니다. <node> 태그에서 사용하는 machine 애트리뷰트의 것과 대응됩니다.

address="enssionaut.com"                 -> 기기의 네트워크 주소를 지정합니다.

env-loader="/opt/ros/fuerte/env.sh" -> 원격 기기의 환경 파일을 지정합니다. 환경 파일은 shell script이어야 하며 필요한 모든 환경 변수가 설정되어 있어야 합니다.

default="true|false|never"(op)            -> 해당 기기가 모든 노드들의 기본 실행 기기가 될 것인지 설정합니다. 기본 기기가 없다면 로컬 기기가 기본 기기로 작동됩니다.

timeout="10.0"(op)                            -> roslaunch에서 몇 초간 해당 기기에 대한 응답이 없으면 연결 실패로 간주할 것인지 시간을 지정합니다.


<include> -> launch 파일 내에서 다른 launch XML 파일을 불러옵니다.

  file="$(find pkg-name)/path/filename.xml" -> include 할 파일 이름을 입력합니다.

  ns="foo"(op)                                                 -> 파일을 'foo' 네임스페이스에 대하여 불러옵니다.

  clear_params="true|false"(op)      -> launch 수행 전에 <include>의 네임스페이스 파라미터를 전부 제거합니다. true인 경우 반드시 ns 애트리뷰트와 같이 사용해야 하며 기본값은 false입니다.


<remap> -> 어떤 문자열을 전부 다른 문자열로 대응시킵니다.

  from="original-name" -> remap할 원래 이름입니다.

  to="new-name"           -> 바꿀 이름입니다.


<env> -> 이미 실행된 노드의 환경 변수를 설정합니다. 런치 파일의 환경 변수는 수정할 수 없습니다.

  name="environment-variable-name" -> 설정할 환경 변수 명을 입력합니다.

  value="environment-variable-value"  -> 해당 환경 변수의 값을 입력합니다.


<param> -> 파라미터 값을 설정합니다. Parameter Server라고 하는 일종의 전역 값으로 저장되기 때문에 여러 곳에서 참조가 가능합니다. <node> 태그 내에 정의된 경우에는 그 노드의 지역적인 값으로 저장됩니다.

  name="namespace/name" -> 파라미터 이름을 지정합니다.

  value="value"(op)    -> 파라미터 값을 지정합니다. value 애트리뷰트를 사용하지 않는 경우 반드시 textfile, binfile, command 중 한 가지 애트리뷰트를 사용하여 파라미터를 설정해야 합니다.

  type="str|int|double|bool"(op)                        -> 파라미터 자료형을 지정합니다. 따로 지정하지 않는 경우 roslaunch가 정해진 규칙에 따라 자료형을 지정합니다.

  textfile="$(find pkg-name)/path/file.txt"(op) -> 지정한 파일의 내용이 string 형태로 파라미터에 저장됩니다. 파일은 반드시 local하게 접근이 가능해야 합니다.

  binfile="$(find pkg-name)/path/file"(op) -> 지정한 파일의 내용이 base64-encoded XML-RPC binary object로 파라미터에 저장됩니다. textfile과 마찬가지로 local하게 접근이 가능해야 합니다.

  command="$(find pkg-name)/exe '$(find pkg-name)/arg.txt'"(op)    -> 커맨드 출력이 string 형태로 파라미터에 저장됩니다.


<rosparam> -> rosparam을 이용해서 ROS 파라미터를 설정합니다. rosparam은 YAML 파일을 이용해 파라미터 서버의 파라미터 값들을 확인하고 수정할 수 있도록 하는 기능입니다.

  command="load|dump|delete" (op)        -> rosparam에서 사용하는 커맨드를 지정합니다. 기본값은 load입니다.

  file="$(find pkg-name)/path/foo.yaml"  -> rosparam 파일의 이름을 입력합니다. rosparam 커맨드로 load나 dump를 설정한 경우에만 사용됩니다.

  param="param-name"                            -> 파라미터 이름을 지정합니다.

  ns="namespace" (op)                              -> 파라미터를 지정된 네임스페이스에 scope 시킵니다.

  subst_value=true|false (op)                     -> YAML 파일 내에 있는 'substitution args'의 사용 여부를 설정합니다. (참조: http://wiki.ros.org/roslaunch/XML#substitution_args)


<group> -> 다수의 노드에 한꺼번에 설정을 적용시킬 때 사용합니다. 하위 요소로 <node>, <param>, <remap>, <machine>, <rosparam>, <include>, <env>, <test>, <arg>를 가질 수 있습니다.

  ns="namespace" (op)                 -> 노드 그룹을 지정된 네임스페이스에 부여합니다.

  clear_params="true|false" (op)   -> launch 수행 전에 그룹의 네임스페이스 파라미터를 전부 제거합니다. true인 경우 반드시 ns 애트리뷰트와 같이 사용해야 합니다.


<test> -> 노드를 test node로서 실행시킵니다. 애트리뷰트는 <node> 태그와 거의 동일하며 respawn, output, machine 애트리뷰트는 사용할 수 없습니다.


<arg> -> launch 파일 내부에서 지역변수처럼 사용되는 값을 정의합니다.

  name="arg_name"                -> 인자 이름을 지정합니다.

  default="default value" (op) -> 인자의 기본값을 설정합니다. value 애트리뷰트와 동시에 사용할 수 없습니다.

  value="value" (op)                -> 인자 값을 설정합니다. default 애트리뷰트와 동시에 사용할 수 없습니다.


이처럼 roslaunch에서는 매우 많은 설정이 가능합니다. 실제로 roslaunch를 사용해 보면 여러 노드의 파라미터를 일일히 설정하고 각각 실행시키는 것보다 매우 편리하게 시스템을 구동시킬 수 있습니다.


-----------------------------------------------------------------------------------------------

<launch>

<node name="arduino" pkg="rosserial_python" type="serial_node.py" args="/dev/ttyACM0">

</node>

<node name="motor_speed_controller_node" pkg="motor_speed_controller" type="motor_speed_controller" args="2 0.01 0.05 100">

</node>

<node name="rqt" pkg="rqt_gui" type="rqt_gui">

</node>

</launch>

-----------------------------------------------------------------------------------------------


 위 코드는 제가 현재 작업 중인 PID 제어 시스템의 launch 파일 코드입니다. 대략적인 시스템 구조는 아두이노가 모터 회전수를 읽어 PC에서 구동되는 제어기 노드에 보내고, 제어기에서 PID 제어를 통해 제어 명령을 아두이노에 다시 보낸 뒤, 아두이노가 제어 명령에 따라 모터 회전수를 조절하는 시스템입니다. 이 launch 파일에서는 3개의 노드를 구동시키게 되어 있습니다. 위쪽부터 차례대로 'rosserial_python' 패키지의 'serial_node.py' 노드 실행 파일, 'motor_speed_controller' 패키지의 'motor_speed_controller' 노드 실행 파일, 그리고 'rqt_gui' 패키지의 'rqt_gui'입니다. 각각의 실제 노드 이름은 'arduino', 'motor_speed_controller_node', 'rqt'입니다. 먼저 serial_node.py 노드 실행 파일의 구동에 필요한 serial 장치의 위치, 즉 아두이노가 연결된 디바이스 파일을 args 애트리뷰트를 통해 지정해 주었습니다. 그 다음 모터 motor_speed_controller에서 사용되는 PID gain 값과 제어 명령의 주기를 Hz 단위로 각각 2, 0.01, 0.05, 100의 값으로 부여하였습니다. rqt_gui는 별도의 설정 없이 노드만 실행시키도록 하였습니다.


motor-speed-control.png

motor_speed_controller.launch 파일을 실행시킨 모습


launch 파일 이름은 motor_speed_controller로 설정하였으며, roslaunch를 통해 실행시킨 모습은 위 스크린샷과 같습니다. 'arduino', 'motor_speed_controller_node'와 rqt가 동시에 실행된 것을 확인하실 수 있습니다. rqt 화면은 미리 구성해 두었습니다. 'motor_speed_controller_node'에 지정해 주었던 argument 값은 launch 파일에서 지정한 것과 다른 것을 볼 수 있는데, 이는 별도의 설정 파일이 있어 그 값이 적용된 결과입니다.


 여기까지 roslaunch의 사용법과 간단한 launch 파일 작성법을 알아 보았습니다. launch 파일은 ROS 위키에서 제공하는 각종 패키지의 예제에서도 많이 이용되므로 사용법을 알아 둔다면 다른 코드를 이해하는 데에도 많은 도움이 될 것입니다.


  1. ROS(Robot Operating System) 개념과 활용 - 11. rosserial 알아보기

    ROS가 적용되는 시스템에선 연산을 위한 상위 제어기와 하드웨어 제어를 위한 하위 제어기가 각각의 역할을 수행하는 경우가 많습니다. 상위 제어기는 보통 PC나 OBC(One Board Computer)를 사용하게 되는데, 하위 제어기와 통신할 때 가장 흔하게 사용되는 ...
    Date2016.03.28 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views7539
    Read More
  2. ROS(Robot Operating System) 개념과 활용 - 10. CMakeLists.txt 파헤치기

    CMakeLists.txt는 빌드 설정에 관련된 매우 중요한 파일이지만 주석의 압박과 익숙하지 않은 사용법 때문에 매번 대충 작성했던 경험이 있습니다. 관련 가이드를 찾아 보니 생각보다 간단한 규칙으로 되어 있어서 다른 내용을 진행하기 전에 미리 짚고 넘어가...
    Date2016.03.05 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views8436
    Read More
  3. ROS(Robot Operating System) 개념과 활용 - 9. Dynamic reconfigure를 이용한 실시간 node parameter 업데이트

    오랜만의 ROS 강좌 업데이트입니다. 거의 반년 전 쯤에 해 보았던 내용이지만 이런 저런 바쁜 일들에 밀려 이제서야 업데이트를 하게 되었습니다. 본 코너인 ROS 개념과 활용에서는 나머지 기본적인 내용들을 다루고 최종적으로 간단한 제어 예제까지 수행할 ...
    Date2016.02.24 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views3852
    Read More
  4. 밸런싱 로봇 만들기 - 2. I2C로 IMU(MPU 6050)와 통신하기

    이번 포스팅은 밸런싱 로봇에서 사용하는 유일한 센서인 IMU(Inertial Measurement Unit) - MPU6050과의 통신에 대한 것입니다. 준비물 : 앞의 포스팅에서 만든 하드웨어, 컴퓨터와 UART통신을 하기 위한 UART통신모듈(테스트용), CodeVision AVR 센서와 통신...
    Date2015.08.16 Category밸런싱 로봇 By한종인 Views4087
    Read More
  5. ROS(Robot Operating System) 개념과 활용 - 8. roslaunch 사용과 launch 파일 작성하기

    저번에 USB 카메라를 이용하면서 usb_cam-test.launch 파일을 실행시켜 보았습니다. usb_cam-test.launch 파일을 실행시키면 USB 카메라와 직접적으로 상호작용하는 '/usb_cam' 노드와 '/usb_cam/image_raw' 토픽을 받아 화면에 출력하는 '/image_view' 노드...
    Date2015.08.13 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views17572
    Read More
  6. ROS(Robot Operating System) 개념과 활용 - 7. USB 카메라 사용하기

    ROS는 여러 가지 이미지 관련 패키지를 제공하고 있습니다. 특히 OpenCV 연동 기능을 제공하기 때문에 다양한 영상 처리 알고리즘을 적용할 수 있다는 장점이 있습니다. 이미지와 영상을 얻기 위해서는 이미지를 얻는 센서가 필요한데, ROS가 주로 PC나 SBC ...
    Date2015.08.09 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views6775
    Read More
  7. ROS(Robot Operating System) 개념과 활용 - 6. rqt를 이용한 데이터 모니터링

    ROS는 로봇으로부터 얻을 수 있는 데이터를 쉽게 확인하고 관리할 수 있도록 rqt라고 하는 모니터링 도구를 제공합니다. rqt는 GUI 개발에 쓰이는 Qt framework 기반의 ROS software framework입니다. rqt는 우리가 지금까지 노드간 관계를 확인할 때 써 오던...
    Date2015.08.08 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views7049
    Read More
  8. ROS(Robot Operating System) 개념과 활용 - 5. 바닥부터 node 작성하기

    지금까지는 기존에 있던 패키지 노드를 수정하여 사용해 왔습니다. 이번에는 노드를 아예 처음부터 새로 작성하는 법에 대해 알아보겠습니다. 또한 노드 내부에서 사용되는 ROS의 기본 구조에 대해서도 간략히 짚고 넘어가도록 하겠습니다. 노드 작성법을 간...
    Date2015.07.26 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views33231
    Read More
  9. ROS(Robot Operating System) 개념과 활용 - 4. ROS node를 이용하여 direct serial 통신하기

    ROS 노드들은 TCP/IP 프로토콜의 메시지 통신을 기반으로 데이터를 주고 받습니다. 하지만 대다수의 센서들과 MCU의 통신은 일반적인 serial 프로토콜을 이용해 통신을 하는 경우가 많습니다. 여러 용도로 편리하게 사용되는 UART 통신 또한 그러한 방식입니...
    Date2015.07.07 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views10403
    Read More
  10. 밸런싱 로봇 만들기 - 1. 하드웨어 구성

    안녕하세요? 오늘부터 "밸런싱로봇 만들기"를 포스팅할 P.M.한종인 입니다. 밸런싱 로봇 하드웨어를 제작하기 위해서는 다음과 같은 몇 가지 준비물이 필요합니다. 준비물 : 부품, 회로도, 인두, 땜납, 테프론 래핑 와이어(얇은 배선용 전선), 일반전선, 멀티...
    Date2015.07.03 Category밸런싱 로봇 By한종인 Views2692
    Read More
Board Pagination Prev 1 2 Next
/ 2