이번 포스팅에서는 ROS2 CLI(Command Line Interface) 명령어, 그리고 ROS2 개발에 유용하게 사용할 수 있는 개발 도구인 RQt에 대해서 알아보자.
참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/24191
https://cafe.naver.com/openrt/24231
ROS2에서 CLI를 사용하려면 다음과 같다.
$ ros2 <verbs> <sub-verbs> <options> <args>
여담으로 이러한 CLI는 tab을 통해서 자동 완성이 가능하다.
즉, 쉽게 사용할 수 있다는 뜻이다.
그리고 제대로 된 명령어가 기억나지 않는다면 -h 옵션을 통해서 도움말이나 사용법, CLI 정보를 확인할 수 있다.
$ ros2 -h
$ ros2 node -h
$ ros2 node info -h
CLI 명령어들을 하나씩 살펴보면 다음과 같이. 솔직히 말해서 다 외우는 것은 말이 안되고, 필요할 때 찾아서 사용하고 자주 사용하는 것만 익숙해져도 충분하다고 생각한다.
$ ros2 run <package> <node_name>
// 단, node에 따라 복 노드를 내부적으로 실행 가능
$ ros2 launch <package> <launch_file>
- ros2 pkg create : 새로운 패키지 생성
- ros2 pkg executables : 지정 패키지의 실행 파일 목록 출력
- ros2 pkg list : 사용 가능한 패키지 목록 출력
- ros2 pkg prefix : 지정 패키지의 저장 위치 출력
- ros2 pkg xml : 지정 패키지의 패키지 정보 파일 출력
- ros2 node info : 실행 중인 노드 중 지정한 노드 정보 출력
- ros2 node list : 실행 중인 모든 노드의 정보 출력
- ros2 topic bw : 지정 토픽의 대역폭 출력
- ros2 topic delay : 지정 토픽의 지연시간 측정
- ros2 topic echo : 지정 토픽의 데이터 출력
- ros2 topic find : 지정 타입을 사용하는 토픽 이름 출력
- ros2 topic hz : 지정 토픽의 주기 측정
- ros2 topic info : 지정 토픽의 정보 출력
- ros2 topic list : 사용 가능한 토픽 목록 출력
- ros2 topic pub : 지정 토픽의 발행
- ros2 topic type : 지정 토픽의 타입 출력
- ros2 service call : 지정 서비스의 서비스 요청 전달
- ros2 service find : 지정 서비스 타입의 서비스 출력
- ros2 service list : 사용 가능한 서비스 목록 출력
- ros2 service type : 지정 서비스의 타입 출력
- ros2 actcion info : 지정 액션의 정보 출력
- ros2 action list : 사용 가능한 액션 목록 출력
- ros2 action send_goal : 지정 액션의 액션 목표 전송
- ros2 interface list : 사용 가능한 모든 인터페이스 목록 출력
- ros2 interface package : 특정 패키지에서 사용 가능한 인터페이스 목록 출력
- ros2 interface packages : 인터페이스 패키지들의 목록 출력
- ros2 interface proto : 지정 패키지의 프로토타입 출력
- ros2 interface show : 지정 인터페이스의 데이터 형태 출력
- ros2 param delete : 지정 파라미터 삭제
- ros2 param describe : 지정 파라미터 정보 출력
- ros2 param dump : 지정 파라미터 저장(yaml 파일)
- ros2 param get : 지정 파라미터 읽기
- ros2 param list : 사용 가능한 파라미터 목록 출력
- ros2 param set : 지정 파라미터 쓰기
- ros2 bag info : 저장된 rosbag 정보 출력
- ros2 bag play : rosbag 재생
- ros2 bag record : bag 파일 저장
- ros2 extensions - a
- ros2 extensions -v
ROS2 CLI의 Extensions 출력
- ros2 extension_points -a
- ros2 extension_points -v
ROS2 extension point 목록 출력
- ros2 daemon start : daemon 시작
- ros2 daemon status : daemon 상태 보기
- ros2 daemon stop : daemon 정지
- ros2 multicast receive : 수신
- ros2 multicast send : 송신
- ros2 doctor hello (-r)
- ros2 doctor hello (-rf)
- ros2 doctor hello (-iw)
ROS 설정 및 네트워크, 패키지 버젼, RMW(ROS MiddleWare)와 같은 잠재적 문제를 진단하기 위해서 도입된 도구이다.
- ros2 wtf hello (-r)
- ros2 wtf hello (-rf)
- ros2 wtf hello (-iw)
doctor와 동일한 역할을 수행한다.
- ros2 lifecycle get : 라이프 사이클 정보 출력
- ros2 lifecycle list : 지정 노드의 사용 가능한 상태 천이 목록 출력
- ros2 lifecycle nodes : 라이프 사이클을 사용하는 노드 목록 출력
- ros2 lifecycle set : 라이프 사이클 상태 전환 트리거
- ros2 component list : 실행 중인 컨테이너와 컴포넌트 목록 출력
- ros2 component load : 지정 컨테이너 노드의 특정 컴포넌트 실행
- ros2 component standalone : 표준 컨테이너 노드로 특정 컴포넌트 실행
- ros2 component types : 사용 가능한 컴포넌트 목록 출력
- ros2 component unload : 지정 컴포넌트의 실행 중지
- ros2 security create_key : 보안키 생성
- ros2 security create_keysore : 보안키 저장소 생성
- ros2 security create_permission : 보안 허가 파일 생성
- ros2 security generate_artifacts : 보안 정책 파일을 이용해 보안키 및 보안 허가 파일 생성
- ros2 security generate_policy : 보안 정책 파일(policy.xml) 생성
- ros2 security list_keys : 보안키 목록 출력
💡 RQt란?
RQt는 플러그인(plugin) 형태로 다양한 도구와 인터페이스를 구현할 수 있는 ROS의 GUI 프레임워크인 동시에, 다양한 목적의 GUI 툴들을 집합시켜놓은 ROS 종합 GUI 툴박스(toolbox)라고 할 수 있다.
프레임워크기 때문에 다양한 기능들을 API 형태로 제공하며, 동시에 내가 개발한 GUI 툴들을 플러그인 형태로 쉽게 추가할 수 있다는 장점을 가지고 있다.

$ rqt
위 명령어를 통해서 실행하면 다음과 같이 텅 빈 화면이 나오는데, 여기서 왼쪽 상단의 플러그인 메뉴에 접속하여 원하는 기능을 쉽게 실행할 수 있다. 예를 들어, 플러그인 메뉴에서,
Plugins -> Topics -> Topic Monitor
를 차례대로 실행하면 다음과 같은 화면을 확인할 수 있다.

혹은 CLI를 통해서도 실행이 가능하다.
$ ros2 run rqt_msg rqt_msg
이런 식으로 자주 쓰는 플러그인은 외워두고 CLI 명령어를 통해서 사용이 가능하다.
또 다른 방법으로는 단축 명령어를 사용하면 된다.
가장 대표적으로 쓰이는, 가장 많이 쓰이는, 노드 및 메시지 통신 사이의 관계를 도식화 하는 명령어는 다음과 같다.
$ rqt_graph
RQt 플러그인들의 종류에 대해서는, 다 적는 것은 현실적으로 어려우므로 다음 링크를 참조하면 된다. 또한 각종 플러그인들에 대한 사용 예시 역시 해당 링크를 참조하면 된다.
https://cafe.naver.com/openrt/24231
예를 들어, RQt 플러그인을 통해서 Node 간의 그래프를 그리면 다음과 같다.

또, RQt 플러그인을 통해서 그래프(plot)를 그리면 다음과 같다.

거기에 웹캠 등의 영상 데이터가 토픽으로 발행되고 있을 경우(이때 인터페이스는 sensor_msgs/msg/Image를 사용한다), 이것 역시 RQt를 통해서 이미지를 확인할 수 있다. 만약 웹캠 등이 없다면 다음 명령어를 실행해보자.
$ ros2 run image_tools cam2image --ros-args -p burger_mode:=true
그리고 rqt를 통해서 image_view를 켜면 다음 화면을 확인할 수 있다.
