동적 프레임 추가

저작권: 쿼드(QUAD) 드론연구소 https://smartstore.naver.com/maponarooo / Updated : 2024-10-11

2. 동적 프레임 추가하기

앞의 튜토리얼에서 게시한 프레임은 부모 프레임과 관련하여 시간이 지나도 변하지 않는 고정 프레임입니다. 그러나 움직이는 프레임을 게시하려면 브로드캐스터를 코딩하여 시간이 지남에 따라 프레임을 변경할 수 있습니다. carrot1프레임을 변경하여 시간이 지남에 따라 프레임에 따라 변경되도록 합시다. 이전 튜토리얼에서 만든 패키지 turtle1로 이동합니다 . learning_tf2_pysrc/learning_tf2_py/learning_tf2_py디렉토리 내에서 다음 명령을 입력하여 동적 프레임 브로드캐스터 코드를 다운로드합니다.

wget https://raw.githubusercontent.com/ros/geometry_tutorials/ros2/turtle_tf2_py/turtle_tf2_py/dynamic_frame_tf2_broadcaster.py

이제 dynamic_frame_tf2_broadcaster.py 파일을 엽니다 .

import math

from geometry_msgs.msg import TransformStamped

import rclpy
from rclpy.node import Node

from tf2_ros import TransformBroadcaster


class DynamicFrameBroadcaster(Node):

    def __init__(self):
        super().__init__('dynamic_frame_tf2_broadcaster')
        self.tf_broadcaster = TransformBroadcaster(self)
        self.timer = self.create_timer(0.1, self.broadcast_timer_callback)

    def broadcast_timer_callback(self):
        seconds, _ = self.get_clock().now().seconds_nanoseconds()
        x = seconds * math.pi

        t = TransformStamped()
        t.header.stamp = self.get_clock().now().to_msg()
        t.header.frame_id = 'turtle1'
        t.child_frame_id = 'carrot1'
        t.transform.translation.x = 10 * math.sin(x)
        t.transform.translation.y = 10 * math.cos(x)
        t.transform.translation.z = 0.0
        t.transform.rotation.x = 0.0
        t.transform.rotation.y = 0.0
        t.transform.rotation.z = 0.0
        t.transform.rotation.w = 1.0

        self.tf_broadcaster.sendTransform(t)


def main():
    rclpy.init()
    node = DynamicFrameBroadcaster()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass

    rclpy.shutdown()

2.1 코드 검토

x와 y 오프셋을 고정된 값으로 정의하는 대신, 현재 시간에 sin(), cos()함수를 사용하여 carrot1오프셋 이 지속적으로 변경되도록 했습니다.

seconds, _ = self.get_clock().now().seconds_nanoseconds()
x = seconds * math.pi
...
t.transform.translation.x = 10 * math.sin(x)
t.transform.translation.y = 10 * math.cos(x)

2.2 진입점 추가

ros2 run명령이 노드를 실행하도록 하려면 ( src/learning_tf2_py디렉토리에 있는)setup.py에 진입점을 추가해야 합니다.

다음 줄을 'console_scripts':괄호 안에 추가하세요.

'dynamic_frame_tf2_broadcaster = learning_tf2_py.dynamic_frame_tf2_broadcaster:main',

2.3 실행 파일 작성

turtle_tf2_dynamic_frame_demo.launch.py이 코드를 테스트하려면 디렉토리 src/learning_tf2_py/launch에 새 실행 파일을 만들고 다음 코드를 붙여넣습니다.

import os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource

from launch_ros.actions import Node


def generate_launch_description():
    demo_nodes = IncludeLaunchDescription(
        PythonLaunchDescriptionSource([os.path.join(
            get_package_share_directory('learning_tf2_py'), 'launch'),
            '/turtle_tf2_demo.launch.py']),
       launch_arguments={'target_frame': 'carrot1'}.items(),
       )

    return LaunchDescription([
        demo_nodes,
        Node(
            package='learning_tf2_py',
            executable='dynamic_frame_tf2_broadcaster',
            name='dynamic_broadcaster',
        ),
    ])

2.4 빌드

작업 공간 루트에서 실행하여 누락된 종속성을 확인합니다.

rosdep install -i --from-path src --rosdistro humble -y

작업 공간 루트에서 패키지를 빌드하세요.

colcon build --packages-select learning_tf2_py

새 터미널을 열고 작업 공간 루트로 이동한 후 설치 파일을 소싱합니다.

. install/setup.bash

2.5 실행

이제 동적 프레임 데모를 시작할 수 있습니다.

ros2 launch learning_tf2_py turtle_tf2_dynamic_frame_demo.launch.py

두 번째 거북이가 당근의 위치를 ​​계속 바꾸고 있는 것을 볼 수 있습니다.

Last updated