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를 수정 해 보겠습니다.

   5   <description>The beginner_tutorials package</description>

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

maintainer tags

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

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

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

license tags

다음은 license tag입니다.

  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라이센스를 사용합니다.

   8   <license>BSD</license>

dependencies tags

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

  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 태그로도 등록해 둡니다.

  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을 볼 수 있습니다.

   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 코드를 빌드하는 자습서에서 다루게 될 것입니다.

Wiki: ko/ROS/Tutorials/catkin/CreatingPackage (last edited 2021-01-02 07:57:00 by Taeyoung Noh)