기본적인 개념은 아래 링크를 읽어 본다.
1. 패키지 생성
catkin을 이용해 패키지를 생성한다.
$ cd ~/catkin_ws/src
$ catkin_create_pkg oroca_ros_tutorials std_msgs roscpp
다음과 같은 폴더와 파일들이 자동 생성된다.
2. 설정 및 메이크 파일 수정
<?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. 토픽 메시지의 데이터 포맷 정의
$ roscd oroca_ros_tutorials
$ mkdir msg
$ cd msg
$ gedit msgTutorial.msg
gedit 편집기 창에서 아래와 같이 입력하고, 저장한다.
int32 data
4. ROS 노드 코딩
$ 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에 전달되는 것을 확인할 수 있다.
댓글 없음:
댓글 쓰기