Post

[ROS2] 개념정리

[ROS2] 개념정리

ROS(Robot Operating System)란?

로봇 응용 프로그램 개발을 위한 운영체제와 같은 로봇 플랫폼

하드웨어 추상화, 디바이스 제어, 메시지 패싱, 패키지 관리 등을 제공하여, 로봇 개발의 복잡성을 줄이고 재사용 가능한 소프트웨어를 개발하는 데 편리

로봇 생산에서 각 회사마다 사용하는 프로그래밍 언어이 다를 수 있다. 이로 인해 이직 시 다른 회사에서 새로운 툴과 환경에 적응하는 데 발생하는 어려움을 ROS와 같은 표준화된 로봇 플랫폼을 사용하면 해결 가능

기존 로봇 개발 방식의 한계

  1. 하드웨어 설계, 제어기 개발, 제어 알고리즘, 시각화 도구 등 모든 것을 직접 개발해야 함
  2. API마다 다른 인터페이스 로 인한 학습 시간과 노력이 필요
  3. 하드웨어에 의존적인 소프트웨어로 하드웨어가 변경될 때마다 수정이 불가피함

Why ROS?

  1. 글로벌 커뮤니티
    ROS는 활발한 글로벌 커뮤니티를 통해 다양한 로봇 하드웨어 및 소프트웨어에 대한 정보를 얻을 수 있음

  2. 하드웨어 추상화
    ROS 호환 센서들은 자체 드라이버를 제공하므로, 하드웨어와의 통신을 쉽게 처리할 수 있어서 하드웨어 변경 시 소프트웨어 코드를 대폭 수정할 필요가 없음

  3. 표준화된 개발 환경
    ROS는 센서 데이터 전송 및 드라이버 통신 방식이 표준화되어서 규약만 맞춰주면 하드웨어 관련 코드 수정에 많은 노력이 필요하지 않음

  4. 강력한 시각화 도구
    SLAM(동시적 위치 추정 및 지도 작성)과 같은 복잡한 기술을 구현할 때, 라이다 데이터 시각화와 같은 기능은 ROS에서 매우 강력한 도구를 제공

ROS 사용 이유 vs 사용하지 않는 이유

ROS 사용 이유ROS 사용하지 않는 이유
비용 절감 (오픈 소스 플랫폼)맞춤형 솔루션 제작이 어려움
강력한 시각화 도구 제공 (예: RViz, SLAM 시각화)상업적 지원 부족 및 지적 재산권 문제
다양한 로봇 하드웨어와의 호환성 (드라이버 제공)ROS 최신 버전 지원의 지연 가능성
표준화된 프로토콜을 통한 효율적인 개발특수한 요구 사항에 대한 부족한 지원
글로벌 커뮤니티 및 지원산업 현장에서의 상용화 지원 부족

ROS1 vs ROS2 차이점

구분ROS1ROS2
아키텍처모노리식 (Monolithic)분산 시스템 기반 (Distributed)
보안기본적으로 보안 기능 미제공데이터 암호화 및 보안 기능 제공
실시간 처리실시간 처리 지원 미흡실시간 처리를 위한 설계 (RTOS 지원)
운영체제 지원주로 Linux 지원Windows, macOS, Linux 모두 지원
미들웨어ROS Master 의존 (중앙 집중형)DDS (Data Distribution Service) 기반 (분산형)
생태계많은 패키지와 커뮤니티 지원ROS1 패키지들을 점차 ROS2로 이전 중
개발 및 유지보수점진적인 개선, 최신 기술 도입 제한적최신 기술 도입 및 장기적인 유지보수 용이

ROS에서 단위는 Meter,Kg,Sec(MKS) 단위계 + radian을 사용함

\[rad=degree*\pi/180\]

Node

  • ROS에서 실행 가능한 최소 단위
  • ros2 run [pkg name][node name] : 노드 실행
  • ros2 node list : 실행중인 노드 리스트
  • ros2 node info [node name] : Subscribers, Publishers, Servcie Servers 등 제공하는 기능들

Service

  • 클라이언트가 요청을 하면 서버가 응답하는 것

    한쪽 노드에 서비스 서버가 만들어져있고 , 이를 이용할 클라이언트가 다른 노드에 있을때

    클라이언트가 서버에 요청함 → 서버에서 요청받은 행동을 함 → response가 있으면 응답을 줌 (안줄수도있음)

  • ros2 service list : 실행되고있는 node에서 제공하는 service 목록
  • ros2 service type [service] : service의 type(데이터 형식)
  • service는 namespace를 통해 관리 namespace를 통해 turtle1, turtle2 구분하여 별도로 움직이기 등이 가능하다

Service definition

서비스 : 어떤 노드가 request를 하고 다른노드가 response를해주는것

이 사이에 필요한 것이 definition임 (type)

이 type을 기록해둔 파일이 .srv 파일

Notes_241012_214508.jpg

터미널에서 definition을 확인

1
2
3
4
5
6
7
8
9
ros2 interface show [srv]
# ros2 interface show turtlesim/srv/TeleportAbsolute
# Request 타입
float32 x
float32 y
float32 theta
---
# Response 타입
# 없음

Service Call

서비스를 요청

tab을 사용해야 편하다

1
2
3
ros2 service call [service][type][data]
# ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x:2,y:2,theta:1.57}"
# ros2 service call /reset std_srvs/srv/Empty {}

Topic

  • publisher 노드에서 토픽을 발행한다
  • subscriber 노드에서 토픽 이름, 메세지 타입을 통해 구독 -> 데이터를 주고받는 방법을 고민할 필요가 없음
  • ros2 topic list : 실행중인 노드의 topic 목록
  • ros2 topic type : 토픽의 type(데이터 형식)
  • ros2 topic list -t : 토픽이름뒤에 데이터 타입을 같이보여줌
  • ros2 topic info [topic] : type, publisher와 subscription 카운트
  • ros2 topic list -v : 토픽리스트 + type + info 보여줌
  • ros2 interface show [type] : 데이터형식
  • ros2 topic echo [topic] : 데이터값을보여줌

Service는 request를 해야 response를 받음

Topic은 name과 message type만 알면 모두 확인 가능 -> 디버그에 유리, 확장성이 좋음

Topic 발행

1
2
3
4
# 한번만 발행
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist “{linear:{x:2.0,y:2.0,z:2.0},angular:{x.0.0,y:0.0,z:0.0}}# 1Hz마다 발행
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist “{linear:{x:0.0,y:0.0,z:0.0},angular:{x.0.0,y:0.0,z:1.8}}

topic을 동시 발행하면 중첩된다

1
2
# topic 1
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist “{linear:{x:0.0,y:0.0,z:0.0},angular:{x.0.0,y:0.0,z:1.8}}

topic 1 발행 후

image.png

1
2
# topic 2
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist “{linear:{x:0.0,y:0.0,z:0.0},angular:{x.0.0,y:0.0,z:3.6}}

topic 2 동시 발행 후

image.png

Action

  • 서비스와 토픽으로 이루어짐
  • 작동 방식
    1. goal service : 클라이언트가 서버에 요청할 때 목표를 지정함
    2. result service : 서버에서 목표를 이수했는지 알려줌
    3. feedback topic : 중간과정을 피드백으로 알려줌
  • ros2 action list : 실행중인 node의 action list
  • ros2 action list -t : type도 함께 표시함
  • interfase show [type] : 데이터 타입 정보 표시 ```bash goal

    result


    feedback

    구분자 두개를 써서 세개로 구분된다

    ```

    • ros2 action send_goal [action server name][action type][goal arguments] : 액션의 목표 지정

Service, Topic, Action은 모두 실시간으로 데이터를 주고받는 방식

This post is licensed under CC BY 4.0 by the author.