CLI(command line interface)
ros2 [verbs] [sub-verbs] [options] [arguments]
verbs: 동작을 지정하며, 수행할 작업의 유형을 나타냄 --> run, topic, service etc...
sub-verbs: 특정 동작에 대한 세부 동작을 지정, --> verbs=topic일 경우 pub, echo, list 등이 올수 있음
options: 명령어의 시행 방식을 설정하는 추가 파라미터
arguments: 실행할 때 필요한 인수를 지정, 특정 노드의 이름이나 토픽의 이름, 서비스 이름 등이 올 수 있음
-h 옵션을 이용하면 verbs, sub-verbs, option 등에 대하여 더 자세히 알 수 있음
--> $ ros2 -h

1) ROS2 CLI + arguments

2) 정보 명령어 - ROS2 CLI + sub_verbs



3) ROS2 CLI + verbs + sub_verbs



$ ros2 run <pkg name> <node_name>
$ ros2 pkg create <pkg_name> --build-type ament_python/cmake --dependencies rclpy/rclcpp std_msgs ... # pkg 빌드
$ ros2 pkg executables <pkg_name> # 패키지에 포함된 실행 파일 목록을 확인
$ ros2 pkg list # 설치된 패키지 및 본인이 직접 작성한 패키지 중 사용 가능한 모든패키지의 목록을 확인
$ ros2 pkg prefix <pkg_name> # 패키지의 저장 위치를 확인
$ ros2 pkg xml <pkg_name> # 패키지의 xml파일 확인



$ ros2 node list # 실행중인 모든 노드의 목록을 확인
$ ros2 node info /<node_name> # node의 노드 정보 확인

$ ros2 topic bw /<topic_name> # 토픽의 대역폭 사용량을 확인
$ ros2 topic echo /<topic_name> # 토픽의 메시지를 출력
$ ros2 topic find <interface_name> # 특정 인터페이스 타입의 토픽을 찾음
$ ros2 topic hz /<topic_name> # 토픽의 퍼블리싱 주기를 확인 (Hz)
$ ros2 topic info /<topic_name> # 토픽의 정보 확인 (타입, 퍼블리셔/구독자 수 등)
$ ros2 topic list # 현재 사용 가능한 모든 토픽 나열
$ ros2 topic list -t # 토픽과 해당 타입을 함께 나열
$ ros2 topic pub /<topic_name> <interface_name> '{<argument>}' --once # 한 번만 토픽에 메시지 퍼블리시
$ ros2 topic pub /<topic_name> <interface_name> '{<argument>}' --rate 1 # 1Hz로 주기적으로 퍼블리시


$ ros2 service call /<service_name> <interface_name> '{<arguments>}' # 특정 서비스 호출, 인수를 JSON 형식으로 전달
$ ros2 service find <interface_name> # 특정 인터페이스 타입을 사용하는 서비스 찾기
$ ros2 service list # 현재 사용 가능한 모든 서비스 나열
$ ros2 service list -t # 서비스와 해당 타입을 함께 나열
$ ros2 service type /<service_name> # 특정 서비스의 인터페이스 타입 확인

$ ros2 action info /<action_node> # 특정 액션 서버에 대한 정보를 확인
$ ros2 action list # 현재 사용 가능한 모든 액션 서버 나열
$ ros2 action list -t # 액션 서버와 해당 타입을 함께 나열
$ ros2 action send_goal /<action_node> <interface_name> '{<arguments>}' # 지정한 액션 서버에 목표(goal)를 JSON 형식으로 전송

$ ros2 interface list # 현재 사용 가능한 모든 인터페이스 타입(Srv, Msg, Action)을 나열
$ ros2 interface package <pkg_name> # 패키지에서 제공하는 인터페이스를 나열
$ ros2 interface packages # 인터페이스를 제공하는 모든 패키지를 나열
$ ros2 interface proto <interface_name> # 지정한 인터페이스의 프로토타입(Proto) 내용을 출력 (IDL 파일 형식)
$ ros2 interface show <interface_name> # 지정한 인터페이스의 구조(필드 및 타입)를 출력

$ ros2 param list # 현재 실행 중인 모든 노드의 파라미터를 나열
$ ros2 param get <node_name> <parameter> # 지정한 노드에서 특정 파라미터의 값을 가져옴
$ ros2 param set <node_name> <parameter> <value> # 지정한 노드의 특정 파라미터 값을 설정
$ ros2 param describe <node_name> <parameter> # 특정 노드의 파라미터에 대한 설명(형태, 목적, 인터페이스 형태, 최소/최댓값)을 확인
$ ros2 param delete <node_name> <parameter> # 지정한 노드에서 특정 파라미터를 삭제
$ ros2 param dump /<node_name> # 지정한 노드의 모든 파라미터를 YAML 형식으로 저장, 특정 이름을 지정하지 않으면 지정한 노드 이름으로 파일 생성

$ ros2 bag record -o <file_name> <topic> # 특정 토픽의 데이터를 <file_name> 이름으로 기록
$ ros2 bag record -o <file_name> -a # 모든 토픽의 데이터를 <file_name> 이름으로 기록
$ ros2 bag info <file_name> # 기록된 bag 파일의 정보(저장된 토픽, 메시지 수 등)를 확인
$ ros2 bag play <file_name> # 기록된 bag 파일의 데이터를 재생하여 토픽에 퍼블리시

$ ros2 extensions # 현재 설치된 extension의 간단한 목록 표시
$ ros2 extensions -a # 로드에 실패하거나 호환되지 않는 extension 표시
$ ros2 extension_points # 현재 사용 가능한 extension_points 목록을 표시
$ ros2 daemon start
$ ros2 daemon status
$ ros2 daemon stop

$ ros2 multicast receive # 단일 udp 멀티 캐스트 패킷 수신
$ ros2 multicast send # 단일 udp 멀티 캐스트 패킷 송신

$ ros2 doctor hello # 네트워크 연결 확인
$ ros2 doctor -r # report, 체크한 모든 아이템 확인
$ ros2 doctor -rf # report-fail, 체크 시 실패한 아이템 확인
$ ros2 doctor -iw # include-warnings, 경고성 아이템 확인
아래는 turtlesim을 실행후 doctor-iw를 실행한 결과

$ ros2 wtf hello
$ ros2 wtf -r
$ ros2 wtf -rf
$ ros2 wtf -iw
| 상태 | 설명 |
|---|---|
| Unconfigured | 노드가 초기화되지 않은 상태, 노드가 자원을 할당, 초기화하는 작업을 수행하지 않음 |
| Inactive | 노드가 초기화되었지만 활성화되지 않음, 노드는 자원을 할당하고 준비하지만 실제로 데이터를 처리하거나 외부와 상호작용하지 않음 |
| Active | 노드가 활성화된상태, 데이터 처리 및 메시지 발행/구독과 같은 작업을 수행하지 못함 |
| Finalized | 노드가 종료된 상태, 노드가 자원을 해제하고 모든 작업을 마무리 |
# 실행 중인 노드의 라이프사이클 상태 가져오기
# <node_name>을 원하는 노드의 이름으로 변경하여 실행합니다.
ros2 lifecycle get <node_name>
# 특정 노드의 라이프사이클 상태 및 전이 가능 상태 목록 확인
# <node_name>을 원하는 노드의 이름으로 변경하여 실행합니다.
ros2 lifecycle list <node_name>
# 현재 ROS 2 시스템에 있는 모든 노드와 그들의 라이프사이클 상태 목록 확인
ros2 lifecycle nodes
# 특정 노드를 'configure' 상태로 전환
# <node_name>을 원하는 노드의 이름으로 변경하여 실행합니다.
ros2 lifecycle set <node_name> configure



# 실행 중인 컴포넌트 목록 출력
ros2 component list
# 특정 컴포넌트를 로드하기 위한 명령어
# <component_name>을 로드하고자 하는 컴포넌트의 이름으로 변경합니다.
ros2 component load / <component_name>
# 현재 실행 중인 컴포넌트를 독립 실행형으로 실행
# <component_name>을 독립 실행형으로 실행하고자 하는 컴포넌트의 이름으로 변경합니다.
ros2 component standalone <component_name>
# 사용 가능한 컴포넌트 타입 목록 출력
ros2 component types
# 특정 컴포넌트를 언로드하기 위한 명령어
# <component_name>을 언로드하고자 하는 컴포넌트의 이름으로 변경합니다.
ros2 component unload <component_name>



# 보안키 저장소 생성
$ ros2 security create_keystore demo_keystore
# 보안키 생성
$ ros2 security create_enclave demo_keystore /talker_listener/talker
$ ros2 security create_enclave demo_keystore /talker_listener/listener
# 환경 변수 선언(default 값 선언)
$ export ROS_SECURITY_KEYSTORE=~/ros_study/turtle/demo_keystore
$ export ROS_SECURITY_STRATEGY=Enforce
$ export ROS_SECURITY_ENABLE=true
