동적 프레임 추가
저작권: 쿼드(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',
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