본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 이은선 #3주차 - ROS 기본 프로그래밍

반응형

topic

ROS에서는 단방향 통신일 때 Topic이라는 메시지 통신을 사용한다. 이때 송신 측을 Publisher, 수신 측을 Subscriber라고 부른다.

(1) 패키지 설치

▪︎ 자동으로 패키지 설치해주는 명령어

▪︎ 해석 : ros_tutorials_topic이라는 패키지를 만들었는데, 그 패키지는 message_generation, std_msgs, roscpp 패키지와 의존성이 있다. 

패키지를 작성할 때 가장 기본적으로 구성되어야 할 폴더와 파일들이 들어가있음.

 

(2) 패키지 설정 파일(package.xml) 수정

ROS의 필수 설정 파일 중 하나인 package.xml은 패키지 정보를 담은 XML 파일로서 패키지 이름, 저작자, 라이선스, 의존성 패키지 등을 기술하고 있다.

 

(3) 빌드 설정 파일(CMakeLists.txt) 수정

(4) 메시지 파일 작성

ros_tutorial_topic 폴더 안에 msg라는 폴더를 만들고, 그 안에 MsgTutorial.msg 파일을 만들어준다. 파일 안의 내용은 아래와 같다.

▪︎ 노드에서 사용할 메시지인 MsgTutorial.msg를 빌드할 때 포함하라는 뜻이다.

▪︎ Time (메시지 형식), stamp (메시지 이름)

   int32 (메시지 형식), data (메시지 이름)

 

(5) 퍼블리셔 노드 작성

ROS_INFO(명령어) : 사실상 printf와 동일한 역할을 하지만, ros에선 사용자의 목적에 따라 ROS_XXX 등의 명령어를 이용하여 출력을 대신한다.

-> 0.1초마다 1씩 증가된 count값과 시간을 표시하는 프로그램

(6) 서브스크라이버 노드 작성

msgCallback(함수) : 그 메시지를 받았을 때 처리하는 콜백함수

-> 받은 데이터를 출력하는 프로그램

(7) ROS 노드 빌드

catkin_make

* 하나의 노드에선 복수의 publisher/subscriber 노드 역할을 행할 수 있다.

 

(8) 퍼블리셔 실행

rosrun [실행시키려는 topic 이름] [해당 topic publisher 노드 이름]

처음에 해당 명령어를 실행하니까 빨간글씨로 에러가 났다. roscore를 실행 안하고 rosrun을 해서 발생한 문제였다.

우리가 작성한 프로그램대로 0.1초마다 1씩 증가된 count값과 시간이 표시되지만, 아직 실제로 publisher하고 있는 상태는 아니다. 

(9) 서브스크라이버 실행

rosrun [실행시키려는 topic 이름] [해당 topic subscriber 노드 이름]

해당 명령어를 실행하니까 실행시키려는 토픽을 찾을 수 없단 에러가 발생했다. 블로그를 참고하여 다음과 같은 세 개의 명령어를 실행 후 다시 rosrun 해봤더니 정상적으로 실행되었다.

 

rqt_graph를 통해 publisher와 subscriber 사이에 통신하는 걸 확인해볼 수 있다.

 

service 

ROS에서는 양방향 통신이 필요할 때 Service라는 메시지 통신을 사용한다. 이때 요청이 있을 때만 응답하는 서비스 서버와 요처아고 응답 받는 서비스 클라이언트로 나뉜다.

(1) 패키지 설치

 

(2) 패키지 설정 파일(package.xml) 수정

ROS의 필수 설정 파일 중 하나인 package.xml은 패키지 정보를 담은 XML 파일로서 패키지 이름, 저작자, 라이선스, 의존성 패키지 등을 기술하고 있다.

(3) 빌드 설정 파일(CMakeLists.txt) 수정

 

(4) 서비스 파일 작성

ros_tutorials_service 패키지 폴더 안에 srv라는 서비스 폴더를 새로 만들고, 그 안에 SrvTutorial.srv라는 서비스 파일을 만든다.

int64 a
int64 b
---
int64 result

int64 (메시지 형식), a, b (서비스 요청: request), result (서비스 응답: response), '---' (요청과 응답을 구분하는 구분자)

 

(5) 서비스 서버 노드 작성

(6) 서비스 클라이언트 노드 작성

 

(7) ROS 노드 빌드

catkin_make

 

(8) 서비스 서버 실행

서비스 서버는 서비스 요청이 있기 전까지 아무런 처리를 하지 않고 기다리도록 프로그래밍하였다. 그러므로 다음 명령어를 실행하면 서비스 서버는 서비스 요청을 기다린다. 

(9) 서비스 클라이언트 실행

서비스 클라이언트를 실행하면서 입력해준 실행 매개변수 2와 3을 서비스 요청 값으로 전송하도록 프로그래밍하였다.

2와 3은 각각 a,b 값으로 서비스를 요청하게 되고, 결과값으로 둘의 합인 5를 응답값으로 전송 받았다.

다음과 같이 서비스 클라이언트 노드와 서비스 서버 노드가 서로 통신하는 걸 확인할 수 있다.

 

*참고링크

https://www.youtube.com/watch?v=iGdQHi_wL1Y&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=7 

https://khstu-98.tistory.com/40

 

[ROS] catkin_make 후 rosrun 실행 시 'package not found' 오류

catkin_make를 통해 package를 build 해주었습니다. 오류 없이 build가 잘 되었습니다. catkin_ws/devel/lib/[package name] 폴더에 가니 exe 파일이 잘 생성되어 있는 것을 확인할 수 있었습니다. 그런데 rosrun [package

khstu-98.tistory.com

 

반응형