2015년 8월 23일 일요일

ROS package 프로그래밍

이 글은 오로카 매너저인 표윤석님의 글을 바탕으로 ROS 패키지를 생성하고, 프로그래밍하는 과정을 그대로 따라 해 본 것이다. 이 사례에서는 토픽 메시지를 보내고, 받는 노드 각각 하나씩을 만들고, 실행해 본다. 이 사례는 메시지 데이터 포맷을 정의하는 방법이 포함되어 있다. 

기본적인 개념은 아래 링크를 읽어 본다.


1. 패키지 생성

catkin을 이용해 패키지를 생성한다. 
$ cd ~/catkin_ws/src
$ catkin_create_pkg oroca_ros_tutorials std_msgs roscpp

다음과 같은 폴더와 파일들이 자동 생성된다. 



2. 설정 및 메이크 파일 수정

catkin에서 생성한 package.xml 파일을 다음과 같이 수정한다.

<?xml version="1.0"?>
<package>
  <name>oroca_ros_tutorials</name>
  <version>0.0.0</version>
  <description>The oroca_ros_tutorials package</description>
  <maintainer email="turtlebot@todo.todo">turtlebot</maintainer>
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>
  <!-- <url type="website">http://wiki.ros.org/oroca_ros_tutorials</url> -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>

  <run_depend>roscpp</run_depend>
  <run_depend>std_msgs</run_depend>
  <run_depend>message_runtime</run_depend>

  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>




catkin에서 생성한 CMakeLists.txt 파일을 다음과 같이 수정한다.
cmake_minimum_required(VERSION 2.8.3)
project(oroca_ros_tutorials)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
)

################################################
## Declare ROS messages, services and actions ##
################################################

add_message_files(FILES msgTutorial.msg)

generate_messages(
  DEPENDENCIES
  std_msgs
)

###################################
## catkin specific configuration ##
###################################

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES oroca_ros_tutorials
  CATKIN_DEPENDS roscpp std_msgs
  DEPENDS system_lib
)

###########
## Build ##
###########

include_directories(include ${catkin_INCLUDE_DIRS})

## Declare a cpp executable
add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp)
target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_publisher oroca_ros_tutorials_generate_messages_cpp)

add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp)
target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_subscriber oroca_ros_tutorials_generate_messages_cpp)




3. 토픽 메시지의 데이터 포맷 정의

이제, 토픽 메시지의 데이터 포맷을 정의한다. 이를 위해, 생성된 패키지 폴더 아래에 msg 폴더를 만들고, msg 파일을 생성한다. 
$ roscd oroca_ros_tutorials
$ mkdir msg
$ cd msg
$ gedit msgTutorial.msg

gedit 편집기 창에서 아래와 같이 입력하고, 저장한다.

int32 data


4. ROS 노드 코딩

이제 토픽 메시지 publisher를 코딩한다.
$ roscd oroca_ros_tutorial/src
$ gedit ros_toturial_msg_publisher.cpp

gedit 편집기에서 다음과 같이 코딩한다.
#include "ros/ros.h"
#include "oroca_ros_tutorials/msgTutorial.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "ros_tutorial_msg_publisher");
    ros::NodeHandle nh;
   
    ros::Publisher ros_tutorial_pub = nh.advertise<oroca_ros_tutorials::msgTutorial>("ros_tutorial_msg", 100);
   
    ros::Rate loop_rate(10);
    int count = 0;
    while(ros::ok())
    {
        oroca_ros_tutorials::msgTutorial msg;
        msg.data = count;
        ROS_INFO("send msg = %d", count);
        ros_tutorial_pub.publish(msg);
        loop_rate.sleep();
        ++count;
    }
   
    return 0;
}




이제 토픽 메시지 subscriber를 코딩한다.
$ roscd oroca_ros_tutorial/src
$ gedit ros_toturial_msg_subscriber.cpp

gedit 편집기에서 다음과 같이 코딩한다.

#include "ros/ros.h"
#include "oroca_ros_tutorials/msgTutorial.h"

void msgCallback(const oroca_ros_tutorials::msgTutorial::ConstPtr& msg)
{
    ROS_INFO("receive msg: %d", msg->data);
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "ros_tutorial_msg_subscriber");
    ros::NodeHandle nh;
   
    ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg", 10, msgCallback);

    ros::spin();
    return 0;
}




5. 패키지 빌드

이제 패키지를 빌드해 본다 
$ cd ~/catkin_ws
$ catkin_make


6. 패키지 노드 실행

정상적으로 에러 없이 빌드되면, 다음과 같이 실행해 보자.
$ roscore
$ rosrun oroca_ros_tutorials ros_tutorial_msg_publisher
$ rostopic echo /ros_tutorial_msg
$ rosrun oroca_ros_tutorials ros_tutorial_msg_subscriber

이 결과로 다음과 같이 실행되면, 성공이다. publisher에서 생성된 int32 값이, 토픽 ros_tutorial_msg를 통해, 정상적으로 subscriber에 전달되는 것을 확인할 수 있다. 






댓글 없음:

댓글 쓰기