ROS Package 만들기
간단하게 marker array를 출력하여 RVIZ로 시각화할 수 있는 패키지를 만들어보려한다.
우선 work space를 하나 생성하고 그 안에 src폴더를 생성한다.
src폴더 안에는 만들고자 하는 패키지의 이름의 파일을 생성해주자.
나는 test라는 이름으로 패키지를 생성해보고자 한다.
즉 workspace/src/test/ 까지의 폴더를 생성한다.
그럼 우선 그 패키지에서 빌드될 소스파일을 담을 수 있는 src폴더를 다시 하나 만든다.
그리고 패키지 이름의 src폴더에 작성하고자하는 소스코드를 입력한다.
나는 marker array를 출력할 것이기에 publisher라는 이름의 cpp파일을 생성하였다.
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "visualization_msgs/Marker.h"
#include<sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "publisher");
ros::NodeHandle n;
ros::Publisher vis_pub = n.advertise<visualization_msgs::Marker>( "visualization_marker", 1000 );
while(ros::ok()){
visualization_msgs::Marker marker;
marker.header.frame_id = "base_link";
marker.header.stamp = ros::Time();
marker.ns = "my_namespace";
marker.id = 0;
marker.type = visualization_msgs::Marker::SPHERE;
marker.action = visualization_msgs::Marker::ADD;
marker.pose.position.x = 1;
marker.pose.position.y = 1;
marker.pose.position.z = 1;
marker.pose.orientation.x = 0.0;
marker.pose.orientation.y = 0.0;
marker.pose.orientation.z = 0.0;
marker.pose.orientation.w = 1.0;
marker.scale.x = 1;
marker.scale.y = 1;
marker.scale.z = 1;
marker.color.a = 1.0; // Don't forget to set the alpha!
marker.color.r = 0.0;
marker.color.g = 1.0;
marker.color.b = 0.0;
//only if using a MESH_RESOURCE marker type:
marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
vis_pub.publish( marker );
ros::spinOnce();
}
return 0;
}
roscpp 코드에 대한 내용은 앞의 게시물을 참고하여 작성하였다.
다음으론 이를 빌드하기 위해 필요한 CMakeLists.txt 파일을 작성해주는 것이다.
CMakeLists.txt파일은 패키지 이름의 폴더에서 작성해준다.(src폴더 밖에서 작성)
CMakeLists.txt 파일의 내용은 아래와 같다.
cmake_minimum_required(VERSION 3.0.2)
project(test)
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs visualization_msgs genmsg)
generate_messages(DEPENDENCIES visualization_msgs)
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher ${catkin_LIBRARIES})
#add_dependencies(publisher test_generate_messages_cpp)
CMakeLists에서 publisher에 해당되는 부분은 내가 만들고자하는 실행파일의 이름이다.
그럼 마지막으로 패키지 생성을 위한 package.xml파일을 작성해보자.
이는 CMakeLists.txt를 작성했던 위치와 동일한 위치에서 진행한다.
<package format="2">
<name>test</name>
<version>1.2.4</version>
<description> This package provides foo capability. </description>
<maintainer email="foobar@foo.bar.willowgarage.com">PR-foobar</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>visualization_msgs</build_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>visualization_msgs</exec_depend>
</package>
이렇게 작성한 후 모든 내용을 저장하고
workspace로 돌아와 catkin_make를 통해 빌드를 진행한다.
그리고 source로 마무리 해주면
rosrun test publisher 가 실행된다.
코드에 대한 자세한 내용은 추후에 수정을 통해 다루도록 하겠다.
하지만 위의 내용을 진행하고 RVIZ를 통해 marker를 확인해보면 base_link에 대한 정보가 존재하지 않으므로
아래와 같은 문제가 발생함을 확인할 수 있다.
이는 말 그대로 고정 좌표계가 없어서 발생하는 문제로 mark array의 좌표를 지정해주긴 하였으나
어느 좌표계를 기준으로 marker를 생성할지 명확하지 않아 발생하는 문제이다.
이럴 경우
$ rosrun tf static_transform_publisher 0 0 0 0 0 0 1 map base_link 10
위의 코드를 통해 해결할 수 있다.
그럼 아래와 같은 이쁜 구형이 publish되어 시각화되는 것을 확인할 수 있다.