ROS 특징
1. 통신 인프라
> 노드 간 데이터 통신을 제공
> 통상적 미들웨어로 지칭되는 메시지 전달 인터페이스 지원
- 메시지 파싱 기능:
로봇 개발 시에 빈번히 사용되는 통신 시스템 제공
캡슐화 및 코드 재사용을 촉진하는 노드들 간의 메시지 전달 인터페이스
- 메시지의 기록 및 재생:
노드 간 송/수신되는 데이터인 메시지를 저장하고 필요시에 재사용 가능
저장된 메시지를 기반으로 반복적인 실험 가능, 알고리즘 개발에 용이함
- 메시지 사용으로 인한 다양한 프로그래밍 언어 사용 가능:
노드 간의 데이터 교환이 메시지를 사용하기 때문에 각 노드는 서로 다른 언어로 작성 가능
클라이언트 라이브러리: roscpp, rospy, roslisp, rosjava, roslua ...
- 분산 매개 변수 시스템:
시스템에서 사용되는 변수를 글로벌 키값으로 작성하여 공유 및 수정하여 실시간으로 반영
2. 로봇 관련 다양한 기능
> 로봇에 대한 표준 메시지 정의:
카메라, IMU, 레이저 등의 센서 / 오도메트리, 경로 및 지도 등의 내비게이션 데이터 등의 표준 메시지를 정의하여 모듈화, 협업 작업
> 로봇 기하학 라이브러리:
로봇, 센서 등의 상대적 좌표를 트리화 시키는 TF 제공
> 로봇 기술 언어:
로봇의 물리적 특성을 설명하는 XML 문서 기술
> 진단 시스템:
로봇의 상태를 한 눈에 파악할 수 있는 진단 시스템 제공
> 센싱/인식
: 센서 드라이버, 센싱/인식 레벨의 라이브러리 제공
> 내비게이션:
로봇에서 많이 사용되는 로봇의 포즈(위치/자세) 추정, 지도내의 자기 위치 추정 제공
지도 작성에 필요한 SLAM, 작성된 지도 내에서 목적지를 찾아가는 Navigatioin 라이브러리를 제공
> 매니퓰레이션(Manipulation):
로봇 암에 사용되는 IK, FK는 물론 응용단의 Pick and Place를 지원하는 다양한 Manipulation 라이브러리 제공
GUI 형태의 매니퓰레이션 Tools 제공(Movit!)
3. 다양한 개발 도구
> 로봇 개발에 필요한 다양한 개발 도구를 제공
> 로봇 개발의 효율성 향상
- Comman-Line Tools:
GUI 없이 ROS에서 제공되는 명령어로만 로봇 Access 및 거의 모든 ROS 기능 소화
- RViz:
강력한 3D 시각화툴 제공
레이저, 카메라 등의 센서 데이터를 시각화
로봇 외형과 계획된 동작을 표현
- RQT:
그래픽 인터페이스 개발을 위한 Qt 기반 프레임 워크 제공
노드와 그들 사이의 연결 정보 표시 (rqt_graph)
인코더, 전압, 또는 시간이 지남에 따라 변화하는 숫자를 플로팅(rqt_plot)
데이터를 메시지 형태로 기록하고 재생(rqt_bag)
- Gazebo:
물리 엔진을 탑재, 로봇, 센서, 환경 모델 등을 지원, 3차원 시뮬레이터
ROS와의 높은 호환성
ROS 용어
> Node:
최소 단위의 실행 가능한 프로세서를 가리키는 용어로서 하나의 실행 가능한 프로그램으로 생각하면 된다.
ROS에서는 최소한의 실행단위로 프로그램을 나누어 작업하게 된다.
메시지 통신으로 데이터를 주고 받는다.
> Message:
메시지를 통해 노드간의 데이터를 주고받게 된다.
메시지는 integer, floating, point, boolean 와 같은 변수형태이다.
또한 메시지 안에 메시지를 품고 있는 간단한 데이터 구조 및 메시지들의 배열과 같은 구조도 사용할 수 있다.
메시지 통신에 대해 더보기
Message-Passing System
메시지 전달 시스템 방식은 동일한 주소공간을 공유하지 않고도 프로세스들이 통신을하고,
그들의 동작을 동기화할 수 있도록 허용하는 기법을 제공한다. 메시지 전달 방식은 통신하는 프로세스들이
네트워크에 의해 연결된 다른 컴퓨터들에 존재할 수 있는 분산 환경에서 특히 유용하다.
메시지 전달 시스템은 최소한 두가지 연산(send와 receive)을 제공한다.
프로세스가 보낸 메시지는 고정 길이일 수도 있고 가변 길이 일 수도 있다.
고정 길이 메시지만 보낼 수 있다면, 시스템 수준의 구현은 간단하다.
그렇지만 이러한 제한은 프로그래밍 작업을 더욱 힘들게 한다.
반면에 가변 길이 메시지는 보다 복잡한 시스템 수준의 구현을 필요로하지만 프로그래밍 작업은 간단해진다.
하나의 링크(메시지 전달 링크) 와 send / receive 연산을 논리적으로 (물리적 구현 부분(공유 메모리, 하드웨어 버스,
네트워크 등)을 제외한 나머지) 구현하는 방법들은 다음과 같다.
- 직접 또는 간접 통신
- 동기식 또는 비동기식 통신
- 자동 또는 명시적 버퍼링
1. 명명 (Naming)
통신을 원하는 프로세스들은 서로를 가리킬 수 있는 방법이 있어야 한다.
프로세스들은 간접통신 또는 직접통신을 사용할 수 있다.
직접 통신을 하기 위해서는 통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시해야 한다.
이 기법에서 send 와 receive Primitive 들은 다음과 같이 정의된다.
- send(P, message): 프로세스 P에게 메시지를 전송한다.
- receive(Q, message): 프로세스 Q로부터 메시지를 수신한다.
이 기법에서 통신 연결은 다음과 같은 특성을 가진다.
- 통신을 원하는 두 프로세스 사이에 연결이 자동적으로 구축된다. 프로세스들은 통신하기 위해
서로 상대방의 신원(identification)만 알면 된다.
- 연결은 정확히 두 프로세스 사이에만 이뤄진다.
- 통신하는 한 쌍의 프로세스 사이에는 정확하게 하나의 연결이 존재해야 한다.
이 기법은 주소 방식에서 대칭성을 보인다.
즉, 송신자와 수신자 프로세스가 모두 통신하려면 상대방의 이름을 제시해야 한다.
이 기법의 변형으로서 주소 지정시 비대칭 형식을 사용할 수도 있다.
이 비대칭 직접 통신 기법은 송신자는 수신자를 명시하지만, 수신자는 송신자에 대해서 명시할 필요가 없다.
다시 말해 수신자가 송신자에 대해서 자세히 알 필요가 없는 경우에 이 비대칭 직접 통신 기법이 사용된다.
비대칭 직접 통신 기법의 경우 send와 recieve primitve 들은 다음과 같이 정의된다.
- send(p, message) : 메시지를 프로세스 P에 전송한다.
- reveive(id, message) : 임의의 프로세스로부터 메시지를 수신한다. 변수 id는 통신을 발생시킨 프로세스의 이름으로 설정
<메시지 통신 개념잡기>
ROS에서 가장 기본이 되는 기술적 포인트 : 노드간의 메시지 통신
마스터 구동 : 노드 정보 관리(노드들의 통신을 연결시켜주는 매개체 역할을 함)
XMLRPC (XML-Remote Procedure Call)
Subscriber Node 구동
Receved topic Node2
Send a Subscriber Node information to MASTER
(NodeName, TopicName, MessageType(Camera, Motor,..), IP information, Port Number(Network Info))
Pubscriber Node 구동
Received topic Node1
Send a Publisher Node information to MASTER
(NodeName, TopicName, MessageType(Camera, Motor,..), IP information, Port Number(Network Info))
Success Matching:
SubscriberNode receive Information about Publisher Node.
SubscriberNode request access to PublsiherNode(TCP ROS 접속요청)
PublisherNode response access to SubscriberNode (TCP ROS 접속응답)
Publisher(TCP ROS ACCESS)
XMLRPC : Server -> TCP ROS: Server
Subscriber(TCP ROS ACCESS)
XMLRPC : Client -> TCP ROS: Server
TOPIC
Publisher -> Send a message(topic) -> Subscriber
SERVICE (Access Only Once)
Publisher <-> Send and reveive a message(service) <-> Subscriber
예제: turtlesim
Subscriber: turtlesim_node 노드
Publisher : send a data from Keyboard input value (arrow)
/teleop_turtle(Publsiher)
>>
/turtle1
/turtle1/cmd_vel
>>
/turtlesim(Subscriber)
-------
$rostopic list
/rosout
/rosout_agg
/statistics
/turtle1/cmd_vel ( /turtle1/turle1/cmd_vel )
/turtle1/color_sensor
/turtle1/pose
-----------------
Parameter Server: ROSMASTER 의 일부 기능
parameter variable : global variable 처럼 다루며 외부에서 접근
----
ROS Message
메시지는 노드 간의 데이터를 주고 받을 때 사용하는 데이터의 형태
토픽, 서비스, 액션은 모두 메시지를 사용
단순자료형인 정수, 부동소수점, 불
메시지안에 메시지를 품고 있는 간단한 데이터구조
- geometry_msgs/PoseStamped
메시지들이 나열된 배열과 같은 구조
- float32 [] ranges
- sensor_msgs/LaserScan
> Package:
하나 이상의 노드, 노드 실행을 위한 정보 등을 묶어 놓은 것.
또한 패키지의 묶음을 Meta Package라 하여 따로 분리한다.
ROS Command
<ROS 정보 명령어>
rostopic ROS 토픽 정보 확인
rosservice ROS 서비스 정보 확인
rosnode ROS 노드 정보 확인
rosparam ROS 파라미터 정보확인
rosmsg ROS 메시지 정보확인
rossrv ROS 서비스 정보확인
rosversion ROS 패키지 및 배포 릴리즈 정보 확인
<ROS 노드 명령어>
rosnode list 활성화된 노드 목록 확인
<ROS 토픽 명령어>
rostopic list 활성화된 토픽 목록 표시
rostopic echo [topicName] 지정한 토픽의 메시지 내용 실시간 표시
rostopic find [typeName] 지정한 타입의 메시지를 사용하는 토픽 표시
rostopic type [topicName] 지정한 토픽의 메시지 타입 표시
rostopic bw [topicName] 지정한 토픽의 메시지 데이터 대역폭 표시
rostopic hz [topicName] 지정한 토픽의 메시지 퍼블리시 주기 표시
rostopic info [topicName] 지정한 토픽의 정보 표시
rostopic pub [topicName][msgType][param] 지정한 토픽이름으로 메시지 퍼블리시
<ROS 서비스 명령어>
rosservice list 활성화된 서비스 정보 출력
rosservice info [serviceName] 지정한 서비스의 정보 표시
rosservice type [serviceName] 지정한 서비스의 타입 출력
rosservice find [serviceType] 지정한 서비스타입의 서비스 검색
rosservice args [serviceName] 서비스 파라미터 출력
rosservice call [srvName][param]입력된 파라미터로 서비스 요청
<ROS 파라미터 명령어>
rosparam list 파라미터 목록 보기
rosparam get [paramName] 파라미터 값 불러오기
rosparam set [paramName] 파라미터 값 설정
roscd changes directory
Topic
: 단방향, 연속성을 가진 통신 방법 중의 하나 (ROS 용어) - (메시지 통신 방법중의 하나)
실제적으로 Message 가 날아감 Message(data)
PUBLISHER -> SUBSCRIBER1, SUBSCRIBER2, SUBSCRIBER3...
PublisherNode -> SubscriberNode (send a message, receive a message, using Topic)
Publisher(Odometry) -> Topic : Location information(x, y, theta) -> Subscriber(SLAM)
Publisher(distance sensor) -> disturb- > ROBOT_a, ROBOT_b
TOPIC 일방적인 data를 계속 보내는 경우 (센서 데이터)
센서데이터는 계속적, 연속적으로 data를 보내는 경우
Odometry
odometer:
주행 거리계 또는 적산 거리계를 이른다.
그 차가 달린 총 주행 거리를 나타내는 계기로서, 구간 거리계인 트립미터와 구별된다.
아날로그의 경우에는 스피드미터 안에 들어 있다.
이것은 트랜스미션 출력 축의 회전을 스피드미터 케이블로 이끌어 기어를 움직이고 계산하는 시스템으로 되어 있다.
속도계에는 주행 속도를 표시하는 속도계와 주행거리를 누적하는 마일 리코더(mile recoder)가 있다.
그 중에서 마일리코더를 오더미터라고 한다.
자동차가 완성된 후 주행한 총 주행 거리를 나타내는 계기로 적산 계기라고도 한다.
주로 스피드 미터 중앙부에 설치된다.
Odometry: (차의) 주행 거리 측정
시간에 따른 위치 변화를 추정하기 위해 모션 센서의 데이터를 사용하는 것
시작 위치(출발점, 기준점)에 대한 위치를 추정하기 위해
일부 다리 또는 바퀴 달린 로봇에 의해 로봇공학(Robotics)에서 사용된다.
즉, 오도메트리(Odometry)는 GPS처럼 절대적인 위치를 아는 것이 아닌,
출발지점으로부터 얼마나 떨어져 있나를 파악하는 상대적인 위치를 추정하는 개념이다.
이때 중요한 것은 바퀴의 위치가 아니고
센서의 위치가 가장 중요하다. (센서로부터 측정되는 값을 기준으로 하므로)
odometry는 모터(바퀴)에 달린 엔코더를 통해 거리를 측정하고
엔코더 값과 거리를 통해 위치를 추정하는 방법을 말한다.
바퀴의 각도와 거리를 이용하여 위치를 추정할 수 있다.
Odometry란 단어 그대로 주행기록계라는 의미로서 엔코더를 통한 회전수와 IMU(관성 측정장비)로 기울기
등을 측정함으로서 움직이고 있는 사물의 위치를 측정하는 방법을 의미합니다.
Odometry는 ROS에서 odom frame으로 구현되며 위에서 설명한 엔코더 혹은 IMU를 사용하여 위치를
추정할 수 있습니다. 부득이하게 Visual SLAM 을 사용하여 위의 센서를 사용하지 못할 경우 카메라를 통하여
관측한 값을 토대로 Odom 을 추정하는 방법을 사용할 수도 있습니다.
Service 양방향 일회성 data 통신
Service, Service server, Service client
Server(response) <-> Client(request)
예를 들어,
Service Client에서 x 좌표, y좌표 각도 theta 으로 해서 request,
Service Server에서 request에 맞춰 처리하고 응답 response
Action
Action, Action server, Action client
Service와 유사하나 중간결과 Feedback 을 보내줌
ROS 대부분이 80~90% 토픽통신, 5~10% 서비스통신
Name, TF, Client Library
이기종 디바이스 간의 통신
>Name
- Node, Message(Topic, Service, Action, Parameter) 가 가지는 고유의 식별자
- ROS는 그래프(Graph)라는 추상 데이터 형태(Abstract data type) 지원
- 글로벌(Global):
문자 없이 네임을 바로 쓰거나 네임 앞에 슬래쉬(/)를 붙임
- 프리베이트(private):
네임앞에 틸트(~)를 붙임
>좌표변환(TF, transform)
- 각 조인트(joint)들의 상대 좌표 변환
트리(tree) 형태로 조인트 들간의 관계도를 표시함
> 클라이언트 라이브러리 (Client Library)
roscpp..
'ROS_1' 카테고리의 다른 글
ROS 1.0 summary_03 (0) | 2022.10.09 |
---|---|
ROS 1.0 summary_02 (0) | 2022.10.09 |
Error: Package not found (0) | 2022.10.03 |
msgs (0) | 2022.09.30 |
ros::init() (0) | 2022.09.30 |