Ros2

What is Ros2

Not really an operating system more like a framework or add on

Download

VirtualBox & VirtualBox Extension Pack
https://www.virtualbox.org/wiki/Downloads
Ubuntu
https://mirror.kakao.com/ubuntu-releases/focal/
Hardware
기본 메모리: 4096MB(25~30%)
CPU 4개

Install Ros2 Foxy

https://cafe.naver.com/openrt/25288

Important Materials

Ros2 Introduction
Topic
https://cafe.naver.com/openrt/24101
Service
https://cafe.naver.com/openrt/24128
Action
https://cafe.naver.com/openrt/24142

Ros2 Basic Programming
Python
https://cafe.naver.com/openrt/24450
https://cafe.naver.com/openrt/24629
https://cafe.naver.com/openrt/24637
https://cafe.naver.com/openrt/24644
https://cafe.naver.com/openrt/24662
https://cafe.naver.com/openrt/24666
https://cafe.naver.com/openrt/24690
https://cafe.naver.com/openrt/24734

Turtlesim Package

Turtlesim Package는 ROS 유저라면 사용해보지 않은 사람이 없을 정도로 유명한 패키지이자 ROS의 기본 기능을 가지고 있는 package
Turtlesim Package Installation

sudo apt update
sudo apt install ros-foxy-turtlesim

What is Turtlesim Package?
ROS의 학습용 패키지인만큼 패키지, 노드, 토픽, 서비스, 액션, 파라미터에 대한 기본적인 학습 및 이 패키지와 함께 CLI 툴, rqt 툴 연동도 체험해볼 수 있다
-turtlesim 패키지의 이름에는 거북이(turtle)가 사용되었다. 그리고 turtlesim 패키지의 turtlesim_node 노드를 실행하면 나오는 거북이 아이콘에서도 모두 거북이(turtle)가 사용되었다
TurtleBot이라는 이름도 turtle이 포함될 정도로 ROS 커뮤니티에서 거북이는 마스코트와 같은 역할이 되었다
-본래 터틀(turtle)은 1967년에 개발된 교육용 컴퓨터 프로그래밍 언어인 로고(Logo)를 사용하여 실제 로봇을 구동하기 위해 만들어진 터틀 로봇에서 유래되었다
이 로봇은 이후에 실제 로봇이 아닌 컴퓨터 화면에 움직이는대로 라인이 생겨 그림을 그릴 수 있는 Turtle graphics이라는 프로그램으로 제공되어 아이들의 컴퓨터 프로그래밍 언어 교육에 사용되었다
-Open Robotics 개발자들은 Logo 언어를 이용하여 컴퓨터 프로그래밍 언어를 쉽게 가르치자는 취지와 마찬가지로 거북이라는 친숙한 동물을 통해 ROS를 처음 다루는 사람들도 쉽게 배울 수 있게하자는 의미를 담아 ROS 공식 모바일 로봇 플랫폼에 TurtleBot이라는 이름을 붙였으며, 실제 로봇이 없더라도 컴퓨터 화면상에서 쉽게 ROS의 기본 개념을 설명하고자 turtlesim 이라는 프로그램을 제작하게 되었다. 이 프로그램은 처음 제작된 이후 10여년 가까이 오픈 로봇공학 플랫폼으로 개발자, 학생 등의 사이에서 가장 많이 사용되고 있는 ROS의 표준 플랫폼으로 자리 매김하였다
ex.
MobilityService6

Turtlesim Package & Node
ROS에서는 프로그램의 재사용성을 극대화하기 위하여 최소 단위의 실행 가능한 프로세서라고 정의하는 노드(node) 단위의 프로그램을 작성하게 된다, 이는 하나의 실행 가능한 프로그램으로 생각하면 된다
하나 이상의 노드 또는 노드 실행을 위한 정보 등을 묶어 놓은 것을 패키지(package)라고 하며, 패키지의 묶음을 메타패키지(metapackage)라 하여 따로 분리한다
-자신의 개발 환경에 어떠한 패키지가 있는지 알아보기 위해서는 아래와 같은 ROS 2의 CLI(Command Line Interface) 툴을 사용하면 된다
-pkg 명령어를 터미널에서 실행하면 이미 설치된 패키지 및 본인이 직접 작성한 패키지까지 포함하여 수백개의 패키지의 리스트를 확인할 수 있을 것이다(turtlesim를 설치하였다면 이 리스트에도 포함되어 있을 것이다)

ros2 pkg list

-turtlesim 패키지에 포함된 노드가 어떤 것들이 있는지 알아보도록 하자 <br/> 터미널에서 아래와 같이 ros2 pkg executables <패키지명>`을 사용하면 `turtlesim` 패키지에 포함되어 있는 다수의 노드를 확인할 수 있다. 총 4가지로 `draw_square`, `mimic`, `turtle_teleop_key`, `turtlesim_node` 노드이다

ros2 pkg executables turtlesim
# turtlesim draw_square
# turtlesim mimic
# turtlesim turtle_teleop_key
# turtlesim turtlesim_node

-노드의 역할
draw_square: 사각형 모양으로 turtle을 움직이게하는 노드
mimic: 유저가 지정한 토픽으로 동일 움직임의 turtlesim_node를 복수개 실행시킬 수 있는 노드
turtle_teleop_key: turtlesim_node를 움직이게 하는 속도 값을 퍼블리시하는 노드
turtlesim_node: turtle_teleop_key 으로부터 속도 값을 토픽으로 받아 움직이게 하는 간단 2D 시뮬레이터 노드

Turtlesim 패키지의 노드 실행
4개의 노드 중에 가장 널리 사용하는 turtlesim_node 노드와 turtle_teleop_key 노드를 ROS 2의 CLI(Command Line Interface) 툴의 run 명령어를 이용하여 실행시켜보자
-turtlesim_node 노드를 실행하면 파란색 창에 거북이 한마리가 보일 것이다
그 뒤 다른 터미널에서 turtle_teleop_key 노드를 실행시키면 화살표키로 turtlesim_node 노드의 거북이를 움질일 수 있게 된다.(더 많은 기능들이 있는데 이는 토픽, 서비스, 액션, 파라미터 강좌에서 더 자세히 다루기로 하자. )

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

turtlesim_node의 실행 화면:
MobilityService7
turtle_teleop_key를 이용해 거북이를 이동시킨 모습
MobilityService8
중요한 것은 두 노드간의 동작이 단순히 키보드 값을 전달하여 움직이는게 아니라 눌려진 키보드의 키값에 해당되는 병진 속도(linear velocity)와 회전 속도(angular velocity)를 geometry_msgs 패키지의 Twist 메시지 형태로 보내고 받는 다는 것이다
(참고로 turtle_teleop_key 노드를 실행시킨 후 거북이를 움직일 수 없다는 분들이 있는데 이는 해당 터미널 창을 클릭하고 활성화 시킨상태에서 화살표키를 입력값으로 받아들이기 때문이다)

노드, 토픽, 서비스, 액션의 조회
현재 어떠한 노드들이 실행되어 있는지, 어떻나 토픽들이 있는지, 어떠한 서비스와 액션이 있는지 알아보자.
각 명령어 node list, topic list, service list, action list를 터미널창에서 실행시키면 된다.
(아래의 예제는 turtlesim_nodeturtle_teleop_key가 실행되어 있을 때의 결과 값이다)

ros2 node list
# /turtlesim
# /teleop_turtle

ros2 topic list
# /parameter_events
# /rosout
# /turtle1/cmd_vel
# /turtle1/color_sensor
# /turtle1/pose

ros2 service list
# /clear
# /kill
# /reset
# /spawn
# /teleop_turtle/describe_parameters
# /teleop_turtle/get_parameter_types
# /teleop_turtle/get_parameters
# /teleop_turtle/list_parameters
# /teleop_turtle/set_parameters
# /teleop_turtle/set_parameters_atomically
# /turtle1/set_pen
# /turtle1/teleport_absolute
# /turtle1/teleport_relative
# /turtlesim/describe_parameters
# /turtlesim/get_parameter_types
# /turtlesim/get_parameters
# /turtlesim/list_parameters
# /turtlesim/set_parameters
# /turtlesim/set_parameters_atomically

ros2 action list
# /turtle1/rotate_absolute

rqt_graph 로 보는 노드와 토픽의 그래프 뷰
ROS 2 CLI 툴이 아닌 ROS 2 GUI툴을 써보자. 하기와 같이 터미널 창에서 rqt_graph를 실행시키면 각 노드와 토픽, 액션이 표시된다
-이 툴을 통해 현재 개발 환경에서의 모든 노드와 토픽, 액션을 그래프 뷰로 확인할 수 있다
-그림 9에서 보이는 동그라미가 노드이고, 네모는 토픽 또는 액션이며 화살표는 메시지의 방향을 의미한다
여기서 서비스가 빠져있는데 서비스는 필요시 순간적으로 사용되는 형식이라 표시가 안되며, 액션은 토픽와 유사한 Pub, Sub 통신 방식의 응용이기에 표시되고 있다

rqt_graph

MobilityService9

Concepts

Node: 최소 단위의 실행 가능한 프로세스, 하나의 실행 가능한 프로그램
-노드의 역할을 목적에 맞추어 세분화시켜 노드들 간의 의존성을 줄여 독립성을 다른 목적의 작업시 재사용 가능하게 함
-ex.원본 영상을 출력하는 카메라 드라이버, 원본 영상에 필터링하는 필터 노드, 필터링 된 영상에서 특징점을 추출하는 노드, 특징점을 이용해 물건을 검출하는 노드, 검출된 물건의 위치로 로봇의 경로를 만들어내는 노드, 모터 드라이버 노드, 경로대로 이동하는 노드
Message: 노드와 노드 사이에 서로 주고받는 입력과 출력 데이터
-message의 형태는 integer, floating point, boolean, string 와 같은 변수 형태
-message 안에 message를 품고 있는 간단한 데이터 구조 및 메시지들의 배열과 같은 구조도 사용
Message Communication: 노드와 노드 사이에 입출력 데이터를 주고받는 방식
-ex
MobilityService1

Message를 주고받는 방식

Topic(토픽)
비동기식 단방향 메시지 송수신 방식으로 msg 메시지 형태의 메시지를 발간하는 Publisher와 메시지를 구독하는 Subscriber 간의 통신
-1:N, N:1, N:N 통신도 가능함
-ROS 메시지 통신에서 가장 널리 사용되는 통신 방법
-ex. NodeA - NodeB, NodeA - NodeC

Service(서비스)
동기식 양방향 메시지 송수신 방식으로 특정 요청을 하는 클라이언트 단과 요청받은 일을 수행 후에 결괏값을 전달하는 서버 단과의 통신
-서비스의 요청(Request)을 하는 쪽을 Service client라고 하며 서비스의 응답(Response)을 하는 쪽을 Service server라고 한다
-서비스 요청 및 응답(Request/Response) 또한 위에서 언급한 msg 메시지의 변형으로 srv 메시지라고 함
-ex. Node B - Node C
MobilityService2

Action(액션)
비동기식+동기식 양방향 메시지 송수신 방식
액션 목표 Goal를 지정하는 Action client과 액션 목표를 받아 특정 태스크를 수행하면서 중간 결괏값에 해당되는 액션 피드백(Feedback)과 최종 결괏값에 해당되는 액션 결과(Result)를 전송하는 Action server 간의 통신
-액션의 구현 방식은 토픽(topic)과 서비스(service)의 혼합이라고 볼 수 있는데 액션 목표 및 액션 결과를 전달하는 방식은 서비스와 같으며 액션 피드백은 토픽과 같은 메시지 전송 방식
-액션 목표/피드백/결과(Goal/Feedback/Result) 메시지 또한 위에서 언급한 msg 메시지의 변형으로 action 메시지라고 한다
MobilityService3
MobilityService4

Parameter(파라미터)
각 노드에 파라미터 관련 Parameter server를 실행시켜 외부의 Parameter client 간의 통신으로 파라미터를 변경하는 것으로 서비스와 동일
단 노드 내 매개변수 또는 글로벌 매개변수를 서비스 메시지 통신 방법을 사용하여 노드 내부 또는 외부에서 쉽게 지정(Set) 하거나 변경할 수 있고, 쉽게 가져(Get)와서 사용할 수 있게 하는 점에서 목적이 다르다
MobilityService5

노드 실행 (ros2 run)

노드를 실행하기 위해서는 아래와 같이 ros2 run 명령어를 이용하여 특정 패키지의 특정 노드를 실행시키게 된다.
아래의 두 명령어는 각각 turtlesim 패키지의 turtlesim_nodeturtle_teleop_key 노드를 실행시키게 된다.

Reference:
[출처] 007 패키지 설치와 노드 실행 (오픈소스 소프트웨어 & 하드웨어: 로봇 기술 공유 카페 (오로카)) | 작성자 표윤석