[Udacity Robotics program] ROS
#ROS 기본 소개
로봇 개발을 크게 단순화 하는 소프트웨어 프레임 워크인 로봇 운영 체제(ROS)
(Robot Operating System)
@ROS로 로봇을 개발할 때 이점들
-오픈소스
-OS와 마찬가지로 하드웨어와 통신 수단 제공
-다른 프로세스와도 통신 가능 // 메시지 전달
-catkin이라는 빌드/패키지 관리 시스템
이것 때문에 쉽게 SW 개발, 배포 가능
-ROS는 시각화, 시뮬레이션, 분석도구들
-광범위한 커뮤니티 지원, 강력한 SW 라이브러리
+ ROS는 2000s Stanford 인공 지능 연구소에서 프로젝트를 전환하면서 시작
+ ROS의 목적은 개발 프로세스를 용이하게 하는 것. (기존에는 코드와 아이디어 공유가 어려웠음.)
@nodes와 topics
-로봇들은 모양과 하는 일은 다 다르지만, 인지 - 판단 - 행동의 큰 가지는 똑같다.
-각 과정에 노드들이 있고, 그 노드들은 ROS MASTER에 의해 서로 소통한다.
-ROS MASTER는 노드가 서로 찾고 통신 할 수 있도록 매개변수 서버를 호스트한다.
매개변수 서버 : 실행중인 노드 간에 공유되는 매개변수 및 구성 값 저장하는데 사용
-node : 프로세스(하나의 프로그램)
-topic : 노드와 노드가 연결되있는 파이프, 길
노드와 노드 사이에는 topic 이라는 길이 나있고, 그 길로 메시지가 지나간다.
길도 이름이 있는 것처럼 topic도 이름이 다 있다.
차도, 자전거 도로, 인도 처럼 topic도 그 안에 다닐 수 있는 메시지가 정해져 있다. 물론 누가 다닐지도 정할 수 있다.
편지와 마찬가지로 메시지는 하나의 이미지만 오는게 아닌, 인삿말, 본분, 맺음말 ... 이런 식으로 다양한 데이터가 함께온다.
한 노드가 다양한 topic을 받을 수 있고, 많은 노드에게 topic을 줄 수 있다.
여기 예를 보면 "Camera 노드"에서 찍은 차선 이미지를 '/camera_image' topic 을 통해 이미지 데이터가 "Decision 노드"로 전달하고,"Decision 노드"가 차선 이미지를 보고 이탈하지 않게 바퀴를 얼마 조절하겠다 하는 데이터를 "Motor Control 노드"에게 보내서 차선을 이탈하지 않게 차가 핸들을 꺾는다.
@Message Passing
ROS에 미리 정의된 다양한 유형의 message가 있다. (200개 이상)
물리적 : position, velocity, acceleration, rotation, duration ...
센서 Reading : laser scan, images, point cloud, inertial, measurements ...
나만의 message를 직접 정의할 수 있다.
@Services
Publisher와 Subscriber 간의 topic을 통해 Message를 전달하는 것은 유용하지만, 항상 그런건 아니다. 요청과 응답하는 패턴이 유용한 경우도 있다. 예를들어 매 순간의 이미지를 받고 싶은게 아닌, 한 순간의 이미지 1번을 받고 싶을 때는 topic을 통한 Message 전달이 아닌 ROS에서 제공하는 Service라는 것을 이용한다.
Service도 노드간에 Message를 전달할 수 있다.
Service는 Publisher와 Subscriber가 따로 없다.
Service는 요청 및 응답 메시지를 사용해 일대일로 상호 작용 한다.
topic을 통한 Message 전달에서는 다음과 같이 카메라가 이미지를 게시할 때마다 이미지 Message를 전달한다.
Service를 통한 Message 전달에서는 BEHAVIOR EXECUTOR가 요청 message를 보내면, 카메라가 image message로 응답한다.
@Compute Graph
노드, topic, 연결의 다이어그램을 compute Graph라 한다. 이렇게 compute graph를 시각화 하면 어떤 노드가 존재하는지, 서로 어떻게 통신하는지 이해하는데 유용하다.
ROS에서는 이러한 comput graph를 보여주는 도구로 rqt_graph를 지원한다.
@Source the ROS 환경
source /opt/ros/kinetic/setup.bash // ros 사용하기 위한 명령어
이걸 실행할 때마다 사용한다면 매우 불편하기에 /.bashrc 가 있다. bashrc는 bash 세션을 시작할 때마다 자동으로 실행되는 쉘 스크립트, 즉 터미널을 열때마다 자동으로 bashrc가 실행된다.
gedit ~/.bashrc 로 bashrc에 위 source /opt/ros/kineitc/setup.bash를 입력후 저장해주면 터미널을 켤때마다 위 명령어를 실행하지 않아도 된다.