이번 실습에서는 ROS 2의 파라미터 프로그래밍(Python)을 진행했다. argument 노드의 파라미터를 확인하고 직접 값을 변경해본 뒤, YAML 파일과 Launch 파일을 이용해 파라미터를 적용하는 과정까지 실습했다.
ROS 2에서는 노드의 설정값을 파라미터(Parameter)로 관리할 수 있다.
이번 실습에서는 argument 노드에서 다음 파라미터를 사용했다.
qos_depth
min_random_num
max_random_num
argument.py에서는 다음과 같이 파라미터를 선언하고 값을 가져온다.
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)
또한 min_random_num과 max_random_num을 이용해서 랜덤한 a, b 값을 생성한다.
먼저 argument 노드를 실행했다.
source ~/robot_ws/install/setup.zsh
ros2 run topic_service_action_rclpy_example argument
새로운 터미널에서 파라미터 목록을 확인했다.
ros2 param list
실행 결과는 다음과 같았다.
/argument:
max_random_num
min_random_num
qos_depth
use_sim_time
argument 노드에 등록되어 있는 파라미터를 확인할 수 있었다.
이번에는 max_random_num의 현재 값을 확인했다.
ros2 param get /argument max_random_num
결과:
Integer value is: 9
기본값인 9가 설정되어 있는 것을 확인했다.
이번에는 max_random_num의 값을 100으로 변경했다.
ros2 param set /argument max_random_num 100
정상적으로 파라미터가 변경됐다.
그다음 min_random_num도 50으로 변경했다.
ros2 param set /argument min_random_num 50
이렇게 실행 중인 노드의 파라미터 값을 CLI를 통해 직접 변경할 수 있었다.
파라미터가 변경됐을 때 실제 값이 어떻게 반영되는지도 확인했다.
argument.py의 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)
min_random_num이나 max_random_num이 변경되면 해당 값을 self.min_random_num 또는 self.max_random_num에 반영한다.
전체적인 흐름은 다음과 같다.
ros2 param set
↓
update_parameter()
↓
파라미터 값 변경
↓
self.min_random_num / self.max_random_num에 반영
↓
랜덤값 생성 범위 변경
ROS 2에서는 여러 파라미터를 YAML 파일로 관리할 수도 있다.
이번 실습에서는 다음 파일을 확인했다.
param/arithmetic_config.yaml
파일 내용은 다음과 같았다.
/**:
ros__parameters:
qos_depth: 30
min_random_num: 0
max_random_num: 9
YAML 파일에 qos_depth, min_random_num, max_random_num을 설정해둔 것을 확인했다.
다음으로 arithmetic.launch.py를 확인했다.
Launch 파일에서는 arithmetic_config.yaml의 경로를 지정한다.
param_dir = LaunchConfiguration(
'param_dir',
default=os.path.join(
get_package_share_directory(
'topic_service_action_rclpy_example'),
'param',
'arithmetic_config.yaml'))
그리고 argument 노드에 파라미터 파일을 적용한다.
Node(
package='topic_service_action_rclpy_example',
executable='argument',
name='argument',
parameters=[param_dir],
output='screen'),
calculator 노드에도 같은 YAML 파일을 적용한다.
Node(
package='topic_service_action_rclpy_example',
executable='calculator',
name='calculator',
parameters=[param_dir],
output='screen'),
즉, Launch 파일에서 YAML 파일을 불러와 여러 노드의 파라미터를 설정하는 구조다.
마지막으로 Launch 파일을 실행했다.
처음에는 workspace를 source하지 않은 상태에서 실행해서 다음 오류가 발생했다.
Package 'topic_service_action_rclpy_example' not found
workspace를 다시 source했다.
source ~/robot_ws/install/setup.zsh
그다음 Launch 파일을 실행했다.
ros2 launch topic_service_action_rclpy_example arithmetic.launch.py
이번에는 정상적으로 실행됐다.
argument와 calculator가 함께 실행됐고, argument에서 랜덤한 a, b 값이 출력되는 것도 확인했다.
YAML 파일에 설정된 값에 따라 min_random_num: 0, max_random_num: 9 범위에서 랜덤값이 생성되는 것을 확인했다.
이번 실습에서 다음 내용을 확인했다.
ros2 param list로 파라미터 목록 확인ros2 param get으로 파라미터 값 확인ros2 param set으로 실행 중인 파라미터 변경update_parameter()를 이용한 변경값 반영argument, calculator 노드 실행특히 CLI를 이용해 실행 중인 파라미터를 변경하는 방법과 YAML 파일을 이용해 노드의 파라미터를 설정하는 방법을 직접 확인했다.