인공지능 요모조모
[ROS2] ROS2 CLI 본문
🖥️ ROS2 CLI(Command Line Interface)
▪️터미널 명령어를 통해 다양한 노드 제어와 시스템 정보 조회, 패키지 실행 지원
📌 기본 구조
ros2 [verbs] [sub-verbs] [options] [arguments]
verbs
: 동작 유형 (예:topic
,node
,run
)sub-verbs
: 세부 동작 (예:list
,info
,echo
)options
: 실행 방식 설정 (예:-h
,--ros-args
)arguments
: 대상 패키지, 노드, 토픽 등의 이름
✅ -h
옵션으로 모든 명령어에 대한 도움말 확인 가능!
📌 자주 사용하는 명령어
✅ 노드 실행
ros2 run <package> <executable>
예:ros2 run turtlesim turtlesim_node
✅ 런치 파일 실행
ros2 launch <package> <launch_file>
예:ros2 launch demo_nodes_cpp talker_listener.launch.py
📌 이외 명령어
📦 ROS2 CLI + verbs + sub-verbs
ros2cli + verbs | sub-verbs | arguments | 기능 |
ros2 run | - | <package> <executable> | 특정 패키지의 노드 실행 |
ros2 launch | - | <package> <launch_file> | 런치 파일을 통해 복수 노드 실행 |
ros2 pkg | create | <package> [--build-type ament_cmake | ament_python] [--dependencies ...] |
새로운 ROS2 패키지 생성 |
executables | <package> |
지정 패키지의 실행 파일 목록 출력 | |
list | 사용 가능한 패키지 목록 출력 | ||
prefix | <package> | 지정 패키지의 저장 위치 출력 | |
xml | <package> | 지정 패키지의 패키지 정보 파일(xml) 출력 | |
ros2 node | info | <node> | 실행 중인 노드 중 지정 노드의 정보 출력 |
list | 실행 중인 모든 노드의 목록 출력 | ||
ros2 topic | bw | <topic> | 지정 토픽의 대역폭 측정 |
delay | <topic> | 지정 토픽의 지연시간 측정 | |
echo | <topic> | 지정 토픽의 데이터 출력 | |
hz | <topic> | 지정 토픽의 주기 측정 | |
info | <topic> | 지정 토픽의 정보 출력 | |
list | 사용 가능한 토픽 목록 출력 | ||
pub | <topic> <msg_type> '<data>' [--rate N] [--once] [--times N] |
지정 토픽의 토픽 발행 | |
type | <topic> | 지정 토픽의 토픽 타입 출력 | |
ros2 service | call | <service> <srv_type> '<args>' | 지정 서비스의 서비스 요청 전달 |
find | <srv_type> | 지정 서비스 타입의 서비스 출력 | |
list | 사용 가능한 서비스 목록 출력 | ||
type | <service> | 지정 서비스의 타입 출력 | |
ros2 action | info | <action> | 지정 액션의 정보 출력 |
list | 사용 가능한 액션 목록 출력 | ||
send_goal | <action> <action_type> '{goal}' [--feedback] [--result] |
지정 액션의 액션 목표 전송 | |
ros2 interface | list | 사용 가능한 인터페이스 목록 출력 | |
package | <package> | 특정 패키지에서 사용 가능한 인터페이스 목록 출력 | |
packages | 인터페이스 패키지들의 목록 출력 | ||
proto | <interface_type> | 지정 패키지의 프로토타입 출력 | |
show | <interface_type> | 지정 인터페이스의 데이터 형태 출력 | |
ros2 param | delete | <node> <parameter> | 지정 파라미터 삭제 |
describe | <node> <parameter> | 지정 파라미터 정보 출력 | |
dump | <node> | 지정 파라미터 저장 | |
get | <node> <parameter> | 지정 파라미터 읽기 | |
list | [<node>] | 사용 가능한 파라미터 목록 출력 | |
set | <node> <parameter> <value> | 지정 파라미터 쓰기 | |
ros2 bag | info | <bag_file> | 저장된 rosbag 정보 출력 |
play | <bag_file> | rosbag 재생 | |
record | [<topic1> <topic2> ...] [-a|--all] [-o <output_dir>] [--include-hidden-topics] |
rosbag 기록 |
📦 ROS2 CLI + verbs + sub-verbs(옵션)
ros2cli + verbs | sub-verbs (options) |
arguments | 기능 |
ros2 extensions | (-a) (-v) |
ros2cli의 extension 목록/상세 정보 출력 (ros2cli개발용으로 사용, 일반적 사용 x) |
|
ros2 extension_points |
(-a) (-v) |
ros2cli의 extension point 목록/상세 정보 출력 (ros2cli개발용으로 사용, 일반적 사용 x) |
|
ros2 daemon | start | daemon 시작 | |
status | 현재 daemon 실행 여부 확인 | ||
stop | daemon 정지 | ||
ros2 multicast | receive | multicast 수신 | |
send | multicast 전송 | ||
ros2 doctor | hello (-r) (-rf) (-iw) |
진단 시작 ROS 설정 점검 RMW 미들웨어 + FastRTPS 설정 포함 점검 Info + Warning만 필터 출력 → ROS 설정 및 네트워크, 패키지 버전, rmw 미들웨어 등과 같은 잠재적 문제를 확인하는 도구 |
|
ros2 wtf | hello (-r) (-rf) -iw) |
doctor와 동일 (ros2 doctor의 alias) (WTF: Where's The Fire) |
|
ros2 lifecycle | get | <node> | 라이프사이클 정보 출력 |
list | 지정 노드의 사용 가능한 상태 전이 목록 출력 | ||
nodes | 라이츠사이클을 사용하는 노드 목록 출력 | ||
set | <node> <transition> | 라이프사이클 상태 전환 수행 | |
ros2 component | list | 실행 중인 컨테이너와 컴포넌트 목록 출력 | |
load | <container_node> <package> <plugin> | 지정 컨테이너 노드의 특정 컴포넌트 실행 | |
standalone | <package> <plugin> | 표준 컨테이너 노드로 특정 컴포넌트 실행 | |
types | 사용 가능한 컴포넌트들의 목록 출력 | ||
unload | <container_node> <component_id> |
지정 컴포넌트의 실행 중지 | |
ros2 security | create_key | 보안키 생성 | |
create_keystore | <directory> | 보안키 저장소 생성 | |
create_permission | <node> | 보안 허가 파일 생성 | |
generate_artifacts | 보안 정책 파일을 이용하여 보안키 및 보안 허가 파일 생성 |
||
generate_policy | 보안 정책 파일(policy.xml) 생성 | ||
list_keys | 보안키 목록 출력 |
📌 기타 CLI 예시
패키지 정보
ros2 pkg executables turtlesim
노드 정보
ros2 node info /turtlesim
ROS2 노드 실행 시 파라미터 설정
ros2 run turtlesim turtlesim_node --ros-args \
-r __node:=my_turtle \
-r turtle1/cmd_vel:=cmd_vel \
-p background_b:=0
파라미터 파일 사용 예시
ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml
turtlesim.yaml
예시:
turtlesim:
ros__parameters:
background_r: 0
background_g: 250
background_b: 250
use_sim_time: false
📌 신규 CLI 작성
기존에 없던 새로운 CLI 명령어(verb)를 만들고 실행하기 위함!
✅ 실습 (ros2 env
만들기)
$ tree
# 출력
ros2env/
├── command/
│ └── env.py # 메인 명령어 엔트리 포인트
├── verb/
│ ├── list.py # 서브 명령어 list
│ ├── set.py # 서브 명령어 set
│ └── init.py # Verb 등록
├── api/
│ └── init.py # 환경변수 처리 로직
├── setup.py # entry_points 등록
(1) command/env.py
▪️메인 명령어 진입점: ros2 env
▪️EnvCommand
클래스가 핵심
▪️주요 메서드:
▫️add\_arguments()
: 서브명령어 연결
▫️main()
: 실행 진입점
class EnvCommand(CommandExtension):
def add_arguments(self, parser, cli_name):
...
def main(self, *, parser, args):
...
(2) verb/list.py
▪️ros2 env list
명령어 구현
▪️환경 변수 종류별 출력 기능
class ListVerb(VerbExtension):
def add_arguments(self, parser, cli_name):
parser.add_argument("-a", "--all", action="store_true", help="...")
def main(self, *, args):
if args.all:
print(get_all_env_list())
(3) verb/set.py
▪️ros2 env set <VAR> <VAL>
형식으로 환경변수 설정
▪️set\_ros\_env(name, value)
사용
class SetVerb(VerbExtension):
def add_arguments(self, parser, cli_name):
parser.add_argument("env_name")
parser.add_argument("value")
def main(self, *, args):
set_ros_env(args.env_name, args.value)
(4) api/__init__.py
▪️실제 환경 변수 처리 함수 구현부
def get_ros_env_list():
return f"ROS_DISTRO={os.getenv('ROS_DISTRO')}"
def set_ros_env(name, value):
os.environ[name] = value
return f"{name} set to {value}"
(5) setup.py
▪️CLI 확장을 등록하는 핵심 파일
entry_points = {
'ros2.cli.command': [
'env = ros2env.command.env:EnvCommand',
],
'ros2env.verb': [
'list = ros2env.verb.list:ListVerb',
'set = ros2env.verb.set:SetVerb',
],
}
✅ 실행
# 환경변수 출력
ros2 env list --all
# ROS_DISTRO 환경변수 설정
ros2 env set ROS_DISTRO humble
📌 alias 설정으로 CLI 단축
# ~/.bashrc 파일에 추가
alias tn='ros2 run turtlesim turtlesim_node'
alias tt='ros2 run turtlesim turtle_teleop_key'
alias testpub='ros2 run demo_nodes_cpp talker'
alias testsub='ros2 run demo_nodes_cpp listener'
alias rt='ros2 topic list'
alias re='ros2 topic echo'
alias rn='ros2 node list'
# 변경사항 적용
$ source ~/.bashrc
📌 Intra-process Communication (IPC)
복수 노드를 하나의 머신에서 실행할 때,
ROS2는 IPC
(Intra-Process Communication)를 통해 불필요한 데이터 복사와 성능 저하 문제 해결 가능
✅ 일반 통신 흐름
publisher
가 메시지 생성DDS
가 데이터를 복사해 송신subscriber
가 수신하여 다시 복사
→ 대용량 데이터일 경우 성능 저하와 메모리 낭비 발생
✅ IPC + Zero-Copy 구조
publisher
가 메시지를 생성 후 Shared Memory(SHM)에 저장DDS
가 데이터를 네트워크 전송 없이 주소만 참조 형태로 전달subscriber
는 복사 없이 직접 데이터 참조- 하나의 데이터 → 복수 subscriber가 함께 읽을 수 있음 (Zero-Copy)
** 개인 메모
실습 시 토픽 메시지가 2개 생성되지만 주소는 하나로 유지되는 이유는?
→ 실습 후 메모리 주소 확인하고 Slack에 질문하기!
'ROKEY > ROS2' 카테고리의 다른 글
[ROS2] ROS2 Security (0) | 2025.05.02 |
---|---|
[ROS2] ROS2 Lifecycle (0) | 2025.05.01 |
[ROS2] 기초 개념(2) (0) | 2025.04.23 |
[ROS2] 기초 개념 (1) (0) | 2025.04.23 |
[ROS2] BAG (0) | 2025.04.22 |