Note: This tutorial assumes that you have completed the previous tutorials: ROS 파일시스템의 탐색.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

ROS 패키지의 작성

Description: 이 자습서는 roscreate-pkg 또는 catkin을 이용해 새로운 패키지를 작성하는 방법에 대해 설명합니다. 또한 rospack을 이용해 패키지의 의존성을 확인하는 법도 알아봅니다.

Tutorial Level: BEGINNER

Next Tutorial: ROS 패키지 빌드하기

catkin 패키지는 어떻게 이루어져 있나요?

어떤 패키지를 catkin 패키지라 하기 위해서는 몇 가지 조건에 부합해야 합니다.

  • 패키지는 반드시 catkin compliant package.xml 파일을 포함해야 한다.

    • package.xml 파일은 패키지의 메타 정보를 제공하는 것입니다.
  • 패키지는 반드시 catkin에서 쓰이는 CMakeLists.txt을 포함하고 있어야 한다.

    • 이 규칙의 예외로는 CMakeLIsts.txt파일을 가지지 않는 catkin metapackages 가 있습니다.

  • 한 폴더 당 한 개의 패키지만이 대응될 수 있습니다.
    • 이는 내포된 패키지 또는 같은 폴더를 공유하는 복수의 패키지를 용납하지 않는다는 의미입니다.

가능한 패키지의 예시 중 가장 간단한 예시를 보겠습니다.

  • my_package/
      CMakeLists.txt
      package.xml

catkin 작업공간 내의 패키지들

catkin패키지에 대한 작업을 할 때 추천하는 방법은 catkin 작업공간을 사용하는 것입니다. 그러나 단일(standalone)으로 catkin패키지를 빌드할 수도 있습니다 일반적인 작업공간의 예제는 아래와 같습니다.

  • workspace_folder/        -- 작업공간
      src/                   -- 소스 폴더
        CMakeLists.txt       -- catkin이 제공하는 '최상위'의 CMake 파일,
        package_1/
          CMakeLists.txt     -- package_1에 대한 CMakeLists.txt 파일
          package.xml        -- package_1에 대한 매니패스트
        ...
        package_n/
          CMakeLists.txt     -- package_n에 대한 CMakeLists.txt 파일
          package.xml        -- package_n에 대한 매니패스트

이 자습서를 시작하기 전에 catkin에서 작업공간 만들기 자습서를 참고해 빈 catkin작업공간을 만들어 두세요.

catkin패키지 작성하기

이 자습서는 catkin_create_pkg를 어떻게 사용하는지, 만들고 난 뒤에 할 일에 대해 설명할 것입니다. catkin_create_pkg는 새로운 catkin 패키지를 만드는 스크립트입니다.

먼저 catkin에서 작업공간 만들기 자습서에서 만들어 둔 catkin 작업공간의 소스 폴더로 이동합니다.

#이 경로는 catkin에서 작업공간 만들기 자습서에서 만드셨을 것입니다.
$ cd ~/catkin_ws/src

이제 std_msgs, roscpp, rospy에 대한 의존성을 가지는 'beginner_tutorials' 패키지를 만들기 위해catkin_create_pkg 스크립트를 사용해 보겠습니다.

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

이를 수행하면 package.xmlCMakeLists.txt가 들어있는 beginner_tutorials폴더가 만들어 집니다. 여러분이 catkin_create_pkg에 주어 준 정보로 package.xml과 CMakeLists.txt의 일부가 채워집니다.

catkin_create_pkg에는 기본적으로 패키지의 이름을 입력하고 선택사항으로, 의존성을 가질 패키지들을 입력할 수도 있습니다

# 이것은 예시입니다. 그대로 따라하지 마세요.
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

catkin_create_pkg은 몇 가지 진보된 기능을 제공합니다. 이에 대한 정보는catkin/commands/catkin_create_pkg의 링크를 참고하세요.

패키지 의존성

1차 의존성

위에서 catkin_create_pkg를 사용했을 때 몇 가지 의존성 정보를 입력했었습니다. 이들을 1차 의존성이라 하고 rospack 도구를 이용해 다시 확인 할 수 있습니다.

(Jan 9, 2013) There is a bug reported and already fixed in rospack in groovy, which takes sometime until the change gets reflected on your computer. If you see a similar issue like this with the next command, you can skip to the next command.

$ rospack depends1 beginner_tutorials 
  • std_msgs
    rospy
    roscpp

보시다시피 rospack은 우리가 catkin_create_pkg을 쓸 때 입력한 의존성 목록과 일치하는 결과를 보여줍니다. 패키지의 의존성은 package.xml파일에 등록되어 있습니다.

$ roscd beginner_tutorials
$ cat package.xml
  • <package>
    ...
      <buildtool_depend>catkin</buildtool_depend>
      <build_depend>roscpp</build_depend>
      <build_depend>rospy</build_depend>
      <build_depend>std_msgs</build_depend>
    ...
    </package>

간접 의존성

많은 경우에 하나의 의존 패키지는 자체로도 의존 패키지를 가지고 있습니다. 일례로 rospy는 아래의 의존성을 가집니다.

(Jan 9, 2013) There is a bug reported and already fixed in rospack in groovy, which takes sometime until the change gets reflected on your computer. If you see a similar issue like this with the next command, you can skip to the next command.

$ rospack depends1 rospy
  • genpy
    rosgraph
    rosgraph_msgs
    roslib
    std_msgs

rospack은 재귀적으로 모든 간접 의존성을 알아낼 수 있습니다.

$ rospack depends beginner_tutorials
cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
catkin
rospack
roslib
rospy

패키지 사용자화

이 부분은 catkin_create_pkg명령이 생성한 각각의 파일들을 한줄한줄, 각각의 구성요소 별로 살펴보게 될 것입니다. 이 과정을 통해 어떻게 여러분의 패키지를 사용자화 하는지 알게 될 것입니다.

package.xml 사용자화

package.xml는 반드시 여러분이 새로 만든 패키지의 안에 있어야 합니다. 이제 package.xml안으로 들어가, 주의가 필요한 부분을 세세하게 짚어보도록 하겠습니다.

description tag

맨 먼저 description tag를 수정 해 보겠습니다.

Toggle line numbers
   5   <description>The beginner_tutorials package</description>

가능한 한줄로 요약한다는 전제를 가지고, 자유롭게 패키지에 대한 설명을 적어봅니다. 한 줄로는 설명이 어려운 경우 여러 줄로 입력하셔도 됩니다.

maintainer tags

다음은 maintainer tag에 대해 알아보겠습니다.

Toggle line numbers
   7   <!-- One maintainer tag required, multiple allowed, one person per tag --> 
   8   <!-- Example:  -->
   9   <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  10   <maintainer email="user@todo.todo">user</maintainer>

이 부분은 package.xml에서 가장 중요한 부분 중 하나입니다. 패키지의 관리자에 대한 정보가 기록 되는 부분이며 최소 한 명 이상의 정보가 입력되어야 합니다. 관리자의 이름은 태그의 몸체가 되고, 반드시 입력되어야 하는 웹메일 주소를 속성으로 가지고 있습니다.

Toggle line numbers
   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>

license tags

다음은 license tag입니다.

Toggle line numbers
  12   <!-- One license tag required, multiple allowed, one license per tag -->
  13   <!-- Commonly used license strings: -->
  14   <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  15   <license>TODO</license>

여기서 라이센스에 대한 정보를 반드시 입력해야 합니다. 자주 쓰이는 라이센스로는 BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 등이 있습니다. Open Source Initiative에서 이들에 대한 내용을 찾아보실 수 있습니다. 이 자습서에서는 ROS의 핵심 부분에서 이미 사용되고 있는 BSD라이센스를 사용합니다.

Toggle line numbers
   8   <license>BSD</license>

dependencies tags

다음은 패키지의 의존성을 알려주는 태그의 모음들을 볼 수 있습니다. 의존성 목록들은 build_depend, buildtool_depend, run_depend, test_depend에 맞추어 나누어져 있습니다. 보다 상세한 설명을 원하시면 Catkin Dependencies의 링크를 참고하시길 바랍니다. 우리는 catkin_create_pkg에서 std_msgs, roscpp, rospy를 의존성으로 정하였으므로 여기서는 아래와 같이 보일 것입니다.

Toggle line numbers
  27   <!-- The *_depend tags are used to specify dependencies -->
  28   <!-- Dependencies can be catkin packages or system dependencies -->
  29   <!-- Examples: -->
  30   <!-- Use build_depend for packages you need at compile time: -->
  31   <!--   <build_depend>genmsg</build_depend> -->
  32   <!-- Use buildtool_depend for build tool packages: -->
  33   <!--   <buildtool_depend>catkin</buildtool_depend> -->
  34   <!-- Use exec_depend for packages you need at runtime: -->
  35   <!--   <exec_depend>python-yaml</exec_depend> -->
  36   <!-- Use test_depend for packages you need only for testing: -->
  37   <!--   <test_depend>gtest</test_depend> -->
  38   <buildtool_depend>catkin</buildtool_depend>
  39   <build_depend>roscpp</build_depend>
  40   <build_depend>rospy</build_depend>
  41   <build_depend>std_msgs</build_depend>

우리가 지정한 모든 의존성이 build_depend에 있고 기본 buildtool_depend에 catkin이 있음을 확인할 수 있습니다. 우리가 지정해 둔 의존성은 빌드할 때나 실행할 때도 필요한 패키지들이기 때문에 run_depend 태그로도 등록해 둡니다.

Toggle line numbers
  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>

수정된 package.xml

위에서 수정한 부분을 주의하며 주석과 사용하지 않는 태그들을 정리하면 훨씬 간결해진 package.xml을 볼 수 있습니다.

Toggle line numbers
   1 <?xml version="1.0"?>
   2 <package format="2">
   3   <name>beginner_tutorials</name>
   4   <version>0.1.0</version>
   5   <description>The beginner_tutorials package</description>
   6 
   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>
   8   <license>BSD</license>
   9   <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  10   <author email="you@yourdomain.tld">Jane Doe</author>
  11 
  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>
  21 
  22 </package>

CMakeLists.txt의 사용자화

이제 메타 정보가 담긴 package.xml 파일이 패키지에 맞게 변형되었습니다. catkin_create_pkg 가 자동으로 만들어 낸 CMakeLists.txt를 수정하는 부분은 이후 ROS 코드를 빌드하는 자습서에서 다루게 될 것입니다.

이제 새로운 ROS패키지가 만들어 졌습니다. 다음 자습서로 이동합니다. ROS 패키지 빌드하기

Wiki: ko/ROS/Tutorials/CreatingPackage (last edited 2013-07-03 13:55:55 by elitechrome)