인공지능 요모조모
[ROS2] 기초 개념 (1) 본문
ROS1 vs ROS2
ROS1 | ROS2 | |
통신 방식 | 자체 TCP/UDP 프로토콜 (ROS Master 필요) |
DDS 기반의 분산 통신 (Middleware 사용, Master 없음) |
멀티 플랫폼 | 리눅스 중심 | 리눅스, 윈도우, macOS, RTOS 등 지원 |
실시간성 | 실시간성 미지원 | 실시간성 고려 가능 (RTOS 호환) |
보안 | 보안 미지원 | DDS 보안 설정 가능 |
멀티 노드 실행 | 단일 머신에 최적화 | 네트워크 기반의 분산 시스템 최적화 |
빌드 시스템 | catkin (CMake 기반) | ament (CMake, Python 등 다양한 확장성) |
ROS2 Interface
▪️노드 간 데이터를 주고받을 때 사용되는 데이터의 형태
▫️역할: .msg, .srv, .action 파일을 정의하는 전용 패키지
▫️목적: 토픽, 서비스, 액션 노드 간의 통신을 위해 데이터 구조 정의
💥일반적으로 다른 패키지에서 재사용할 수 있도록 인터페이스만 따로 분리
토픽 | 서비스 | 액션 | |
연속성 | 연속성 | 일회성 | 복합적(토픽+서비스) |
방향성 | 단방향 | 양방향 | 양방향 |
동기성 | 비동기 | 동기 | 동기 + 비동기 |
다자간 연결 | 1:1, 1:N, N:1, N:N (publisher : subscriber) |
1:1 (server : client) |
1:1 (server : client) |
노드 역할 | 발행자 구독자 |
서버 클라이언트 |
서버 클라이언트 |
동작 트리거 | 발행자 | 클라이언트 | 클라이언트 |
인터페이스 | msg 인터페이스 | srv 인터페이스 | action 인터페이스 |
CLI 명령어 | ros2 topic ros2 interface |
ros2 service ros2 interface |
ros2 action ros2 interface |
✔️메시지 인터페이스(msg)
▪️필드 타입과 필드 이름으로 구성
fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3 |
---|
ex)
$ ros2 interface show geometry_msgs/msg/Twist
Vector3 linear
Vector3 angular
✔️서비스 인터페이스(srv)
▪️요청(request) 메시지와 응답(response) 메시지로 구성, 대시(-)로 구분
# Request float32 x float32 y float32 theta string name --- # Response string name |
---|
ex)
$ ros2 interface show turtlesim/srv/Spawn.srv
float32 x
float32 y
float32 theta
string name
---
string name
✔️액션 인터페이스(action)
▪️액션 목표(goal), 액션 결과(result), 액션 피드백(feedback)으로 구성, 각각 대시(-)로 구분
# Goal float32 theta --- # Result float32 delta --- # Feedback float32 remaining |
---|
ex)
$ ros2 interface show turtlesim/action/RotateAbsolute.action
float32 theta
---
float32 delta
---
float32 remaining
✔️ROS 내장 자료형
Package(패키지) 설계
✔️패키지 생성
$ mkdir -p ~/ros2_ws/src
# 워크스페이스와 src 디렉토리 생성
$ cd ros2_ws/src
# 워크스페이스 내 src 폴더로 이동
$ ros2 pkg create 패키지명 --build-type ament_python
# 또는 ament_cmake
✔️디렉토리 구성
✔️생성된 패키지 내 코드 작성(python or c++)
✔️실행 설정 파일 수정
▪️Python : setup.py + package.xml
▫️setup.py에서 실행할 스크립트를 entry point에 등록
▫️package.xml에서 의존성(rclpy)등 설정
▪️C++ : CMakeLists.txt + package.xml
▫️CMakeLists.txt에서 add_executable() 및 install(TARGETS) 설정
▫️package.xml에 의존성 추가 (rclcpp, std_msgs 등)
✔️빌드(Build)
$ colcon build --packages-select 패키지명(파이썬)
# 또는 패키지명(C++)
💥빌드 후에는 꼭 환경설정하기 : $ source install/setup.bash
✔️실행(Run)
$ ros2 run 패키지이름 실행파일이름
ROS 인터페이스 만들기
$ cd ros2_ws/src
$ ros2 pkg create ros_study_msgs --build-type ament_cmake
$ mkdir ~/ros2_ws/src/ros_study_msgs/{msg,srv,action}
# msg, srv, action 폴더 각각 만들기
$ touch ~/ros2_ws/src/ros_study_msgs/msg/MyMsg.msg
+) 파일 내에서 메시지 타입과 이름 작성(ex. float32 num)
$ touch ~/ros2_ws/src/ros_study_msgs/srv/MySrv.srv
+) 파일 내에서 Request/Response 타입과 이름 작성
$ touch ~/ros2_ws/src/ros_study_msgs/action/MyAction.action
+) 파일 내에서 Goal/Result/Feedback 타입과 이름 작성
✔️package.xml 수정
▪️<buildtool_depend>
: 패키지 빌드에 필요한 빌드 도구 지정
ex) ament_cmake, ament_python, catkin
💥인터페이스 패키지 빌드 시, IDL(Interface Definition Language) 생성에 필요한 rosidl_default_generators 추가 필요!
▪️<build_depend>
: 패키지 빌드에 필요한 의존성
ex) rclcpp, sensor_msgs, std_msgs
▪️<build_export_depend>
: 다른 패키지에서 사용할 수 있게 내보낼 의존성
▪️<exec_depend>
: 실행에 필요한 의존성
ex) rclpy , rclcpp, sensor_msgs
💥 IDL 생성에 필요한 builtin_interfaces, rosidl_default_runtime 추가 필요!
▪️<members_of_group>
: 패키지가 특정 패키지 그룹(group)에 속해 있다고 명시
ex) rosidl_interface_packages와 같은 공통 그룹
▪️<test_depend>
: 테스트에만 필요한 의존성
ex) ament_lint_auto, ament_cmake_gtest, pytest
예를 들어 사용자 정의 패키지가 std_msgs 메시지를 사용한다면!
<build_depend>std_msgs</build_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>std_msgs</exec_depend>
✔️CMakeLists.txt 수정
▪️ set() : 변수 정의 또는 값 설정 시 사용하는 기본 함수
ex)
패키지명, 버전 등 정의, include 디렉토리 설정, 빌드 타겟용 소스 리스트, 빌드 옵션 등
set(action\_files "action/MyAction.action")
👉🏻 action 메시지 자동 생성을 위한 경로를 변수로 저장
✔️빌드(build)
$ cd ~/ros2_ws
$ colcon build --package-select ros_study_msgs
$ tree
'ROKEY > ROS2' 카테고리의 다른 글
[ROS2] ROS2 CLI (0) | 2025.05.02 |
---|---|
[ROS2] ROS2 Security (0) | 2025.05.02 |
[ROS2] ROS2 Lifecycle (0) | 2025.05.01 |
[ROS2] 기초 개념(2) (0) | 2025.04.23 |
[ROS2] BAG (0) | 2025.04.22 |