실행 인자 프로그래밍(Python)

두부김치·2024년 2월 17일
1

ROS2

목록 보기
22/29

1. 실행 인자

프로그램 실행 시 옵션으로 인수를 추가하여 실행하는 경우가 있다. 이때에 사용되는 인자를 실행 인자 라고 하며, main 함수에서 매개변수를 통해 접근할 수 있다.

예를 들어 앞전의 패키지설계(Python) 를 살펴보면 다음과 같은 명령어를 통해 GOAL_TOTAL_SUM 값을 100으로 설정할 수 있었다. 여기서 ros2 run 이 ROS2 노드 실행 명령어이고 그 뒤 인자는 topic_service_action_rclpy_example 패키지의 checker 노드를 실행하라는 의미이다. 여기에 추가로 -g 100 이 노드 실행 인자로 사용되었다. 이번 장에서는 실행 시에 사용되는 실행 인자를 이용한 프로그래밍에 대해 알아볼 것이다.

$ ros2 run topic_service_action_rclpy_example checker -g 100

참고로 파라미터(parameter)는 매개변수, 아규먼트(Argument)는 실행 인자라 풀이한다. Parameter는 함수 선언 시 사용되고 Argument는 함수 호출 시의 인자이다.

2. ROS2에서의 실행 인자 처리

ROS2에서의 실행 인자 처리에 대해 알아보자. 파이썬에서 인수들을 무시할 때에는 다음 예제와 같이 argsNone으로 설정한 후에 rclpy 모듈의 init 함수에 바로 넘기게 된다.

def main(args=None):
    rclpy.init(args=args)
    (이하 생략)

만약 실행 인자를 사용하고자 한다면 실행명 및 실행 경로를 뺀 나머지를 argv(Argument vector)에 매개변수에 저장하고, 이를 rclpy 모듈의 init 함수의 args(Arguments) 매개변수로 넘기게 된다. 그리고 argparse 모듈을 이용하여 실행 인자를 위한 구문 해석 프로그램을 작성해야한다.

def main(argv=sys.argv[1:]):
    (argparse 구문 추가)
    rclpy.init(args=argv)
    (이하 생략)

3. 실행 인자의 구문 해석

실행 인자의 구문 해석고 관련한 부분은 Checker 노드의 main 함수 부분에서 구현되어 있기에 관련 코드를 살펴보자. 전체 소스코드는 다음과 같다.

import argparse
import sys

import rclpy

from topic_service_action_rclpy_example.checker.checker import Checker


def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument(
        '-g',
        '--goal_total_sum',
        type=int,
        default=50,
        help='Target goal value of total sum')
    parser.add_argument(
        'argv', nargs=argparse.REMAINDER,
        help='Pass arbitrary arguments to the executable')
    args = parser.parse_args()

    rclpy.init(args=args.argv)
    try:
        checker = Checker()
        checker.send_goal_total_sum(args.goal_total_sum)
        try:
            rclpy.spin(checker)
        except KeyboardInterrupt:
            checker.get_logger().info('Keyboard Interrupt (SIGINT)')
        finally:
            checker.arithmetic_action_client.destroy()
            checker.destroy_node()
    finally:
        rclpy.shutdown()


if __name__ == '__main__':
    main()

실행 인자의 구문해석 프로그램은 파이썬의 argparse 모듈을 이용하여 파서를 선언한 후 사용할 실행 인자를 지정하게 된다. 이를 순서대로 나열하면 다음과 같다.

  1. 파서 만들기(parser = argparse.ArgumentParser)
  2. 인자 추가하기(parser.add_argument)
  3. 인자 파싱하기(args = parser.parse_args())
  4. 인자 사용하기(args.xxx)

3.1 파서 만들기

우선 argsparse 모듈의 ArgumentParse 클래스를 parser 변수로 선언하자. 여기서 formatter_class 는 argparse 모듈의 가장 기본적인 형식을 사용하도록 설정하였다.

def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)

3.2 인자 추가하기

다음으로 인자를 추가하는 방법에 대해 알아보자. 실행 인자로 사용할 인자를 추가하려면 다음과 같이 add_argument 함수를 호출하고 해당 함수의 매개변수를 채운다. 다음 예제에서는 간략한 인자 이름으로 -g, 상세한 인자 이름으로 --goal_total_sum을 사용한다고 선언하였고, 자료 형태는 int, 기본 값은 50을 지정하였고, 간단히 지정 인자에 대한 설명을 넣어주었다. 이 설명은 프로그램을 -h , --help 와 같은 실행인자를 붙여 실행했을 때 프로그램에 대한 도움말과 함께 출력된다.

parser.add_argument(
        '-g',
        '--goal_total_sum',
        type=int,
        default=50,
        help='Target goal value of total sum')

3.3 인자 파싱하기

사용할 인자를 추가했으면 parse_args() 메소드를 통해 인자를 파싱하면 된다. 사용 방법은 다음과 같이 매우 간단하다. 이것으로 간단한 사용을 위한 기본 설정은 모두 끝났다.

  args = parser.parse_args()

3.4 인자 사용하기

인자에 접근하려면 다음과 같이 인자를 파싱하여 대입한 args 변수를 사용해야 한다. 예를 들어 add_argument 를 통해 인자로 추가했던 --goal_total_sumargs.goal_total_sum 으로 접근할 수 있다.

checker.send_goal_total_sum(args.goal_total_sum)

실행 인자 프로그램을 끝으로 ROS2 파이썬 프로그래밍에 대해 알아보았다.
다음 시간부터는 ROS2 C++ 프로그래밍에 대해 알아보겠다.

profile
Robotics

0개의 댓글