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