차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
activity:public:2021:ros:2 [2021/09/23 19:00:11] – ↷ 문서 이름이 activity:public:2021:ros:210914에서 activity:public:2021:ros:2(으)로 바뀌었습니다 als2010activity:public:2021:ros:2 [2021/10/03 15:16:36] (현재) – [ROS STUDY #2: ROS 기본 개념, 명령어] yhy01625
줄 1: 줄 1:
 +======ROS STUDY #2: ROS 기본 개념, 명령어======
  
 +{{youtube>RVn6YZZsEZs?medium}}
 +=====1. ROS 용어=====
 +  * **노드(Node)**: 최소 단위의 실행 가능한 프로세스로, 하나의 실행 가능한 프로그램으로 생각하면 된다. 각 노드는 메시지 통신으로 데이터를 주고받는다. 노드를 사용하면 하나의 노드에서 오류가 발생했을 때 다른 노드까지 영향이 가지 않는 이점이 있다.
 +  * **패키지(Package)**: 하나 이상의 노드, 노드 실행에 필요한 정보를 묶어 놓은 것. 패키지의 묶음은 메타패키지라 한다.
 +  * **메시지(Message)**: 노드 간 주고받는 변수 형태의 데이터. 메시지나 메시지의 배열 등의 구조를 메시지로 사용할 수 있다.
 +
 +=====2. 메시지 통신의 종류===
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_2.0.png?600|}}
 +
 +메시지의 종류에는 토픽, 서비스, 액션 세 가지가 있다.
 +^종류 ^ 동기 ^ 방향 ^ 사용 ^
 +| Topic | 비동기 | 단방향 | 연속으로 데이터를 송수신 |
 +| Service | 동기 | 양방향 | 요청 처리가 순간적(1회성); 현재 상태를 확인하고 응답받는 것이 필요한 경우 | 
 +| Action | 비동기 | 양방향 | 요청 처리 후 응답까지 오래 걸려서 서비스를 이용하기 어려운 경우, 중간 피드백값이 필요한 경우 |
 +
 +====2.1. 토픽(Topic)====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_2.1.png?600|}}
 +
 +토픽은 실시간으로 전송되는 단방향성 메시지이다. 퍼블리셔나 서브스크라이버가 중지하지 않는 이상 메시지를 계속 보낸다.\\
 +이러한 특성 때문에 로봇의 상태나 센서 메시지 등을 보낼 때 토픽을 많이 사용한다.
 +
 +====2.2. 서비스(Service)====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_2.2.png?600|}}
 +
 +서비스는 1회성의 메시지이다. 토픽에서는 동등한 지위의 두 개의 노드간에 통신이 이루어졌지만, 서비스는 서비스 서버와 클라이언트 사이에서 통신이 이루어진다.\\
 +서비스 클라이언트는 서비스를 요청하는 입장이고, 서비스 서버는 서비스를 요청받아 정해진 프로세스를 수행하고 응답하는 역할이다.\\
 +요청과 응답을 수행하면, 서로의 접속을 끊으므로, 다시 필요하면 접속부터 새롭게 진행해야 한다. \\
 +1회성이라는 특징때문에, 로봇에 1회성 행동 명령을 내려야 하는 경우 많이 사용된다. 
 +
 +====2.3. 액션(Action)====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_2.3.png?600|}}
 +
 +액션은 서비스에서 중간 결과값을 보고하는 부분이 추가된 통신이다. 서비스를 기반으로 만들어진 통신이라 생각하기 쉽지만, 실제로는 토픽을 바탕으로 구동된다.\\
 +서비스와는 다르게 클라이언트에서 취소명령을 보내거나, 서버에서 결과값을 보내면 접속이 종료된다.
 +
 +=====3. 메시지 통신의 과정=====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.0.png?600|}}
 +
 +====3.1. 마스터 구동====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.1.png?600|}}
 +
 +<sxh bash title: 실행법>
 +roscore
 +</sxh>
 +
 +모든 ros 노드들에 대한 **정보 중계**를 담당.\\
 +각 노드들이 **서로의 존재를 인식하게 하는 역할**만 담당하고, 이후는 노드들끼리 직접 통신한다. 즉, **모든** 통신이 roscore를 거치는 것은 아니다.
 +
 +====3.2. 서브스크라이버 노드 구동====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.2.png?600|}}
 +
 +<sxh bash title: 실행법>
 +rosrun 패키지이름 노드이름
 +</sxh>
 +Subscriber나 Client를 따로 임의로 실행시킬 때 사용한다. 서브스크라이버 노드는 구동과 함께 마스터에 자신의 노드 이름과 메시지 형태, URI 주소 등 각종 정보를 등록한다.\\
 +
 +====3.3. 퍼블리셔 노드 구동====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.3.png?600|}}
 +
 +<sxh bash title: 실행법>
 +rosrun 패키지이름 노드이름
 +</sxh>
 +Publisher나 Server를 따로 임의로 실행시킬 때 사용한다. 퍼블리셔 노드도 위와 마찬가지로 구동과 함께 마스터에 각종 정보를 등록한다.\\
 +
 +====3.4. 퍼블리셔 정보 알림====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.4.png?600|}}
 +
 +마스터는 서브스크라이버 노드에게 새로운 퍼블리셔 정보를 알린다.
 +
 +====3.5. 퍼블리셔 노드에 접속 요청====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.5.png?600|}}
 +
 +서브스크라이버 노드는 마스터로부터 받은 퍼블리셔 정보를 이용해 퍼블리셔 노드에게 직접 접속을 요청한다.
 +
 +====3.6. 서브스크라이버 노드에 접속 응답====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.6.png?600|}}
 +
 +퍼블리셔 노드는 서브스크라이버 노드의 접속에 응답하여 자신의 URI 주소와 포트번호를 전송한다.
 +
 +====3.7. TCPROS 접속====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.7.png?600|}}
 +
 +TCPROS를 이용하여 서브스크라이버 노드와 퍼블리셔 노드가 직접 연결된다.
 +
 +====3.8. 메시지 전송====
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_3.8.png?600|}}
 +
 +토픽, 서비스, 액션으로 메시지를 송·수신한다.
 +
 +=====4. ROS 명령어=====
 +다음은 ROS에서 주로 사용되는 명령어이다.\\
 +
 +====4.1. 패키지 파일 관리====
 +^ 명령어 ^ 중요도(사용빈도) ^ 의미 ^ 기능 ^
 +| ''roscd'' | ★★★ | ros+cd(change directory) | 지정한 ROS 패키지의 디렉터리로 이동 |
 +| ''rosls'' | ★☆☆ | ros+ls(list files) | ROS 패키지의 파일 목록 확인 |
 +| ''roscp'' | ★☆☆ | ros+cp(copy files) | ROS 패키지의 파일 복사 |
 +
 +====4.2. 실행====
 +^ 명령어 ^ 중요도(사용빈도) ^ 의미 ^ 기능 ^
 +| ''roscore'' | ★★★ | ros+core | - master(ROS 네임 서비스) - rosout(로그 기록) - parameter server(파라미터 관리)
 +| ''rosrun'' | ★★★ | ros+run | 노드 실행 |
 +| ''roslaunch'' | ★★★ | ros+launch | 노드를 여러 개 실행 및 실행 옵션 설정 |
 +| ''rosclean'' | ★★☆ | ros+clean | ROS 로그 파일을 검사하거나 삭제 |
 +
 +====4.3. 목록====
 +^ 명령어 ^ 중요도(사용빈도) ^ 기능 ^
 +| ''rosnode list'' | ☆☆☆ | 활성화된 노드 목록 확인 |
 +| ''rostopic list'' | ☆☆☆ | 활성화된 토픽 목록 표시 |
 +| ''rosservice list'' | ☆☆☆ | 활성화된 서비스 정보 출력 |
 +
 +====4.4. 빌드 도구(catkin)====
 +^ 명령어 ^ 중요도(사용빈도) ^ 기능 ^
 +| ''catkin_create_pkg'' | ★★★ | 패키지 자동 생성 |
 +| ''catkin_make'' | ★★★ | 캐킨 빌드 시스템에 기반을 둔 빌드 |
 +| ''catkin_init_workspace''| ★★☆ | 캐킨 빌드 시스템의 작업 폴더 초기화 |
 +| ''catkin_find'' | ★☆☆ | 캐킨 검색 |
 +
 +====4.5. 패키지 관리====
 +^ 명령어 ^ 중요도(사용빈도) ^ 의미 ^ 기능 ^
 +| ''rospack'' | ★★★ | ros+pack(age) | ROS 패키지와 관련된 정보 보기 |
 +| ''rosinstall'' | ★★☆ | ros+install | ROS 추가 패키지 설치 |
 +| ''rosdep'' | ★★☆ | ros+dep(endencies) | 해당 패키지의 의존성 파일 설치 |
 +
 +출처: {{https://github.com/robotpilot/ros-seminar/blob/master/05_ROS_%EB%AA%85%EB%A0%B9%EC%96%B4.pdf|05_ROS_명령어.pdf}}\\
 +더 많은 명령어: [[https://confirmed-cardboard-d8a.notion.site/87180597e4cf4e46a4c0f0d6e65d5380?v=235baf19a5964077a3ee26c0df393d5f|ROS 명령어]]\\
 +
 +=====5. 적용=====
 +====5.1. turtlesim====
 +turtlesim 패키지로 배운 내용을 적용해 보자.\\
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_5.1.png?200|}}
 +
 +이 예제는 터미널 창 3개를 띄우고 시작한다.\\
 +\\
 +먼저, 마스터를 구동한다.
 +<sxh bash>
 +roscore
 +</sxh>
 +
 +그 다음으로, turtlesim 패키지의 turtlesim_node 서브스크라이버 노드를 구동한다.
 +<sxh bash>
 +rosrun turtlesim turtlesim_node
 +</sxh>
 +
 +turtlesim 패키지에서 키보드 입력을 받는 turtle_teleop_key 퍼블리셔 노드를 구동한다.
 +<sxh bash>
 +rosrun turtlesim turtle_teleop_key
 +</sxh>
 +
 +이제 토픽으로 메시지가 전송되어 키보드의 방향키 입력이 실시간으로 거북이의 움직임에 반영된다.\\
 +키보드의 방향키를 이용해 거북이를 움직여보자.\\
 +↑: 전진 ↓: 후진 ←: 좌로 회전 →: 우로 회전\\
 +
 +====5.2. RQt====
 +**계기판**.\\
 +각종 변수 값, 노드 간 통신상태 확인 및 Topic 수동 조회 등이 가능하다.\\
 +\\
 +위의 turtlesim 예제를 실행한 상태로 노드 그래프를 생성해보자.
 +<sxh bash>
 +rqt_graph
 +</sxh>
 +{{https://img.kasimov.synology.me/2021/rosstudy/rosstudy%232/ros_study_%232_5.2.png?400|}}