ROS2 RVIZ Marker

최준혁·2022년 1월 29일
0

ROS2_Basic

목록 보기
4/4

rviz2에서 마커를 본 경우가 많을 것이다. 나중에 사람이나 다른 객체의 이동 데이터를 얻으면 마커를 옮기는 방식으로 표현하고 싶어서 마커를 표시하는 방법을 찾아봤다. 메시지는 다음과 같다.

visualization_msgs

위 메시지를 이용해서 데이터를 pub 하면 된다. ros wiki에서 위 메시지를 찾아보자.

uint8 ARROW=0
uint8 CUBE=1
uint8 SPHERE=2
uint8 CYLINDER=3
uint8 LINE_STRIP=4
uint8 LINE_LIST=5
uint8 CUBE_LIST=6
uint8 SPHERE_LIST=7
uint8 POINTS=8
uint8 TEXT_VIEW_FACING=9
uint8 MESH_RESOURCE=10
uint8 TRIANGLE_LIST=11
uint8 ADD=0
uint8 MODIFY=0
uint8 DELETE=2
uint8 DELETEALL=3
std_msgs/Header header
string ns
int32 id
int32 type
int32 action
geometry_msgs/Pose pose
geometry_msgs/Vector3 scale
std_msgs/ColorRGBA color
duration lifetime
bool frame_locked
geometry_msgs/Point[] points
std_msgs/ColorRGBA[] colors
string text
string mesh_resource
bool mesh_use_embedded_materials

Marker안에 있는 속성들이다. 이를 다음과 같이 활용한다.

#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "visualization_msgs/msg/marker.hpp"
#include <chrono>
#include <functional>
#include <string>

using namespace std::chrono_literals;

class MarkerPub: public rclcpp::Node
{
private:
  rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr publisher_;
  rclcpp::TimerBase::SharedPtr timer_;
  void markerCB()
  {
    auto marker = visualization_msgs::msg::Marker();
    marker.header.frame_id = "base_link";
    marker.header.stamp = this->now();
    marker.ns = "cjh";
    marker.id = 0;
    marker.type = visualization_msgs::msg::Marker::CUBE;
    marker.action =  visualization_msgs::msg::Marker::ADD;
    marker.pose.position.x = 1;
    marker.pose.position.y = 1;
    marker.pose.position.z = 1;
    marker.scale.x = 1.0;
    marker.scale.y = 1.0;
    marker.scale.z = 1.0;
    marker.color.a = 1.0;
    marker.color.r = 0.0;
    marker.color.g = 1.0;
    marker.color.b = 0.0;
    marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
    publisher_->publish(marker);
  }

public:
  MarkerPub():Node("marker_test")
  {
    publisher_ = this->create_publisher<visualization_msgs::msg::Marker>("marker", 10);
    timer_ = this->create_wall_timer(
      20ms, std::bind(&MarkerPub::markerCB, this)
    );
  }
};

int main(int argc, char** argv)
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<MarkerPub>());
    rclcpp::shutdown();


    return 0;
}

후에 frame_id는 human정도로 해서 넣어줄까 생각중이다. 또한 ns는 namespace로 동일 마커간 구분을 위해 사용한다. 이외에도 다양한 마커 종류가 있으니 자신에게 맞게끔 활용하면 되겠다.

[ref]

profile
3D Vision, VSLAM, Robotics, Deep_Learning

0개의 댓글