ROS(Robot Operating System)
ROS(Robot Operating System)는 로봇 응용 프로그램 개발을 위한 메타 운영체제로, OS 위에서 동작한다. 분산 컴퓨팅 자원의 스케줄링, 로드 관리, 에러 처리를 지원하며, 로보틱스 소프트웨어 개발 생태계를 전 세계적으로 구축하는 것을 목표로 한다.
ROS는 메타 운영체제로 OS 위에 설치되어 분산 컴퓨팅 자원 간 가산화 레이어로 스케줄링, 로드, 에러처리 지원한다.
이는 각 로봇 제조사마다 다른 제작으로 인한 차이와 불호환성을 해결하고 하나의 시스템으로 통합하여 사용 가능하다는 의미이다.
ROS 커뮤니티 사이트 • ROS 커뮤니티 : https://discourse.ros.org/ • 국내 커뮤니티 : https://discourse.ros.org/c/local/korea • 오로카(국내 로봇 커뮤니티) : http://oroca.org/ • 오로카(오픈채팅) : https://open.kakao.com/o/gAeOb2nc 개발자료 • ROS wiki : https://wiki.ros.org • ROS : https://ros.org Q&A • https://answers.ros.org/questions/ |
ROS의 주요 특징
- 오픈소스 기반 ROS는 누구나 접근 가능한 오픈소스로 제공되며, 커뮤니티를 통해 개발 생태계가 확장되고 있다.
- 프로그램 재사용성 오픈소스 패키지를 통해 기존 코드를 활용하여 필요한 기능만 추가 개발이 가능하다.
- 통신 기반 시스템 노드 간 데이터 교환 및 분산 프로세스를 통해 시스템이 유기적으로 작동한다.
- 개발 도구 지원 다양한 디버깅, GUI, 시각화 도구를 제공하며, 표준 메시지 형식만 준수하면 활용이 가능하다.
ROS2의 구조
- 노드: ROS에서 실행 가능한 최소 단위의 프로세스다 (예: Python, C++로 작성된 실행 단위.)
- 패키지: 하나 이상의 노드와 관련 파일을 포함하는 ROS의 기본 단위다. 주로 하나의 기능 단위로 구현된다.
- 메시지: 노드 간 데이터 교환에 사용되는 데이터 구조다. 토픽, 서비스, 액션 형태로 전달된다.
ROS2 메시지 통신
ROS2의 메시지 통신은 로봇 시스템의 데이터 교환 및 작업 요청을 처리하는 데 사용된다. ROS2는 다양한 통신 방식을 제공하며, 이를 통해 노드 간 데이터를 효율적으로 교환할 수 있다.
1. 토픽(Topic)
토픽은 단방향, 비동기 방식의 메시지 통신 방법으로, 송신자(Publisher)와 수신자(Subscriber)로 구성된다.
토픽은 지속적인 데이터 전송이 필요한 경우에 적합하다.
• 1:1, 1:N 통신 가능.
• 센서 데이터, 로봇 위치, 배터리 상태 등 지속적으로 데이터를 전달하는 데 활용된다.
코드 참조: https://github.com/ros2/demos/tree/rolling/demo_nodes_cpp/src/topics
2. 서비스(Service)
서비스는 양방향, 동기식 메시지 통신 방식으로, 클라이언트가 요청을 보내고 서버가 응답을 처리하는 구조를 따른다.
LED 제어, 모터 토크 On/Off 등의 작업에 활용된다.
• 클라이언트 요청이 있을 때만 통신이 발생한다.
• 요청-응답이 이루어지면 통신이 종료된다.
• 반복적인 동작보다 단일 요청 및 작업 완료에 적합하다.
3. 액션(Action)
액션은 양방향, 비동기 메시지 통신 방식으로, 작업 중 피드백을 제공하며 복잡한 작업을 수행하는 데 사용된다.
액션 메시지는 다음 3가지로 구성된다:
• Goal: 클라이언트가 서버에 작업을 요청.
• Feedback: 작업이 진행되는 중간 상태를 클라이언트에 전달.
• Result: 작업 완료 후 최종 결과를 클라이언트에 전송.
작업 중 지속적인 피드백이 필요한 경우에 적합하다. 로봇 내비게이션(Nav2)과 같은 고급 작업에 사용된다.
통신 방식 요약
통신 방식 | 연속성 | 방향성 | 동기성 | 사용 예 |
토픽 | 연속 | 단방향 | 비동기 | 센서 데이터, 로봇 상태, 로봇 좌표 등 |
서비스 | 일회성 | 양방향 | 동기 | LED 제어, 모터 토크 On/Off |
액션 | 복합 | 양방향 | 동기 + 비동기 | 목적지로 이동, 물건 파지 등 |
ROS2의 도구
ROS 2는 로봇 운영체제로서 다양한 개발 도구를 제공하며, 이를 통해 개발자들은 로봇 제어와 시뮬레이션을 더욱 효과적으로 수행할 수 있다. ROS 2에서 사용되는 주요 도구에는 GUI 툴, 시각화 도구, 시뮬레이터 등이 있다.
RQt
RQt는 플러그인 형태로 다양한 도구와 인터페이스를 구현할 수 있는 GUI 프레임워크이자 다양한 목적의 GUI 툴을 모아둔 ROS의 종합 GUI 툴박스이다. 다양한 데이터를 시각화하고 인터페이스를 설계하는 데 활용된다. 사용자는 이를 통해 노드 간의 연결 상태, 메시지 송수신 상황 등을 직관적으로 확인할 수 있다.
이 도구는 특히 디버깅 과정에서 유용하며, 복잡한 시스템의 상태를 한눈에 파악하는 데 도움을 준다.
source /opt/ros/humble/setup.bash rqt
ROS 2 Humble 환경에서 RQt를 실행하려면 아래 명령어를 사용한다.
명령을 실행하면 RQt GUI가 열리며, 이를 통해 노드 그래프, 토픽 리스트 등을 확인할 수 있다.
Topic Monitor
토픽 정보, 메시지 타입, 데이터 값 확인
터미널에서 rqt를 입력하여 실행 -> ‘Plugins‘-> ‘Topics’ -> ‘Topic Monitor’
Rviz
Rviz는 ROS의 시각화 도구로, 로봇의 센서 데이터와 3D 모델을 시각적으로 표현한다. 예를 들어, 라이다 센서 데이터를 3D 공간에 표시하거나 로봇의 움직임 궤적을 확인하는 데 활용된다.
이 도구는 실제 로봇 환경의 상태를 시뮬레이션하거나 센서 데이터의 정확성을 검증할 때 매우 중요한 역할을 하며, Rviz를 실행하려면 아래 명령어를 입력한다. Rviz GUI가 실행되면 사용자는 원하는 데이터를 시각화할 수 있다.
source /opt/ros/humble/setup.bash rviz2
Gazebo
Gazebo는 ROS와 함께 사용되는 대표적인 로봇 시뮬레이터로, 로봇의 물리적 환경을 시뮬레이션하는 데 최적화되어 있다. 사용자는 Gazebo를 통해 로봇 모델을 생성하고, 다양한 센서 및 제어 알고리즘을 테스트할 수 있다. Gazebo는 사실적인 물리 엔진을 기반으로 하여 로봇의 동작을 현실감 있게 재현하며, 실제 환경에서 발생할 수 있는 문제를 미리 예측할 수 있게 해 준다.
source /opt/ros/humble/setup.bash gazebo
Stage
Stage는 다수의 로봇이 동일한 환경에서 협력하거나 독립적으로 동작하는 상황을 시뮬레이션하기 위한 도구다. 이를 통해 여러 로봇 간의 상호작용을 분석하고, 협력적 작업이 필요한 시나리오를 실험할 수 있다.
Isaac Sim
Isaac Sim은 NVIDIA에서 제공하는 고급 로봇 시뮬레이터로, AI와의 통합이 용이하며 고성능의 그래픽과 물리 엔진을 기반으로 한다. 이 도구는 특히 자율주행 차량이나 복잡한 AI 로봇 시스템의 테스트 및 개발을 지원하는 데 특화되어 있다.
우분투(Ubuntu) 설치
맥북 2020 M1 Pro는 ARM 기반 아키텍처를 사용하므로, 일반적인 x86 기반 설치와는 차이가 있다. 아래는 M1 Pro에서 Ubuntu 설치 방법을 단계별로 설명한 것이다. 기본적으로 Parallels Desktop, UTM, 또는 VirtualBox와 같은 가상화 소프트웨어를 사용해야 한다.
UTM을 이용해 설치하는 과정은 아래 블로그를 참조한다.
Ubuntu에서 ROS 설치 방법
ROS2 Humble 설치
• 다음 사이트 참고 : https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html
• Ubuntu에서 ctrl + alt + t로로 터미널 열기
• Locale 설정
locale # check for UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
locale # verify settings
Setup Source
Repsitory 활성화 확인
sudo apt install software-propertie
sudo add-apt-repository universe
ROS 2 GPS 추가
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
저장소 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg]
http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee
/etc/apt/sources.list.d/ros2.list > /dev/null
ROS2 패키지 설치
시스템 업데이트
sudo apt update
sudo apt upgrade
ROS 2 패키지 설치
sudo apt install ros-humble-desktop
설정 스크립트 소싱
# Replace ".bash" with your shell if you're not using bash
# Possible values are: setup.bash, setup.sh, setup.zsh
source /opt/ros/humble/setup.bash
ROS2 예제 실행
ROS 실행 경로를 지정한 후 실행해야 한다.
source /opt/ros/humble/setup.bash
Talker 노드 실행 | Listener 노드 실행 |
source /opt/ros/humble/setup.bash ros2 run demo_nodes_cpp talker |
source /opt/ros/humble/setup.bash ros2 run demo_nodes_cpp listener |
Turtlesim | Turtlesim 조작 |
ros2 run turtlesim turtlesim_node | ros2 run turtlesim turtle_teleop_key |
연습 문제: ROS2에서 Turtlesim을 사용하여 터틀봇을 사각형 경로 이동 프로그램 구현
- ROS2와 Turtlesim 패키지가 설치되어 있어야 함
- Turtlesim을 사각형 경로로 이동시키는 C++ 또는 Python 코드를 작성
- 메시지/서비스 통신 활용법 및 geometry_msgs:msg: Twist 메시지 사용법
코드 작성 요점
- ROS2 노드 생성 및 초기화
- Turtlesim 노드와 통신하기 위한 서비스 및 토픽 설정.
- 예시 코드에서 노드는 turtlesim_square라는 이름을 사용.
- 서비스 초기화
- create_client 함수를 사용하여 teleport_absolute와 set_pen 서비스를 초기화한다.
- 서비스가 시작되기 전까지 대기(wait_for_service).
- 사각형 경로 이동 로직
- move_straight: 직선 이동, Twist 메시지의 linear.x = 1.0 값을 설정.
- turn_90_degrees: 90도 회전, Twist 메시지의 angular.z = M_PI/2 값을 설정.
- reset_position: 초기 위치로 이동, teleport_absolute 서비스를 이용하여 (x, y, theta)를 지정.
패키지 구조
turtlesim_square/ ├── CMakeLists.txt ├── package.xml └── src/ └── turtlesim_square.cpp |
터미널 1에서 Turtlesim 노드 실행: ros2 run turtlesim turtlesim_node
터미널 2에서 작성한 코드 실행: ros2 run turtlesim_square turtlesim_square
문제 해결
1. Turtlesim 설치
sudo apt update
sudo apt install ros-humble-turtlesim
2. ROS2 워크스페이스 생성 및 설정
워크 스페이스 생성
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
source install/setup.bash
제어 패키지 생성
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake turtlesim_square
3. C++ 코드 작성
src/turtlesim_square/src/turtlesim_square.cpp에 아래 코드를 작성:
#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/twist.hpp>
#include <turtlesim/srv/teleport_absolute.hpp>
class TurtleSimSquare : public rclcpp::Node {
public:
TurtleSimSquare() : Node("turtlesim_square") {
// Publisher 초기화
publisher_ = this->create_publisher<geometry_msgs::msg::Twist>("turtle1/cmd_vel", 10);
// Client 초기화
client_teleport_ = this->create_client<turtlesim::srv::TeleportAbsolute>("turtle1/teleport_absolute");
init_services();
move_square();
}
private:
void init_services() {
while (!client_teleport_->wait_for_service(std::chrono::seconds(1))) {
RCLCPP_INFO(this->get_logger(), "Waiting for teleport_absolute service...");
}
}
void move_straight(double speed, double duration) {
geometry_msgs::msg::Twist msg;
msg.linear.x = speed;
msg.angular.z = 0.0;
auto start_time = this->now();
while ((this->now() - start_time).seconds() < duration) {
publisher_->publish(msg);
rclcpp::sleep_for(std::chrono::milliseconds(100));
}
msg.linear.x = 0.0;
publisher_->publish(msg);
}
void turn_90_degrees() {
geometry_msgs::msg::Twist msg;
msg.linear.x = 0.0;
msg.angular.z = M_PI / 2; // 90도
auto start_time = this->now();
while ((this->now() - start_time).seconds() < 1.0) {
publisher_->publish(msg);
rclcpp::sleep_for(std::chrono::milliseconds(100));
}
msg.angular.z = 0.0;
publisher_->publish(msg);
}
void reset_position() {
auto request = std::make_shared<turtlesim::srv::TeleportAbsolute::Request>();
request->x = 5.5;
request->y = 5.5;
request->theta = 0.0;
client_teleport_->async_send_request(request);
rclcpp::sleep_for(std::chrono::seconds(1));
}
void move_square() {
reset_position();
for (int i = 0; i < 4; ++i) {
move_straight(1.0, 2.0); // 직선으로 2초 이동
turn_90_degrees(); // 90도 회전
}
}
rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr publisher_;
rclcpp::Client<turtlesim::srv::TeleportAbsolute>::SharedPtr client_teleport_;
};
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<TurtleSimSquare>());
rclcpp::shutdown();
return 0;
}
4. CMake 설정
CMakeLists.txt 파일을 수정하여 C++ 코드를 빌드합니다.
cmake_minimum_required(VERSION 3.5)
project(turtlesim_square)
# ROS2 C++ 설정
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(turtlesim REQUIRED)
add_executable(turtlesim_square src/turtlesim_square.cpp)
ament_target_dependencies(turtlesim_square rclcpp geometry_msgs turtlesim)
install(TARGETS turtlesim_square
DESTINATION lib/${PROJECT_NAME})
ament_package()
5. 빌드 및 실행
cd ~/ros2_ws
colcon build
source install/setup.bash