자율주행/ROS python (xytron 강의)

ROS day1

Tony Lim 2020. 12. 21. 20:01
728x90

Robot OS (ROS Kinetic Kame (long-term april2021)

로봇 SW를 만들기 위한 코드의 재사용이 용이한 환경제공이 목표

다양한 OS 환경에서 통일된 방법으로 상호작용을 구현하는 것이 가능하다. 표준화된 통신 프로토콜을 따르는 이기종간의 메세지 교환이 가능하다

ROS에서 통신은

이런 형식으로 작동한다 Publisher가 topic을 발사하면 해당 topic 을 subscribe한 Subscriber 가 그 토픽을 가져가서 처리한다.

마스터 == 서로 다른노드들 사이의 통신을 총괄관리 ROS Core

노드 == 실행가능한 최소의 단위 , ROS에서 발생하는 통신(송/수신) 의 주체 

토픽 == ROS 노드들이 관심을 가지고 있는 이야깃거리 , 그안에 실제 들어있는것들은 메시지 라고 부름

발행자 == 특정 토픽에 메세지를 담아 외부로 송신하는 노드

구독자 == 특정 토픽에 담겨진 메세지를 수신하는 노드

패키지 == 하나 이상의 노드와 노드들의 실행을 위한 정보 등을 묶어 놓은 단위

통신의 방법은 크게 2가지인데 
일방적이고 지속적인 메세지 전송을 하는 토픽 방식의 통신
서비스 방식의 통신 == 양방향 통신 ,일회성 메세지 송수신

통신 시나리오

1. 마스터 시동 == roscore를 실행한다.

2. 구독자 노드 구동 == 특정 토픽에 발행되는 메세지를 수신하기를 마스터에 요청을 한다. (http://ROS_HOSTNAME:1234) 

3. 발행자 노드 구동 == 특정 토픽 메세지를 발해하겠다는 의사를 전달한다. 이때 마스터 입장에서는 구독자가 무슨 메세지를 원하는것을 아니까 둘을 tcp로 연결시켜준다.

4. 노드 정보 전달 == 마스터가 발행자 정보를 구독자에게 전달해준다. XMLRPC 서버

5. 노드간 접속 요청 == 구독자 노드가 발행자 노드에 TCPROS 접속을 요청한다. 

6. 노드간 접속 요청에 대한 응답 (ACK ) == 발행자 노드가 자신의 TCPROS URI(포트 포함) 를 전송하여 응답 

7. TCPROS 접속 == 발행자 노드와 구독자 노드 사이에 소켓 연결이 이루어짐

8. 메세지 전송 == 발행자 노드가 구독자 노드에게 메세지 전송(토픽) == 일방적이고 지속적인 통식

9. 메세지 전송 반복 == 접속이 한번 이루어진 뒤에는 별도 절차 업싱 지속적으로 메세지 송수신

 ROS 명령어

roscore == Ros 기본 시스템이 구동되기 위해 필요한 프로그램들을 실행

rosrun [package name] [node_name] == 패키지에 있는 노드를 선택 실행, rosrun turtlesim turtlesim_node

rosnode [info...] == 노드의 정보를 표시 ( 발행, 구독 정보) , rosnode info node_name

rostopic [options] == 토픽의 정보를 표시 , rostopic info /imu (토픽의 정보를 출력 (메세지 타입, 노드 이름 등))

roslaunch [package_name] [file.lauch] == 파라미터 값과 함께 노드를 실행 , roslaunch usb_cam usb_cam-test.launch

실습

첫번쨰 노드(pub.py 로 만들어진 publisher) 에서 /turtle1/cmd_vel 토픽을 보내주면 두번 째노드에서 그것을 처리하고 새로운 토픽 /turtle1/pose 를 sub.py 를 통해 만들어진 subscriber에게 보내준다

새로운 패키지를 만들고 빌드를 해준다. 

pub.py == publisher로 /turtle1/cmd_vel 토픽을 생성해준다. msg 자료구조는 Twist() 로 안에 정보를 채워준다
rospy.Rate(1) == 1초에 1번씩 밑에 rate.sleep()을 위한것이다. 계속 topic(msg) 를 보내줄것이다.

sub.py == subscriber로 /turtle1/pose 토픽을 계속 수신한다. 수신될 때마다 callback 함수를 호출하여 로그를 찍는다. rospy.spin() == 거의 무한루프의 의미이다.

728x90

'자율주행 > ROS python (xytron 강의)' 카테고리의 다른 글

8자주행 odom coverter 과제 답안  (0) 2021.01.12
자이카 ROS 패키지  (0) 2021.01.07
ROS 과제 답안  (0) 2021.01.04
ROS day3  (0) 2020.12.23
ROS day2  (0) 2020.12.22