프로그램 실행 시 옵션으로 인수를 추가하여 실행하는 경우가 있다. 이때에 사용되는 인자를 실행 인자 라고 하며, 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는 함수 호출 시의 인자이다.
ROS2에서의 실행 인자 처리에 대해 알아보자. 파이썬에서 인수들을 무시할 때에는 다음 예제와 같이 args
를 None
으로 설정한 후에 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)
(이하 생략)
실행 인자의 구문 해석고 관련한 부분은 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 모듈을 이용하여 파서를 선언한 후 사용할 실행 인자를 지정하게 된다. 이를 순서대로 나열하면 다음과 같다.
- 파서 만들기(parser = argparse.ArgumentParser)
- 인자 추가하기(parser.add_argument)
- 인자 파싱하기(args = parser.parse_args())
- 인자 사용하기(args.xxx)
우선 argsparse 모듈의 ArgumentParse 클래스를 parser 변수로 선언하자. 여기서 formatter_class 는 argparse 모듈의 가장 기본적인 형식을 사용하도록 설정하였다.
def main(argv=sys.argv[1:]):
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
다음으로 인자를 추가하는 방법에 대해 알아보자. 실행 인자로 사용할 인자를 추가하려면 다음과 같이 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')
사용할 인자를 추가했으면 parse_args() 메소드를 통해 인자를 파싱하면 된다. 사용 방법은 다음과 같이 매우 간단하다. 이것으로 간단한 사용을 위한 기본 설정은 모두 끝났다.
args = parser.parse_args()
인자에 접근하려면 다음과 같이 인자를 파싱하여 대입한 args 변수를 사용해야 한다. 예를 들어 add_argument 를 통해 인자로 추가했던 --goal_total_sum
은 args.goal_total_sum
으로 접근할 수 있다.
checker.send_goal_total_sum(args.goal_total_sum)
실행 인자 프로그램을 끝으로 ROS2 파이썬 프로그래밍에 대해 알아보았다.
다음 시간부터는 ROS2 C++ 프로그래밍에 대해 알아보겠다.