Ubuntu ROS 실습(36)

zeusqoi·6일 전

개인공부 - ubuntu

목록 보기
55/58

이번 실습에서는 ROS 2의 실행 인자 프로그래밍(Python)을 진행했다. argparse를 이용해 실행 인자를 설정하고, checker 노드 실행 시 목표 합계값을 직접 전달하는 과정을 실습했다.


1. 실행 인자란?

실행 인자는 프로그램을 실행할 때 명령어와 함께 전달하는 값이다.

이전에 checker 노드를 실행하면서 다음과 같은 명령어를 사용했었다.

ros2 run topic_service_action_rclpy_example checker -g 100

여기서 -g 100이 실행 인자다.

ros2 run
    ↓
checker 실행
    ↓
-g 100
    ↓
goal_total_sum = 100

PPT에서는 Parameter는 매개 변수, Argument는 실행 인자로 구분해서 설명하고 있다.


2. Python에서 실행 인자 처리

Python에서는 argparse 모듈을 이용해 실행 인자를 처리한다.

실행 인자를 처리하는 과정은 다음과 같다.

1. parser 만들기
        ↓
2. 인자 추가하기
        ↓
3. 인자 파싱하기
        ↓
4. args.xxx로 사용하기

checker/main.py에서는 sys.argv[1:]를 이용해 실행 인자를 전달받도록 작성되어 있다.

def main(argv=sys.argv[1:]):

그리고 ArgumentParser를 생성한다.

parser = argparse.ArgumentParser(
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

3. 실행 인자 추가하기

-g와 --goal_total_sum을 실행 인자로 등록했다.

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

여기서

  • -g : 짧은 형태
  • --goal_total_sum : 긴 형태
  • type=int : 정수형으로 처리
  • default=50 : 기본값 50
  • help : 도움말에 표시할 설명

으로 설정되어 있다.


4. 실행 인자 파싱

등록한 실행 인자는 parse_args()를 통해 분석한다.

args = parser.parse_args()

그다음 args.goal_total_sum을 이용해 실제 값을 사용할 수 있다.

checker.send_goal_total_sum(args.goal_total_sum)

즉 실행 인자로 입력한 값이 Checker의 Goal 값으로 전달된다.

전체적인 흐름은 다음과 같다.

실행 인자 입력
      ↓
argparse
      ↓
parse_args()
      ↓
args.goal_total_sum
      ↓
send_goal_total_sum()

5. 기본값으로 실행

먼저 실행 인자를 입력하지 않고 checker를 실행했다.

ros2 run topic_service_action_rclpy_example checker

이 경우 별도의 -g 값을 입력하지 않았기 때문에 goal_total_sum의 기본값인 50이 사용된다.


6. -g를 이용해 실행

이번에는 목표값을 100으로 지정해서 실행했다.

ros2 run topic_service_action_rclpy_example checker -g 100

-g 100이 실행 인자로 전달되는 것을 확인했다.

즉,

-g 100
   ↓
args.goal_total_sum = 100

의 형태로 값이 전달된다.


7. -h로 도움말 확인

실행 인자의 사용 방법을 확인하기 위해 -h 옵션도 사용했다.

ros2 run topic_service_action_rclpy_example checker -h

실행 결과:

usage: checker [-h] [-g GOAL_TOTAL_SUM] ...

positional arguments:
  argv                  Pass arbitrary arguments to the executable

options:
  -h, --help            show this help message and exit
  -g GOAL_TOTAL_SUM, --goal_total_sum GOAL_TOTAL_SUM
                        Target goal value of total sum (default: 50)

-g와 --goal_total_sum을 사용할 수 있고, 기본값이 50이라는 것을 확인할 수 있었다.


8. 긴 형태의 실행 인자 사용

짧은 형태인 -g뿐만 아니라 긴 형태인 --goal_total_sum도 사용할 수 있는지 확인했다.

ros2 run topic_service_action_rclpy_example checker --goal_total_sum 100

실행 결과에서 Arithmetic action server is not available. 경고가 출력됐지만, 이는 실행 인자 오류가 아니라 당시 calculator의 Action Server가 실행되고 있지 않았기 때문에 발생한 메시지였다.

실행 인자 자체는 정상적으로 인식되는 것을 확인했다.


9. 실행 인자가 실제로 사용되는 부분 확인

마지막으로 args.goal_total_sum이 실제 코드에서 어디에 사용되는지 확인했다.

checker.send_goal_total_sum(args.goal_total_sum)

즉 argparse로 분석한 실행 인자를 send_goal_total_sum()에 전달하고, 해당 값이 Action의 Goal 값으로 사용되는 구조다.


마무리

이번 실습을 통해 ROS 2 Python에서 실행 인자를 처리하는 방법을 확인했다.

  • sys.argv[1:]로 실행 인자 전달
  • argparse.ArgumentParser()로 parser 생성
  • add_argument()로 실행 인자 등록
  • parse_args()로 실행 인자 분석
  • args.goal_total_sum으로 값 사용
  • -g 100으로 실행 인자 전달
  • --goal_total_sum 100으로 긴 형태의 실행 인자 전달
  • -h를 이용한 실행 인자 도움말 확인

0개의 댓글