본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 안수빈 #3주차 - ROS 기본 프로그래밍

반응형

ROS 기본 프로그래밍!

 

ROS Courses (한국어) - YouTube

 

ROS Courses (한국어)

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

www.youtube.com

위의 링크에 들어가면 챕터 별로 강의를 볼 수 있다. 이번 주에는 Chapter 7을 보고 공부하였다.

 

Chapter 07.

 

cd ~/catkin_ws/src

cd : 디렉터리 이동.

~ : home 폴더

home 폴더 안에 있는 catkin_ws 안에 있는 src 폴더로 이동.

 

catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp

catkin_ws 폴더 안에 있는 src 폴더 안에 ros_tutorials_topic 패키지 설치

package 깔기 전 src폴더의 모습
package 깔고 난 후의 src 폴더 모습

ros_tutorials_topic 패키지 안에는 CMakeLists.txt와 package.xml이 존재하는데 이 두 파일 안에는 여러 줄로 이루어진 글들이 있는 것을 볼 수 있다.

 

package.xml을 수정해줘야한다. 

Package.xml 수정

gedit package.xml

위의 명령어를 이용하여 package.xml 파일을 열어준다.

package.xml의 모습

<? xml version="1.0"?>

<package format="2">

<name>ros_tutorials_topic</name>

<version>0.1.0</version>

<description>ROS turtorial package to learn the topic</description>

<license>Apache 2.0</license>

<author email="pyo@robotis.com">Yoonseok Pyo</author>

<maintainer email="pyo@robotis.com">Yoonseok Pyo</maintainer>

<url type="website">http://www.robotis.com 

<url type="repository">https://github.com/ROBOTIS-GIT/ros_tutorials.git > 

<url type="bugtracker">https://github.com/ROBOTIS-GIT/ros_tutorials/issues > 

<buildtool_depend>catkin<buildtool_depend>

<depend>roscpp</depend>

<depend>std_msgs</depend>

<depend>message_generation</depend>

<export></export >

</package>

위처럼 수정해준다.

 

CMakeLists.txt 수정

cmake_minimum_required(VERSION 2.8.3)

project(ros_tutorials_topic)

## 캐빈 빌드를 할 때 요구되는 구성요소 패키지이다.

## 의존성 패키지로 message_generation, std_msgs, roscpp이며 이 패키지들이 존재하지 않으면 빌드 도중에 에러가 난다.

find_package(catkin REQUIRED COMPONENTS message_generation std_msgs roscpp)

## 메시지 선언: MsgTutorial.msg

add_message_files(FILES MsgTutorial.msg)

## 의존하는 메시지를 설정하는 옵션이다.

## std_msgs가 설치되어 있지 않다면 빌드 도중에 에러가 난다.

generate_messages(DEPENDENCIES std_msgs)

## 캐긴 패키지 옵션으로 라이브러리, 캐킨 빌드 의존성, 시스템 의존 패키지를 기술한다.

catkin_package(

LIBRARIES ros_tutorials_topic

CATKIN_DEPENDS std_msgs roscpp

)

 

## 인클루드 디렉터리를 설정한다.

include_directories(${catkin_INCLUDE_DIRS})

## topic_publisher 노드에 대한 빌드 옵션이다.

## 실행 파일, 타깃 링크 라이브러리, 추가 의존성 등을 설정한다.

add_executable(topic_publisher src/topic_publisher.cpp)

add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS}

${catkin_EXPORTED_TARGETS})

target_link_libraries(topic_publisher ${catkin_LIBRARIES})

 

## topic_subscriber 노드에 대한 빌드 옵션이다.

add_executable(topic_subscriber src/topic_subscriber.cpp)

add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(topic_subscriber ${catkin_LIBRARIES})

 

메시지 파일 작성

roscd ros_tutorials_topic  :  패키지 폴더로 이동

mkdir msg  :  패키지에 msg라는 메시지 폴더를 신규 작성

cd msg  :  작성한 msg폴더로 이동

gedit MsgTutorial.msg  :  MsgTutoria.msg 파일 신규 작성 및 내용 수정

ros_tutorials_topic 폴더 안에 msg 폴더가 생긴 것을 볼 수 있다.

MsgTutorial.msg 안에 

time stamp

int32 data

를 쓰고 저장해준다.

 

퍼블리셔 노드 작성

roscd ros_tutorials_topic/src  :  패키지의 소스 폴더인 src폴더로 이동

gedit topic_publisher.cpp  :  소스 파일 신규 작성 및 내용 수정

 

#include "ros/ros.h" // ROS 기본 헤더파일

#include "ros_tutorials_topic/MsgTutorial.h"// MsgTutorial 메시지 파일 헤더(빌드 후 자동 생성됨)

 

int main(int argc, char **argv) // 노드 메인 함수

{

ros::init(argc, argv, "topic_publisher"); // 노드명 초기화

ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언

// 퍼블리셔 선언, ors_tutorials 패키지의 MsgTutorial 메시지 파일을 이용한 

// 퍼블리셔 ros_tutorial_pub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며,

// 퍼블리셔 큐(queue) 사이즈를 100개로 설정한다는 것이다

ros::Publisher ros_tutorial_pub = nh.advertise<ros_tutorials_topic::MsgTutorial>("ros_tutorial_msg", 100);

 

// 루프 주기를 설정한다. "10" 이라는 것은 10Hz를 말하는 것으로 0.1초 간격으로 반복된다

ros::Rate loop_rate(10);

 

// MsgTutorial 메시지 파일 형식으로 msg 라는 메시지를 선언

ros_tutorials_topic::MsgTutorial msg;

 

// 메시지에 사용될 변수 선언

int count = 0;

while (ros::ok())

{

msg.stamp = ros::Time::now(); // 현재 시간을 msg의 하위 stamp 메시지에 담는다

msg.data = count; // count라는 변수 값을 msg의 하위 data 메시지에 담는다

ROS_INFO("send msg = %d", msg.stamp.sec); // stamp.sec 메시지를 표시한다

ROS_INFO("send msg = %d", msg.stamp.nsec); // stamp.nsec 메시지를 표시한다

ROS_INFO("send msg = %d", msg.data); // data 메시지를 표시한다

 

ros_tutorial_pub.publish(msg); // 메시지를 발행한다

loop_rate.sleep(); // 위에서 정한 루프 주기에 따라 슬립에 들어간다

++count; // count 변수 1씩 증가

}

return 0;

}

 

 

서브스크라이버 노드 작성

roscd ros_tutorials_topic/src  :  패키지의 소스 폴더인 src폴더로 이동

gedit topic_subscriber.cpp  :  소스 파일 신규 작성 및 내용 수정

 

#include "ros/ros.h" // ROS 기본 헤더파일

#include "ros_tutorials_topic/MsgTutorial.h" // MsgTutorial 메시지 파일 헤더 (빌드 후 자동 생성됨)

 

// 메시지 콜백 함수로써, 밑에서 설정한 ros_tutorial_msg라는 이름의 토픽

// 메시지를 수신하였을 때 동작하는 함수이다

// 입력 메시지로는 ros_tutorials_topic 패키지의 MsgTutorial 메시지를 받도록 되어있다

void msgCallback(const ros_tutorials_topic::MsgTutorial::ConstPtr& msg)

{

ROS_INFO("recieve msg = %d", msg->stamp.sec); // stamp.sec 메시지를 표시한다

ROS_INFO("recieve msg = %d", msg->stamp.nsec); // stamp.nsec 메시지를 표시한다

ROS_INFO("recieve msg = %d", msg->data); // data 메시지를 표시한다

}

 

int main(int argc, char **argv) // 노드 메인 함수

{

ros::init(argc, argv, "topic_subscriber"); // 노드명 초기화

 

ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언

// 서브스크라이버 선언, ros_tutorials_topic 패키지의 MsgTutorial 메시지 파일을 이용한

// 서브스크라이버 ros_tutorial_sub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며,

// 서브스크라이버 큐(queue) 사이즈를 100개로 설정한다는 것이다

ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg", 100, msgCallback);

// 콜백함수 호출을 위한 함수로써, 메시지가 수신되기를 대기,

// 수신되었을 경우 콜백함수를 실행한다

ros::spin();

 

return 0;

}

 

ROS 노드 빌드

cd ~/catkin_ws  :  catkin 폴더로 이동

catkin_make  :  catkin 빌드 실행

 

퍼블리셔 실행

rosrun ros_tutorials_topic topic_publisher

rosrun ros_tutorials_topic topic_subscriber

 

실행화면

잘 실행된다면 위의 그림처럼 실행이 된다고 하지만.. 나는 실패하여 일단 성공 사례의 사진을 넣어두었다...

rqt_graph

위의 실행을 실패였기 때문에 rqt_graph도 실패하였는데... 대신 잘 실행되었다면 위의 사진처럼 나올 것이다.

위의 과정들을 다시 도전해봐서 성공하게 되어 꼭 다음 주차때는 성공했다는 사실과 돌아오고 싶다...

 

Service

1. 패키지 생성

cd ~/catkin_ws/src

catkin_created_pkg ros_tutorials_service message_generation std_msgs roscpp

 

cd ros_tutorials_service

ros_tutorials_service 패키지가 생성된 것을 볼 수 있다.

아까처럼  2. 패키지 설정 파일(package.xml)을 수정해주고 3. 빌드 설정 파일(CMakeLists.txt)를 수정해준다.

바꿀 코드같은 것은 ros-seminar/07_ROS_기본_프로그래밍.pdf at master · robotpilot/ros-seminar · GitHub

 

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

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

github.com

위의 github에 들어가면 볼 수 있다.

 

4. 서비스 파일 작성

roscd ros_tutorials_service  :  패키지 폴더로 이동

mkdir srv  :  패키지에 srv라는 서비스 폴더를 신규 작성

cd srv  :  작성한 srv폴더로 이동

gedit SrvTutorial.srv :  SrvTutorial.srv 파일 신규 작성 및 내용 수정

 

int 64 a

int 64 b

---  :  요청과 응답을 구분하는 구분자

int64 result

 

5. 서비스 서버 노드 작성

roscd ros_tutorials_service/src

gedit service_server.cpp

 

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

roscd ros_tutorials_service/src

gedit service_client.cpp

 

(5, 6번 과정에서 스이는 함수나 코드 등은 2, 3번 과정에 있는 github에 있으니 github에 들어가서 쓰면 된다. )

 

7. ROS 노드 빌드

다음 명령어로 ros_tutorials_service 패키지의 서비스 파일, 서비스 노드와 클라이언트 노드를 빌드한다.

cd ~/catkin_ws && catkin_make

 

8. 서비스 서버 실행

rosrun ros_tutorials_service service_server

오류가 없다면 위의 사진처럼 잘 실행될 것이다. 하지만... 나는 또 다시 실패하여 성공한 사진을 대신 넣어줬다...

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

rosrun ros_tutorials_service service_client 2 3

실행이 잘 되었을 때의 실행화면이다. (꼭 나중에는 성공하여 이 자리에 내가 실행한 결과를 다시 넣을 것이다!)

4주차때까지 꼭 성공하여 시작할 때 성공했다는 소식과 돌아오겠다!

반응형