Notice
Recent Posts
Recent Comments
Link
반응형
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

인공지능 요모조모

[ROS2] ROS2 CLI 본문

ROKEY/ROS2

[ROS2] ROS2 CLI

dvl.hyeon_ 2025. 5. 2. 00:33
반응형

🖥️ 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)를 통해 불필요한 데이터 복사와 성능 저하 문제 해결 가능

✅ 일반 통신 흐름

  1. publisher가 메시지 생성
  2. DDS가 데이터를 복사해 송신
  3. subscriber가 수신하여 다시 복사
    → 대용량 데이터일 경우 성능 저하와 메모리 낭비 발생

✅ IPC + Zero-Copy 구조

  1. publisher가 메시지를 생성 후 Shared Memory(SHM)에 저장
  2. DDS가 데이터를 네트워크 전송 없이 주소만 참조 형태로 전달
  3. subscriber는 복사 없이 직접 데이터 참조
  4. 하나의 데이터 → 복수 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