YAML은 Yet Another Markup Language(또 다른 마크업 언어)의 약자로 사람이 읽을 수 있는 데이터 직렬화 언어입니다. 데이터 직렬화에 쓰이는 언어는 xml, json 등이 있습니다. ROS와 홈어시스턴트에 대한 글에서 한번씩 사용했는데 xml은 ROS에서 패키지 설정 파일(package.xml)로 사용되었고 json은 홈어시스턴트 통합 구성요소의 설정 파일(manifest.json)로, yaml 파일은 ROS의 파라미터 파일과 홈어시스턴트 설정 파일(configuration.yaml)로 사용되었습니다.
비교해보면 yaml 파일이 xml, json에 비하여 가독성이 좋다는 것을 확인할 수 있습니다.
yaml 파일의 자료형은 스칼라(Scalar), 시퀀스(Sequence), 맵핑(Mapping)으로 구성됩니다.
스칼라(Scalar) 자료형은 문자열(String)이나 숫자(Number)입니다. 문자열은 큰 따온표("")나 작은 따온('')로 구분하기도 합니다.
맵핑(Mapping) 자료형은 해시(Hash) 또는 딕셔너리(Dictionary) 형식입니다. 콜론(:)으로 키(key)와 값(value)를 구분하며 콜론 뒤에는 공백을 반드시 넣어야합니다. 중괄호 { }를 통해서도 작성가능합니다. 노드는 2개의 공백이나 4개의 공백으로 구분됩니다.
예시: robot: {name: sopt, age: 4, manufacture : "Boston Dynamics"} |
robot: name: spot
age: 4 manufacture : "Boston Dynamics" |
시퀀스(Sequence) 자료형은 배열(array) 또는 리스트(list) 형식입니다. 대시(-)를 통해 표시하며, 대괄호 [ ] 를 통해서도 작성가능합니다.
예시:
ros2_interface: [msg, srv, action] |
ros2_interface: - msg - srv - action |
불린(Boolean) 자료형은 yes / no 또는 true / false 또는 on / off 를 통해 표현가능합니다.
예시:
is_robot: yes is_default: false auto_start: on |
주석(Comment)은 # 태그를 붙이면 되지만 데이터 표현 중심인 yaml 에서는 주석을 권장하지는 않습니다.
예시:
ros2_interface: # ROS2 interface - msg # topic interface - srv # service interface - action # action interface |
반복되는 노드는 앰퍼샌드(&)를 붙여 별칭(alias)을 선언하고 별표(*)를 붙여 별칭을 나타냅니다.
예시:
interface: &ROS2 - msg - srv - action ros2: *ROS2 |
이제 yaml 파일을 작성하고 파이썬을 통해 데이터를 불러오도록 해봅시다. pip3을 통해 pyyaml 패키지를 설치합시다.
yaml 파일을 생성하고 다음과 같이 작성해보세요.
$ touch example.yaml && xed example.yaml |
# example YAML file. interface: &ROS2# ROS2 interface - msg # topic interface - srv # service interface - action # action interface ros2: *ROS2 |
파이썬 파일을 생성하고 다음과 같이 작성하세요.
$ touch example.py && xed example.py |
import yaml with open('example.yaml', 'r') as f: print(yaml.load(f)) |
파이썬을 실행해보세요. |