카테고리 없음

ROS Package 만들기

둥H 2021. 8. 16. 14:35
반응형

간단하게 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되어 시각화되는 것을 확인할 수 있다.

반응형