파라미터/실행인자 프로그래밍

Hyuna·2024년 10월 22일
1

ROS2

목록 보기
9/15
post-thumbnail

📕 참고: ROS2로 시작하는 로봇 프로그래밍, topic_service_action_rclpy_example




파라미터


파라미터란 노드의 동작을 제어하는 설정값으로, 노드 내부의 특정 동작에 대한 설정을 저장하고 관리한다.

각 노드는 독립적인 파라미터 서버를 통해 자신의 파라미터를 관리하고 노드 동작을 제어할 수 있다.
ex_calculator 에서 파라미터는 퍼블리셔와 서브스크라이버를 가지고 있는 argumentcalculator 노드에서 분산된 형태로 존재한다.

✔ declare_parameter(선언)

노드에서 사용할 파라미터의 고유 이름을 지정하고 초깃값을 설정한다

✔ get_parameter(읽기)

노드에서 사용할 파라미터 값을 불러온다

✔ add_on_set_parameters_callback(변경)

파라미터 변경 요청이 있을 때 사용된다

argument

✔ 파라미터 선언


class Argument(Node):

    def __init__(self):
        super().__init__('argument')
        self.declare_parameter('qos_depth', 10)
        qos_depth = self.get_parameter('qos_depth').value
        self.declare_parameter('min_random_num', 0)
        self.min_random_num = self.get_parameter('min_random_num').value
        self.declare_parameter('max_random_num', 9)
        self.max_random_num = self.get_parameter('max_random_num').value
        self.add_on_set_parameters_callback(self.update_parameter)  
  • self.declare_parameter('qos_depth',10) : qos_depth 라는 파라미터 이름을 선언하고 기본값을 10으로 지정
  • qos_depth = self.get_parameter('qos_depth').value : 선언된 qos_depth 값을 가져와 qos_depth 변수에 저장
  • qos_depth를 그냥 사용한 이유는 해당 메서드 내에서면 사용하는 임시 변수(로컬 변수)이기 때문
  • self.add_on_set_parameters_callback(self.update_parameter) : 파라미터가 변경될 때마다 호출되는 콜백 함수 등록

✔ 파라미터 업데이트 콜백

def update_parameter(self, params):
    for param in params:
        if param.name == 'min_random_num' and param.type_ == Parameter.Type.INTEGER:
            self.min_random_num = param.value
        elif param.name == 'max_random_num' and param.type_ == Parameter.Type.INTEGER:
            self.max_random_num = param.value
    return SetParametersResult(successful=True)
  • params : 변경된 파라미터 목록
  • 'min_random_num' 이 변경되면 self.min_random_num 을 새로운 값으로 업데이트
  • Parameter.Type.INTEGER : 파라미터 타입이 정수형인지 확인



파라미터 CLI 설정

  1. 파라미터 존재하는 노드를 실행시킨다.
    ros2 run ex_calculator argument

  2. 파라미터 목록을 확인한다.
    ros2 param list

  3. 파라미터 CLI를 사용한다.
    ros2 param get /argument max_randim_num : 해당 파라미터 값을 가져온다.

ros2 param set /argument max_random_num 1000 : 해당 파라미터 기본 설정값을 변경한다.





실행인자(argument)


프로그램의 실행 명령어와 함께 인수를 추가하여 프로그램을 실행할 때 사용되는 인자를 실행인자라고 한다. 입력을 미리 정의할 수 없을 때, 실행인자로 외부로부터 입력을 받아 프로그램에 사용할 수 있다.

ros2 run ex_calculator checker -g 100
: ex_calculator 패키지의 checker 노드에 추가로 -g 100 실행인자를 사용했다는 뜻이 된다.


  • 프로그래밍에서의 파라미터(Parameter) : 함수나 메서드를 정의할 때 사용되는 변수 이름이다.
  • ROS2에서의 파라미터(Parameter) : 노드의 동작을 제어하는 설정값이다.
    여기서는 프로그래밍에서의 파라미터 의미에 가깝다.

def add(x,y) 에서 x,y는 파라미터
def add(2,3) 에서 2,3은 실행인자이다.


사용 용어

✔ argc(argument count)

  • 프로그램 실행 시 전달된 인자의 총 개수

✔ argv

  • 인자들을 문자열 배열로 저장하는 포인터
  • C,C++ 등 에서 기본적인 명령줄 인자 처리 방식

✔ args

  • Python에서 argcargv 대신 sys.argv 를 사용하는 명령 줄 인자 처리 리스트



실행인자 처리

💡 parser : argument를 파싱하여 프로그램 내에서 사용할 수 있도록 해석하고 처리하는 도구

1. 파서 만들기

  • ArgumentParser 클래스의 인스턴스를 생성한다.
  • 명령줄 인자를 정의하고 파싱하는 역할을 한다.
  • 파싱 = 실행인자로 전달된 값을 프로그램에서 사용 가능한 형태로 변환
def main(argv=sys.argv[1:]):
    parser = argparse.Argument(
        formatter_class=argparse.ArgumentDefaultsHelpForamtter)

2. 인자 추가하기

  • add_argument 메서드를 이용하여 실행 인자를 정의한다.
parse.add_argument(
    '-g', #단축형 이름
    '--goal_total_sum', #전체이름
    type=int, #데이터타입
    default=50, #기본값
    help='Target goal value of total sum')
    # --help 도움말 실행시 볼 수 있는 문구

3. 인자 파싱하기

  • parse_args 메서드를 호출하여 명령줄에서 전달된 인자를 파싱하고 Namespace 객체로 반환한다.
args = parser.parse_args()

4. 인자 사용하기

  • args.xxx 로 인자를 사용할 수 있다.
checker.send_goal_total_sum(args.goal_total_sum)

add.argument 에서 정의했던 -goal_total_sum 으로 접근하여 사용할 수 있다.

0개의 댓글