(k, 4)
형태의 bounding box 데이터 (x
, y
, w
, h
)를 publish하기 위해 ros2 pkg create
명령어를 사용하여 새 ROS2 패키지를 생성하는 것ros2 pkg create --build-type ament_cmake <패키지_이름>
ros2 pkg create --build-type ament_cmake nav_temp_interfaces
msg 폴더를 생성합니다.
BoundingBoxArray
msg
디렉토리를 생성하고, 그 안에 BoundingBoxArray.msg
파일을 생성합니다.# BoundingBoxArray.msg
float32[] x
float32[] y
float32[] width
float32[] height
x
, y
좌표와 너비(width
), 높이(height
)를 나타내는 실수형 배열을 포함합니다. 각 배열의 길이는 bounding box의 개수(k
)와 동일합니다.CMakeLists.txt
파일을 수정find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(builtin_interfaces REQUIRED)
:builtin_interfaces
패키지는 ROS 2 시스템에서 기본적으로 제공되는 메시지 타입과 서비스 타입의 집합time
, duration
)을 포함find_package(rosidl_default_generators REQUIRED)
rosidl_default_generators
는 ROS 2 인터페이스 정의 언어(IDL) 파일(.msg, .srv, .action)로부터,REQUIRED
키워드는 이 패키지가 없으면 프로젝트 빌드가 불가능함을 의미합니다.rosidl_generate_interfaces()
함수 호출rosidl_generate_interfaces(${PROJECT_NAME}
"msg/MyCustomMessage.msg"
DEPENDENCIES builtin_interfaces sensor_msgs
)
ament_export_dependencies(rosidl_default_runtime)
추가하기 ROS2 패키지가 메시지, 서비스, 액션 정의에서 생성된 코드를 사용할 수 있도록 하며,
이러한 의존성을 ROS2 생태계 내의 다른 패키지와 올바르게 공유하고 관리할 수 있게 함
package.xml
파일을 수정 <build_depend>builtin_interfaces</build_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>builtin_interfaces</exec_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
package.xml
파일에서 각 태그는 패키지의 다양한 종류의 의존성과 그룹 멤버십을 선언하는 데 사용<build_depend>
<build_depend>builtin_interfaces</build_depend>
: builtin_interfaces
패키지에 의존한다는 것을 나타냄builtin_interfaces
는 ROS 2에서 기본 제공하는 메시지 타입들을 포함하고 있는 패키지로, builtin_interfaces
의 타입을 사용하는 경우에 필요<buildtool_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
: rosidl_default_generators
패키지를 빌드 도구로서 의존한다는 것을 나타냄rosidl_default_generators
는 ROS 2 인터페이스 정의 언어(IDL) 파일들로부터 코드를 생성하기 위한 기본 도구들을 포함<exec_depend>
<exec_depend>builtin_interfaces</exec_depend>
: builtin_interfaces
패키지에 대한 의존성을 나타냄builtin_interfaces
에 정의된 메시지 타입들을 사용할 수 있어야 함을 의미builtin_interfaces
가 제공하는 타입들이 필요할 때 필요<exec_depend>rosidl_default_runtime</exec_depend>
: rosidl_default_runtime
패키지에 대한 의존성을 나타냄rosidl
로 생성된 인터페이스 코드가 런타임에 필요함을 의미 <member_of_group>
<member_of_group>rosidl_interface_packages</member_of_group>
: rosidl_interface_packages
그룹의 멤버임을 선언 import rclpy
from rclpy.node import Node
from your_package_name.msg import BoundingBoxArray # your_package_name를 실제 패키지 이름으로 변경하세요.
class BoundingBoxPublisher(Node):
def __init__(self):
super().__init__('bounding_box_publisher')
self.publisher_ = self.create_publisher(BoundingBoxArray, 'bounding_boxes', 10)
self.timer = self.create_timer(0.5, self.timer_callback) # 0.5초마다 실행
def timer_callback(self):
msg = BoundingBoxArray()
msg.x = [1.0, 2.0] # 예시 데이터
msg.y = [1.0, 2.0]
msg.width = [1.0, 2.0]
msg.height = [1.0, 2.0]
self.publisher_.publish(msg)
self.get_logger().info('Publishing Bounding Box Array')
def main(args=None):
rclpy.init(args=args)
node = BoundingBoxPublisher()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
이 코드는 BoundingBoxArray
메시지 타입을 이용하여 bounding box 데이터를 주기적으로 publish하는 노드의 기본적인 구조를 보여줍니다. 실제 사용 시에는 bounding box 데이터를 생성하거나 계산하는 로직을 timer_callback
메서드 내에 구현해야 합니다.
source /opt/ros/<ros2_distro>/setup.bash
colcon build
명령어를 사용하여 빌드cd ~/PycharmProjects/nl_navigation2 # 워크스페이스 루트로 이동
colcon build --packages-select nav_temp_interfaces # 'nav_temp_interfaces' 패키지 빌드
혹은
colcon build
source install/setup.bash
). "ROS 2 패키지 내"란, ROS 2에서 개발을 진행하는 특정 패키지의 루트 디렉토리를 의미합니다. ROS 2 패키지는 특정 기능이나 모듈을 구현하기 위한 코드, 메시지 정의, 서비스 정의, 파라미터 파일, 빌드 및 실행을 위한 설정 파일 등을 포함하는 디렉토리 구조입니다. 각 패키지는 독립적으로 빌드되고 실행될 수 있으며, 다른 패키지와의 의존성을 정의할 수 있습니다.
패키지 내부의 구조는 일반적으로 다음과 같습니다:
src/
디렉토리: 패키지의 소스 코드를 포함하는 디렉토리입니다. C++ 또는 Python 코드 파일들이 이곳에 위치합니다.msg/
디렉토리: 사용자 정의 메시지 타입 정의 파일들을 포함하는 디렉토리입니다. 이곳에 .msg
파일을 생성하여 메시지 타입을 정의합니다.srv/
디렉토리: 사용자 정의 서비스 타입 정의 파일들을 포함하는 디렉토리입니다. .srv
파일을 이용하여 서비스 타입을 정의합니다.CMakeLists.txt
: 빌드 설정을 포함하는 CMake 프로젝트 파일입니다. ROS 2 패키지 빌드 시 사용됩니다.package.xml
: 패키지의 메타데이터와 의존성 정보를 포함하는 XML 파일입니다.예를 들어, my_robot_interfaces
라는 이름의 ROS 2 패키지를 생성한 경우, 패키지의 디렉토리 구조는 대략 다음과 같을 수 있습니다:
my_robot_interfaces/
├── CMakeLists.txt
├── package.xml
├── msg/
│ └── BoundingBoxArray.msg
└── src/
여기서 "ROS 2 패키지 내에 msg
디렉토리를 생성하고, 그 안에 BoundingBoxArray.msg
파일을 생성합니다."라는 지시는, 위의 디렉토리 구조에서 my_robot_interfaces/msg/
디렉토리 안에 BoundingBoxArray.msg
파일을 생성하라는 의미입니다.