ROS2 Tutorial (Basic)
  • 교육 안내
  • ROS2 개요
  • ROS2 환경 구성
  • turtlesim, ROS2 rqt
  • 노드(Node) 이해하기
  • 토픽(Topic) 이해하기
  • 서비스(Service) 이해하기
  • 파라메터(Parameter) 이해하기
  • 액션(Action) 이해하기
  • rqt_console 을 이용해 로그 보기
  • 노드 실행하기(launch)
  • 데이터 기록 및 재생
  • ROS2 프로그래밍 시작
  • 작업공간 만들기
  • 패키지 만들기
  • 간단한 게시자와 구독자 노드 만들기
  • 간단한 서비스 및 클라이언트 작성
  • 사용자 정의 msg 및 srv 파일 생성
  • 사용자 정의 인터페이스 구현
  • 파라메터 사용하기
  • 문제 식별에 ros2doctor 사용하기
Powered by GitBook
On this page
  • 개요
  • 실습
  • 1. 패키지 생성
  • 2. Python 노드 작성
  • 3. 빌드 및 실행

Was this helpful?

Export as PDF

파라메터 사용하기

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

Previous사용자 정의 인터페이스 구현Next문제 식별에 ros2doctor 사용하기

Last updated 1 year ago

Was this helpful?

개요

자체 만들 때 때때로 시작 파일에서 설정할 수 있는 매개변수를 추가해야 합니다.

이 자습서에서는 Python 클래스에서 이러한 매개 변수를 생성하는 방법과 시작 파일에서 매개 변수를 설정하는 방법을 보여줍니다.

실습

1. 패키지 생성

ros2명령이 작동하도록 새 터미널을 열고

패키지는 작업 영역의 루트가 아닌 src디렉터리 에 만들어야 한다는 점을 기억하십시오 . 새 패키지를 ros2_ws/src로 이동하여 생성합니다.

ros2 pkg create --build-type ament_python python_parameters --dependencies rclpy

터미널은 패키지 python_parameters와 필요한 모든 파일 및 폴더 생성을 확인하는 메시지를 반환합니다.

인수 --dependencies는 필요한 종속성 줄을 package.xml및 CMakeLists.txt에 자동으로 추가합니다 .

1.1 업데이트

패키지 생성 중에 이 --dependencies옵션을 사용했으므로 수동으로 package.xml또는 CMakeLists.txt에 종속성을 추가할 필요가 없습니다 .

하지만 항상 그렇듯이 설명, 관리자 이메일, 이름, 라이선스 정보를 에 추가해야 합니다 package.xml.

<description>Python parameter tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>

2. Python 노드 작성

ros2_ws/src/python_parameters디렉터리 내에서 python_parameters_node.py라는 새 파일을 만들고 다음 코드를 붙여넣습니다.

import rclpy
import rclpy.node

class MinimalParam(rclpy.node.Node):
    def __init__(self):
        super().__init__('minimal_param_node')

        self.declare_parameter('my_parameter', 'world')

        self.timer = self.create_timer(1, self.timer_callback)

    def timer_callback(self):
        my_param = self.get_parameter('my_parameter').get_parameter_value().string_value

        self.get_logger().info('Hello %s!' % my_param)

        my_new_param = rclpy.parameter.Parameter(
            'my_parameter',
            rclpy.Parameter.Type.STRING,
            'world'
        )
        all_new_parameters = [my_new_param]
        self.set_parameters(all_new_parameters)

def main():
    rclpy.init()
    node = MinimalParam()
    rclpy.spin(node)

if __name__ == '__main__':
    main()

2.1 코드 검토

상단의 import명령문은 패키지 종속성을 가져오는 데 사용됩니다 .

다음 코드는 클래스와 생성자를 만듭니다. 생성자의 행은 이름 과 기본값이 인 매개변수를 생성합니다 . 매개변수 유형은 기본값에서 유추되므로 이 경우 문자열 유형으로 설정됩니다. self.declare_parameter('my_parameter', 'world')다음으로 초기화되어 함수 my_parameterworldtimertimer_callback가 1초에 한 번 실행됩니다.

class MinimalParam(rclpy.node.Node):
    def __init__(self):
        super().__init__('minimal_param_node')

        self.declare_parameter('my_parameter', 'world')

        self.timer = self.create_timer(1, self.timer_callback)

timer_callback함수 의 첫 번째 줄은 노드에서 매개변수를 가져 와서 에 저장합니다. 다음으로 함수는 이벤트가 기록되는지 확인합니다. 그런 다음 함수 는 my_parameter매개변수를 다시 기본 문자열 값으로 설정합니다 . 사용자가 매개변수를 외부에서 변경한 경우 항상 원래대로 재설정 되도록 합니다.

def timer_callback(self):
    my_param = self.get_parameter('my_parameter').get_parameter_value().string_value

    self.get_logger().info('Hello %s!' % my_param)

    my_new_param = rclpy.parameter.Parameter(
        'my_parameter',
        rclpy.Parameter.Type.STRING,
        'world'
    )
    all_new_parameters = [my_new_param]
    self.set_parameters(all_new_parameters)

다음은 우리의main입니다 . 여기에서 ROS2가 초기화되고 MinimalParam클래스의 node 인스턴스가 구성되며 노드에서 데이터 처리를 시작합니다.

def main():
    rclpy.init()
    node = MinimalParam()
    rclpy.spin(node)

if __name__ == '__main__':
    main()

2.1.1 파라메터 설명자 추가

선택적으로 매개변수에 대한 설명자를 설정할 수 있습니다. 디스크립터를 사용하면 매개변수에 대한 텍스트 설명과 읽기 전용으로 설정, 범위 지정 등과 같은 제약 조건을 지정할 수 있습니다. 작동하려면 __init__코드를 다음과 같이 변경해야 합니다.

# ...

class MinimalParam(rclpy.node.Node):
    def __init__(self):
        super().__init__('minimal_param_node')

        from rcl_interfaces.msg import ParameterDescriptor
        my_parameter_descriptor = ParameterDescriptor(description='This parameter is mine!')

        self.declare_parameter('my_parameter', 'world', my_parameter_descriptor)

        self.timer = self.create_timer(1, self.timer_callback)

나머지 코드는 동일하게 유지됩니다. /minimal_param_node노드를 실행하면 my_parameter유형 및 설명을 보기 위해 실행할 수 있습니다.

2. 진입점 추가

package.xml, setup.py파일을 엽니다 . 다시 description, maintainer,license및 maintainer_email필드 를 다음과 일치시킵니다 .

maintainer='YourName',
maintainer_email='you@email.com',
description='Python parameter tutorial',
license='Apache License 2.0',

entry_points필드 console_scripts의 대괄호 안에 다음 줄을 추가합니다 .

entry_points={
    'console_scripts': [
        'minimal_param_node = python_parameters.python_parameters_node:main',
    ],
},

저장하는 것을 잊지 마십시오.

3. 빌드 및 실행

rosdep작업 공간의 루트( ros2_ws)에서 실행하여 빌드하기 전에 누락된 종속성을 확인하는 것이 좋습니다 .

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

작업 공간의 루트ros2_ws로 돌아가서 새 패키지를 빌드합니다.

colcon build --packages-select python_parameters

새 터미널을 열고 ros2_ws로 이동하여 설정 파일을 소싱합니다.

source install/setup.bash

이제 노드를 실행합니다.

ros2 run python_parameters minimal_param_node

터미널은 매초 다음 메시지를 반환해야 합니다.

[INFO] [parameter_node]: Hello world!

이제 매개변수의 기본값을 볼 수 있지만 직접 설정할 수 있기를 원합니다. 이를 수행하는 방법에는 두 가지가 있습니다.

3.1 콘솔을 통한 변경

노드가 실행 중인지 확인합니다.

ros2 run python_parameters minimal_param_node

다른 터미널을 열고 ROS2 환경을 다시 소싱한 후 다음 행을 입력하십시오.

ros2 param list

거기에 맞춤 매개변수my_parameter가 표시됩니다 . 이를 변경하려면 콘솔에서 다음 행을 실행하십시오.

ros2 param set /minimal_param_node my_parameter earth

출력을 얻을 경우 잘 실행되었다는 것을 알고 있습니다 . 다른 터미널을 보면 출력이 다음으로 변경되는 것을 볼 수 있습니다.Set parameter successful[INFO] [minimal_param_node]: Hello earth!

나중에 노드가 매개변수를 다시 world로 설정하므로 추가 출력이 표시됩니다. [INFO] [minimal_param_node]: Hello world!

3.2 런치 파일을 통한 변경

시작 파일에서 매개변수를 설정할 수도 있지만 먼저 시작 디렉터리를 추가해야 합니다. ros2_ws/src/python_parameters/디렉토리 안에 launch이라는 새 디렉토리를 만듭니다. 거기에 python_parameters_launch.py라는 새 파일을 만듭니다.

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='python_parameters',
            executable='minimal_param_node',
            name='custom_minimal_param_node',
            output='screen',
            emulate_tty=True,
            parameters=[
                {'my_parameter': 'earth'}
            ]
        )
    ])

아래 두 줄을 추가하여 출력이 콘솔에 출력되도록 합니다.

output="screen",
emulate_tty=True,

이제 setup.py파일을 엽니다. 파일 맨 위에 import명령문을 추가 하고 모든 실행 파일을 포함하도록 다른 새 명령문을 data_files매개변수에 추가하십시오.

import os
from glob import glob
# ...

setup(
  # ...
  data_files=[
      # ...
      (os.path.join('share', package_name), glob('launch/*launch.[pxy][yma]*')),
    ]
  )

콘솔을 열고 작업 공간의 루트ros2_ws로 이동하여 새 패키지를 빌드합니다.

colcon build --packages-select python_parameters

그런 다음 새 터미널에서 설정 파일을 소싱합니다.

source install/setup.bash

이제 방금 만든 실행 파일을 사용하여 노드를 실행합니다.

ros2 launch python_parameters python_parameters_launch.py

터미널은 매초 다음 메시지를 반환해야 합니다.

[INFO] [custom_minimal_param_node]: Hello earth!

에서 얻은 지식을 사용 하고 방금 만든 노드에 적용합니다.

노드를
ROS2 환경을 소싱합니다.
이 부분에서는 매개변수에 대한 자습서