본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 신의석 #3주차 - ROS 기본 프로그래밍

반응형
3주차 스터디에선 ROS 기본 프로그래밍을 배워봤습니다.

 

*출처

ROS 강의

https://www.youtube.com/playlist?list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw

ROS 강의 pdf 자료

https://github.com/robotpilot/ros-seminar 

 

GitHub - robotpilot/ros-seminar: ROS 수업, 세미나, 강연, 강의 등의 보조 자료

ROS 수업, 세미나, 강연, 강의 등의 보조 자료. Contribute to robotpilot/ros-seminar development by creating an account on GitHub.

github.com

Chapter 7. ROS 기본 프로그래밍

 

1. ROS 프로그래밍 전에 알아둬야 할 사항

프로그래밍 규칙은 개인적인 프로그래밍을 할 때는 지키지 않아도 되나, 공식패키지를 만들 때는 지켜줘야 합니다. 평소에도 지키면서 하면 좋을 것 같습니다.

 

2. 실습

실습으로는 topic, service, parameter, roslaunch 를 구동해 봤습니다.

 

-Topic-

우선 Topic은 ROS에서 단방향 통신으로 연속적인 정보전달형태입니다. 송신 측을 publisher, 수신 측을 subscriber라고 합니다.

 

※Topic 실습 순서※

1. 패키지 생성:

cd ~/catkin_ws/src
catkin_create_pkg ros_tutorial_topic message_generation std_msgs roscpp
catkin_ws/src위치에 ros_tutorial_topic라는 이름의 패키지를 생성합니다. (c++언어)

2. 패키지 설정 파일 수정: ROS의 필수 설정 파일  package.xml은 패키지 정보를 담은 XML파일이다. 패키지 이름, 저작저, 라이선스, 의존성 패키지, 메시지 이름 등을 담아야 합니다.

gedit package.xml
package.xml 파일을 형식에 맞게 수정합니다. (pdf 참조)

수정할 때의 모습(pdf에서 복붙하면 됩니다.)
배포한 패키지가 공유될 떄 패키지 정보가 나오는 실제 예시

3. 빌드 설정 파일 수정:

gedit CMakeLists.txt
위 과정과 비슷하게 CMakeLists.txt 파일을 수정합니다. (pdf 참조)

4. 메시지 파일 작성:

$ mkdir msg
$ cd msg
$ gedit MsgTutorial.msg
$ cd ..
위 CMakeLists.txt 파일에 add_message_files(FILES MsgTutorial.msg) 가 있었습니다.
msg라는 메시지 폴더를 만든다.
msg로 이동 후  CMakeLists.txt에 입력해 놓은 MsgTutorial.msg를 수정합니다. 
입력할 내용:
time stamp
int32 data

메시지 형식과 메시지 이름(이외에도 bool, int8, int16, float32, string, time, duration 등의 메시지 기본 타입과 ROS에서 많이 사용되는 메시지를 모아놓은 common_msgs 등도 있습니다.)

5. 퍼블리셔 노드 작성:

cd src
gedit topic_publisher.cpp 
src로 이동 후 gedit topic_publisher.cpp를 수정합니다.(pdf 참조)
CMakeLists.txt에 add_executable(topic_publisher src/topic_publisher.cpp)라는 옵션을 주었기에 gedit 할 때 "topic_publisher.cpp" 이름을 같게 해야 합니다.

6. 서브스크라이버 노드 작성:

roscd ros_tutorials_topic/src
gedit topic_subscriber.cpp 
ros_tutorials_topic/src로 이동 후 topic_subscriber.cpp를 수정합니다.(pdf 참조)
퍼블리셔 노드와 같이 이름을 조심해야 합니다.

7. ROS 노드 빌드:

cd ~/catkin_ws
catkin_make
노드를 빌드한다.

8. 퍼블리셔 실행

rosrun ros_tutorials_topic topic_publisher

9. 서브스크라이버 실행

rosrun ros_tutorials_topic topic_subscriber

10. 실행된 노드들의 통신 상태 확인

rqt_graph

연속적으로 메시지가 전달되고 있음을 볼 수 있다.

 

-Service-

서비스는 양방향 통신으로 요청이 있을 때만 응답하는 서비스 서버, 요청하고 응답을 받는 서비스 클라이언트가 있다.

 

※Service 실습 순서※

1. 패키지 생성

2. 패키지 설정 파일 수정

3. 빌드 설정 파일 수정

4. 서비스 파일 작성

5. 서비스 서버 노드 작성

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

7. ROS 노드 빌드

까지는 위 Topic과 비슷한 흐름으로 진행할 수 있습니다. (pdf 참조)

8. 서비스 서버 실행: 요청이 오기 전까진 대기

rosrun ros_tutorials_service service_server

9. 서비스 클라이언트 실행: 요청하기

서비스노드 코드는 요청받은 숫자 두 개를 더해준 값을 응답해 주는 코드다. 

방법 1
rosrun ros_tutorials_service service_client 2 3

방법 2
rosservice call /ros_tutorial_srv 10 2

방법 3
rqt

plugins->service->service caller에 들어갑니다.
a, b에 원하는 숫자 입력 후 call버튼을 을 누릅니다.

 

하나의 노드는 복수의 퍼블리셔, 서브스크라이버, 서비스 서버, 서비스 클라이언트 역할을 다 할 수 있습니다.

 

-Parameter-

위에서 작성한 서비스 노드들을 이용해 service_server.cpp 소스를 수정해서 단순한 덧셈만이 아니라 사칙연산을 할 수 있도록 파라미터를 활용해 봤습니다.

 

※Parameter 실습 순서※

1. 파라미터를 활용한 노드 작성

roscd ros_tutorials_service/src
gedit service_server.cpp
service_server.cpp를 수정합니다. (pdf 참조)
해당 코드에 사칙연산 중 고를 수 있는 코드가 포함되어 있다.

2. 노드 빌드 및 실행

cd ~/catkin_ws && catkin_make
클론 한 후 빌드하지 않았을 때 실행
rosrun ros_tutorials_service service_server
클론한 후 빌드했을 경우의 실행
rosrun ros_tutorials_parameter service_server_with_parameter
소스코드 클론(pdf 참조)
저는 서비스 실습 이후 클론한 상태여서 아래 방법으로 진행했습니다.

3. 서비스 클라이언트 실행

rosservice call /ros_tutorial_srv 10 5
위 서비스와 똑같습니다.

rosparam set /calculation_method 2
#method 1 or 2 or 3 or 4
1 :덧셈 (처음에 아무런 설정이 없을 경우 자동으로 덧셈)
2: 뺄셈
3: 곱셈
4. 나눗셈

 

 

-Roslaunch-

Roslaunch는 하나 이상의 노드를 실행시킬 수 있습니다.

 

※Roslaunch 사용법※

1. roslaunch의 활용

roscd ros_tutorials_topic
mkdir launch
cd launch
gedit union.launch
ros_tutorials_topic 위치에 launch 파일을 만들고 그 파일에 union.launch에 아래 내용 중 하나를 넣습니다.

a.

<launch>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher1"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber1"/>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher2"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber2"/>
</launch>

b.

<launch>
<group ns="ns1">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/> 
</group>
<group ns="ns2">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
</launch>

2. union.launch 실행

roslaunch ros_tutorials_topic union.launch --screen

마지막 --screen를 추가해 주면 해당 터미널에 실행되는 모든 노드들의 출력들이 터미널 스크린에 표시됩니다.(topic처럼)

1.a의 방법으로 진행하면

1.b의 방법으로 진행하면

rqt_graph에서 위의 결과를 볼 수 있습니다. 

 

 

3주차 실습을 진행해 보면서 노드생성법, ros에서 쓰는 코드에 대한 이해, 패키지 생성법 등을 실습해 보면서 이론 및 글로만 배웠던 것들을 직접적으로 경험하면서 이해도가 더 높아진 것 같습니다.

 

따라 하기는 쉬웠으나 위 과정이 익숙해지고 스스로 할 수 있도록 연습해야 할 것 같습니다.

화이팅

반응형