(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 폴더를 생성합니다.
BoundingBoxArraymsg 디렉토리를 생성하고, 그 안에 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.bashcolcon 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 파일을 생성하라는 의미입니다.