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]