본문 바로가기

Development

[ROS] #1. 로봇 운영체제(ROS)

728x90
반응형

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의 주요 특징

  1. 오픈소스 기반 ROS는 누구나 접근 가능한 오픈소스로 제공되며, 커뮤니티를 통해 개발 생태계가 확장되고 있다.
  2. 프로그램 재사용성 오픈소스 패키지를 통해 기존 코드를 활용하여 필요한 기능만 추가 개발이 가능하다.
  3. 통신 기반 시스템 노드 간 데이터 교환 및 분산 프로세스를 통해 시스템이 유기적으로 작동한다.
  4. 개발 도구 지원 다양한 디버깅, GUI, 시각화 도구를 제공하며, 표준 메시지 형식만 준수하면 활용이 가능하다.

ROS2의 구조

  1. 노드: ROS에서 실행 가능한 최소 단위의 프로세스다 (예: Python, C++로 작성된 실행 단위.)
  2. 패키지: 하나 이상의 노드와 관련 파일을 포함하는 ROS의 기본 단위다. 주로 하나의 기능 단위로 구현된다.
  3. 메시지: 노드 간 데이터 교환에 사용되는 데이터 구조다. 토픽, 서비스, 액션 형태로 전달된다.

ROS2 메시지 통신

ROS2의 메시지 통신은 로봇 시스템의 데이터 교환 및 작업 요청을 처리하는 데 사용된다. ROS2는 다양한 통신 방식을 제공하며, 이를 통해 노드 간 데이터를 효율적으로 교환할 수 있다.

1. 토픽(Topic)

토픽은 단방향, 비동기 방식의 메시지 통신 방법으로, 송신자(Publisher)와 수신자(Subscriber)로 구성된다.
토픽은 지속적인 데이터 전송이 필요한 경우에 적합하다.

 

• 1:1, 1:N 통신 가능.
 센서 데이터, 로봇 위치, 배터리 상태 등 지속적으로 데이터를 전달하는 데 활용된다.

 

코드 참조: https://github.com/ros2/demos/tree/rolling/demo_nodes_cpp/src/topics

설명 참조: https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html

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을 이용해 설치하는 과정은 아래 블로그를 참조한다.

 

[Mac] 가상머신(UTM)에 Linux(우분투 22.04) 설치 (1)

무료인 UTM로 설치합니다!(VM ware로는 안 한다- 유료 이슈)더보기근데 가상머신(VM ware)에 Linux(Ubuntu)와 Tomcat을 설치하고 외부에서 접속할 수 있다고 한다.- UTM는 방화벽 이슈  M1 맥북 가상머신(VM wa

solearn.tistory.com

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 메시지 사용법

코드 작성 요점

  1. ROS2 노드 생성 및 초기화
    • Turtlesim 노드와 통신하기 위한 서비스 및 토픽 설정.
    • 예시 코드에서 노드는 turtlesim_square라는 이름을 사용.
  2. 서비스 초기화
    • create_client 함수를 사용하여 teleport_absolute와 set_pen 서비스를 초기화한다.
    • 서비스가 시작되기 전까지 대기(wait_for_service).
  3. 사각형 경로 이동 로직
    • 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
728x90
반응형
댓글