서론
이전 글에서 노드(Node)에 대해 이해해 보았다.
2024.10.29 - [ROS/ROS2] - [ROS2] 004 : ROS2 노드(Node)와 데이터
[ROS2] 004 : ROS2 노드(Node)와 데이터
서론이전 글에서 demo_nodes_cpp, turtlesim을 실행해 보며 노드, 토픽, 서비스, 액션 등을 조회해 보았다. 2024.10.29 - [ROS/ROS2] - [ROS2] 002 : ROS2 예제 (demo_nodes, turtlesim) [ROS2] 002 : ROS2 예제 (demo_nodes, turtlesim)
menggu1234.tistory.com
이제 패키지(Package)와 패키지 생성, 노드 작성에 대해 설명해 보겠다.
1. 패키지(Package)란?
패키지는 ROS에서 코드와 리소스를 조직화, 관리하는 기본 단위이다. ROS2 패키지는 로봇 개발을 위한 코드, 실행 파일, 메시지 정의, 설정 파일 등을 모아 구조화할 수 있게 해 준다. 일반적인 ROS2 패키지에는 아래와 같은 요소가 포함된다.
패키지의 주요 구성 요소 (C++ 기준)
- 패키지 이름 : ROS2 패키지는 고유한 이름을 가지며, 다른 패키지와의 충돌을 방지하기 위해 신중하게 작성하는 것이 중요하다. 또한 ROS2에서는 패키지 이름을 정할 때 지켜야 하는 규정을 제시하고 있다. https://ros.org/reps/rep-0144.html 해당 링크에서 상세한 내용을 확인할 수 있다.
- 패키지 관리 파일(package.xml) : 패키지의 메타데이터 파일로, 다음과 같은 정보를 포함한다.
- 패키지 이름, 버전
- 작성자, 유지 보수자 정보
- 의존성 정보
- 라이선스
- 빌드 파일(CMakeLists.txt) : 패키지 빌드를 위한 설정 파일로, CMake를 통해 컴파일 옵션, 의존성 설정, 빌드 타겟 등을 정의한다. ROS2 패키지의 경우 ament_cmake 빌드 시스템을 사용한다.
- 소스 코드(src 폴더) : src 폴더는 노드와 라이브러리 등의 소스 코드를 저장하는 폴더이다.
2. ROS2 패키지의 장점
- 모듈화된 구조 : 여러 노드와 리소스를 하나의 패키지로 관리할 수 있어 개발과 유지보수가 용이하다.
- 의존성 관리 : package.xml 파일에 패키지 간의 의존성을 명시함으로써 빌드 시 필요한 의존성을 자동으로 설치할 수 있다.
- 재사용성 : 특정 기능을 수행하는 패키지를 여러 프로젝트에서 재사용할 수 있어 개발 시간을 절약할 수 있다.
- 배포 용이성 : ROS2 패키지는 다른 사용자나 로봇에 쉽게 배포할 수 있는 형태로 구성되어 있어, ROS2 환경 내에서 공유와 협업이 원활하다.
3. C++ ROS2 패키지 생성
ROS2 C++ 패키지를 생성하기 위해서는 아래 단계를 따르면 된다.
$ cd ~/colcon_ws/src
$ ros2 pkg create --build-type ament_cmake 패키지이름
--build-type 옵션은 Python, C++ 등 빌드 종류를 선택하는 옵션이다. ament_cmake를 통해서 C++용 패키지를 생성하였다. 추후 Python 패키지/노드 작성 방법도 포스트하겠다.
예제를 위해서 my_cpp_pkg라는 이름의 패키지를 생성해 주었다.
$ cd ~/colcon_ws/src
$ ros2 pkg create --build-type ament_cmake my_cpp_pkg
이제 생성한 패키지에 C++로 노드를 작성해야 한다.
우선 소스 코드 작성이다. touch 명령어를 통해 my_cpp_node.cpp 파일을 생성해준다.
$ cd ~/colcon_ws/src/my_cpp_pkg
$ mkdir src
$ touch src/my_cpp_node.cpp # my_cpp_node.cpp 파일 생성
이제 생성한 my_cpp_node.cpp 파일에 아래와 같은 코드를 작성한다.
#include "rclcpp/rclcpp.hpp"
class MyCppNode : public rclcpp::Node
{
public:
MyCppNode() : Node("my_cpp_node")
{
RCLCPP_INFO(this->get_logger(), "Hello, ROS 2 C++ Node!");
}
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<MyCppNode>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
my_cpp_node는 MyCppNode라는 클래스를 정의하고 RCLCPP_INFO()를 통해 로그를 출력하는 노드이다.
이제 CMakeLists.txt를 수정하여 CMake 설정이 필요하다.
CMakeLists.txt 파일은 ~/colcon_ws/src/my_cpp_node/에 위치하고 있다. 파일을 열어 아래와 같이 수정한다.
find_package(rclcpp REQUIRED)
add_executable(my_cpp_node src/my_cpp_node.cpp)
ament_target_dependencies(my_cpp_node rclcpp)
install(TARGETS
my_cpp_node
DESTINATION lib/${PROJECT_NAME})
위 설정은 my_cpp_node.cpp파일을 my_cpp_node라는 이름의 executable 파일로 빌드하도록 한다.
마지막으로 package.xml 파일을 수정하여 패키지의 정보, 빌드 의존성 등을 정의할 수 있다.
package.xml 파일 역시 ~/colcon_ws/src/my_cpp_node/에 위치하고 있다. 파일을 열어 아래와 같이 수정한다.
<?xml version="1.0"?>
<package format="3">
<name>my_cpp_pkg</name>
<version>0.0.1</version>
<description>ROS 2 package with a C++ node example</description>
<maintainer email="you@example.com">Your Name</maintainer>
<license>MIT</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rclcpp</build_depend>
<exec_depend>rclcpp</exec_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>std_msgs</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
</package>
패키지를 빌드하여 my_cpp_node를 실행해 볼 수 있다.
패키지 빌드는 아래와 같이 진행한다.
$ cd ~/colcon_ws
$ colcon build --packages-select my_cpp_pkg # 워크스페이스의 my_cpp_pkg만 빌드
패키지 실행은 아래와 같이 할 수 있다.
$ source ~/colcon_ws/install/setup.bash # 워크스페이스 환경 설정
$ ros2 run my_cpp_pkg my_cpp_node # my_cpp_node 실행
정상적으로 실행된다면 아래와 같은 결과를 얻을 수 있다.
[INFO] [my_cpp_node]: Hello, ROS 2 C++ Node!
'ROS > ROS2' 카테고리의 다른 글
[ROS2] 007 : ROS2 launch 파일 작성 (0) | 2024.10.31 |
---|---|
[ROS2] 006 : ROS2 QT GUI C++ 패키지, 노드 작성 (2) | 2024.10.31 |
[ROS2] 004 : ROS2 노드(Node)와 데이터 (0) | 2024.10.29 |
[ROS2] 002 : ROS2 예제 (demo_nodes, turtlesim) (0) | 2024.10.29 |
[ROS2] 003 : ROS2 명령어 정리 (0) | 2024.10.29 |