본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 정혁제 #2주차 - ROS 용어 및 기초

반응형

들어가며

저번주에 말한 새 노트북이 왔는데, 이게 최신 노트북이라 ubuntu 18.04 설치하는데 이틀이 꼬박 걸렸다. 구글링하면 뭔 놈의 호환이 안된다고 해서 사알짝 후회는 했지만, 그래도 왠만치는 다 해결했다..!! 하지만 아직까지 블루투스 드라이버랑 화면밝기조절은 해결하지 못했다.. 다음주에는 "들어가며" 부분에서 이거 해결했다고 쓸 수 있었으면 좋겠다.

이번 강의는 대회준비하면서 헷갈렸던 이론을 다듬기 너무 좋은 시간이였다!! 그리고 강사분 너무 수업 잘하셔서 듣기 너무 좋다..ㅠ

그러면 한번 맛깔나게 블로그 시작해보자!

 

CHAPTER 4.

-ROS의 기본 용어!-

Node - 최소단위의 실행 가능한 프로세서를 가리키는 용어. ROS에서는 최소한의 실행단위로 프로그램을 나누어 작업하게 된다. 각 노드는 메세지 통신으로 데이터를 주고받는다.

Package - 하나 이상의 노드, 노드 실행을 위한 정보 등을 묶어 놓은 것. 또한, 패키지의 묶음을 메타패키지라 하여 따로 분리한다.

Message - 메세지를 통해 노드간의 데이터를 주고받게 된다. 메세지는 integer, floating, point, boolean와 같은 변수형태이다. 또한, 메세지 안에 메세지를 품고 있는 간단한 데이터 구조 및 메세지들의 배열과 같은 구조도 사용할 수 있다.

쉽다! 쉽지 않을수도 있다. 다음으로 넘어가자.

 

- Message의 종류을 알아보자 -

Topic에 대해 말해보자. Publisher와 Subcriber사이의 주고받는 정보를 의미하며, 목적에 따라 1:1, 1:N, N:1, N:N도 가능하다!

(단방향에 연속성이 있다. 주로 센서데이터를 이용할때 이 topic을 사용한다.)

Service에 대해 알아보자. topic과는 다르게 요청과 응답의 단계가 있다. topic은 Pub이 자기 혼자 계속 주구장창 떠들고 있고,  Sub은 그냥 줍줍해서 듣는다고 생각해보면 쉽다. 이와는 다르게, Service는 클라이언트가 한번 물어보고, 서버가 한번 대답하는게 끝이다! (양방향, 일회성)

Action은 service와 매우 비슷하지만, 중간에 피드백이 있다는 점이 다르다. 주로 간단한 task가 아니라, 복잡하고 장시간 걸리고, 중간에 결과를 알고싶을때 사용한다.

ROS는 8~90%를 거의 topic을 사용하고, service 1~20% 사용한다. action의 비중이 적다고 알고 있으면 좋을 듯 하다!

 

-message 통신 개념을 잡아보자!-

0. ROS를 해보면 알겠지만, 마스터 구동은 필수이다. $ roscore 가 마스터이고, 각 실행되는 노드의 정보를 관리하며, 통신을 시켜주는 역할을 해준다. 마스터는 XMLRPC(XML-Remote Procedure Call)서버이다. (아주 간단한 서버-클라이언트 시스템이다.)

1. node2로  subscriber node를 구동한다면, 바로 마스터에게 정보를 전달해준다.(정보를 받는 입장임에도 정보를 마스터에게 전달한다. 왜? 기본적으로 마스터는 노드정보를 관리하는 애니까! 그리고 그렇게 만들어 놨으니까!) 그러면 무슨 정보를 준다는 걸까. 자신의 노드에 관한 정보를 주겠지!!(받고자 하는 정보는 나중에 받으니까 걱정 일단 하지 말자. 그냥 자신 노드 자체에 대한 정보를 주는 것이니까) >> 노드 이름, 토픽 이름, 메세지 타입, ip번호와 포트 번호 총 4가지를 전달한다.

2. 새로운 node1으로 publisher node를 구동한다면, 정보를 마스터에게 전달한다. 위와 마찬가지로 4가지의 정보를 전달한다. 그러면 마스터는 sub와 pub의 정보를 그냥 연결시켜주는 역할을 해서 노드간을 이어준다.

3. 마스터는 sub node에게 방금 pub에게 받은 뜨끈뜨끈한 신상 정보(pub 노드 자체에 관한 정보)를 전달해서 알려준다.

4. 신상 정보 받았으니, 바로 pub node에게 TCPROS접속 요청을 한다.

5. pub node가 TCPROS접속 응답을 해준다!!

6. 그러면 XMLRPC 통신 버리고, 바로 TCPROS서버-클라이언트로 서로 통신을 하기 시작한다.\

7. 접속한 후부터는 메세지를 전송한다!(일단 토픽이라 가정해보자. 가장 많이 사용하니까)

8. 토빅 말고도, 서비스도 마찬가지이다. 대신 서비스는 양방향으로 정보를 주고받는다는 사실!

 

진짜 대회준비하면서 이런거 세세히 알 수가 없었는데.. 너무 재밌다!! 필자는 공부할 때, 이론을 완벽히 잡아두고 세세히 들어가며 공부하는 방식을 매우 선호한다. 하지만 이번에 촉박한 시간 안에 linux환경이나 ros환경을 겉핣기식으로 공부하는 부분이 많이 불편했는데... 그나마 이 강의를 통해 개념을 잡을 수 있어서 정말 좋다.

 

이제 잡소리 그만하고 다시 본론으로 들어가보자.

 

-turtlesim 패키지-

0.roscore

1.rosrun turtlesim turtlesim_node

2.rosrun turtlesim turtle_teleop_key

3.rosrun rqt_graph rqt_graph

rosrun은 커맨드 라인 중 하나로, node하나를 실행시킬때 쓰이는 명령어이다.

사용방법은 rosrun "package_name" "node_name"이다!! 즉, 어떤 패키지 안의 무슨 노드를 실행시키라는 의미이다.

위에 적용해보자면, 1. turtlesim 패키지의 turtlesim_node를 실행시켜라 라는 의미이다.

 

-ROS 메세지의 예시-

파란화면의 거북이를 움직이기 위해서는 메세지를 전달하면 된다. rostopic list 를 검색하면, 그중 /turtle1/cmd_vel 이 있을 텐데, 이것의 info을 살펴보면 geometry_msgs/Twist 라고 나온다. 즉 Twist라는 메세지로 거북이의 이동을 정해준다고 생각하면 된다.

그 속에는Vector3 linear와 angular가 있고, 각각의 메세지 안에 또 float64x,y,z가 각각 포함되어 있다. 2차원이므로, linear의 x,y angular의 z를 이용해서 거북이를 이리저리 움직여보자!

이건 강사님이 설명안하셨지만 그냥 대회준비때 나온거라 해봤습니다^__^

CHAPTER 5.

 

-ROS 명령어-

roscd - 지정한 ROS패키지의 디렉터리로 이동

roscore - master, rosout(로그 기록), parameter server(파라미터 관리)

rorsrun - 노드 실행

roslaunch - 노드를 여러 개 실행 및 실행 옵션 설정

rosclean - ROS 로그 파일을 검사하거나 삭제

rostopic - ROS 토픽 정보 확인

rosservice - ROS 서비스 정보 확인

rosnode - ROS 노드 정보 확인

rosparam - ROS 파라미터 정보확인, 수정

rosbag - ROS 메시지 기록, 재싱

rosmsg - ROS 메시지 정보 확인

rossrv - ROS 서비스 정보확인

 

-ROS catkin 명령어-

catkin_create_pkg - 패키지 자동 생성

catkin_make - 캐킨 빌드 시스템에 기반을 둔 빌드

catkin_eclipse - 캐킨 빌드 시스템으로 생성한 패키지를 이클립스에서 사용할 수 있게 변경

catkin_prepare_release - 릴리즈할 때 사용되는 로그 정리 및 버전 태깅

catkin_generate_changelong - 릴리즈할 때 CHANGELOG.rst 파일 생성 또는 업데이트

catkin_init_workspace - 캐킨 빌드 시스템의 작업 폴더 초기화

 

-ROS 패키지 명령어-

rospack - ROS패키지와 관련된 정보 보기

rosinstall - ROS 추가 패키지 설치

rosdep - 해당 패키지의 의존성 파일 설치

 

CHAPTER 6.

RViz - ROS의 3D 시각화 툴이다. 보통 센서를 달고 볼때 사용한다고 한다. 내비게이션과 매니퓰레이션을 이용할 때도 필요하다.

일단 실행해보자.

ADD를 누르면, 많은 센서와 장치정보들을 사용할 수 있다!!

Rviz를 이용하면 센서 및 로봇 관련 데이터 시각화가 매우 간단하다는 장점이 있다고 하니, 자세히 알아둬야 겠다.

 

RQT - 플러그인 방식의 ROS의 종합 GUI 툴이다.

아무것도 안뜬다. 얘들은 각각의 rqt는 plugin에 들어있어서, plugin에서 선택적으로 골라서 실행시키는 방식이다.

장점은, 무엇을 만들면, 그냥 rqt프로그램에 추가하면 된다는 점이다!!

 

1. rqt_image_view

화면이 잡히지 않는다..! 아마도 내장캠의 연동성 문제인 듯 한데, 호환성이 잘 되는 웹캠을 하나 사서 도전해 봐햐 할듯하다..

(한 5시간 날리고 포기했다.. image_raw는 아예 까만색이여서 이걸로 캡쳐했다..)

2. rqt_graph

node와 message간의 흐름을 직관적으로 파악할 수 있다. 전부터 계속 사용해 오던거라 익숙하다!!

3.rqt_plot

신기하다..!!

4. rqt_bag

예전에 녹화해둔 영상이나 음성을 재생할 수 있다!!...

 

rqt를 이용하면 1. GUI형태로 ROS 이용이 가능하고, 2.GUI TOOL 제작이 간단하다고 한다!!

 

-3D simulator : Gazebo-

Gazebo는 로봇 개발에 필요한 3차원 시뮬레이션을 위한 로봇, 센서, 환경 모델 등을 지원하고 물리 엔진을 탑재하여 실제와 근사한 결과를 얻을 수 있는 3차원 시뮬레이터이다. ROS와 호환성이 매우 뛰어나다는 장점이 있다!

 

그 전에..! 이기종 디바이스 간의 통신에 대해 공부하고 넘어가자

강의 속의 내용을 실제로 할 수 는 없어서 아쉽지만 이론적인 부분을 공부해보자.

ifconfig를 실행해서, wlp2s0의 같은 네트워크를 확인한다.(나만의 IP)

이제 이거를 ROS_HOSTNAME에다가 적고,(bashrc에 들어가서 하자. sudo nano ~/.bashrc로 접속)

새롭게 터미널을 열고, rqt image view를 실행하자. 그러면 master와 공유할 수 있다!!

 

나가며

살면서 matlab에서 하는 간단한 코딩만 해본 경험이 전부라, 이렇게 딮하게 들어가서 공부하는게 나름 재밌다.(아직 안깊을수도..)

이러한 공부들은 재밌는데, 환경설정부분이 짜증이 나는 경우가 많다.. (터미널에서 python 3.7을 기본설정 했더니 다음부터 터미널 자체가 안켜지는 참담한 경험도 했다). 그래도 ubuntu환경에서 거의 한달 째 생활하는데, 이제 오류가 뜨면 아무생각없이 영어로 구글링하는 습관이 들어버려서 좋긴 하다. 진짜 소융대분들은 이거 어떻게 4년동안 하는지 모르겠다.. 신기방기

반응형