ROS 강좌 111 포인트 받기 rviz display plugin 만들기
환경
이 기사는 다음 환경에서 작동합니다.
품목
값
CPU
Core i5-8250U
우분투
20.04
ROS
Noetic
설치에 대한 자세한 내용은 ROS 강좌02 설치을 참조하십시오.
또한이 기사의 프로그램은 github에 업로드되었습니다. ROS 강좌 11 git 저장소을 참조하십시오.
개요
PointStamped를 표시하는 display plugin을 작성합니다. PoseStamped를 받고 3D 뷰에 표시합니다.
아마도 rviz에서 가장 자주 사용하는 것이이 Display 타입의 플러그인입니다.
소스 코드
클래스 선언: point_display.h
하나의 주제를 Subscribe하고 무언가를 표시한다고 하는 것만으로 하면 class PointDisplay: public rviz::MessageFilterDisplay<geometry_msgs::PointStamped>
와 같은 MessageFilterDisplay 클래스를 상속하는 것으로 간단하게 기술할 수 있습니다.
클래스 구현
point_display.cpp#include "point_display.h"
#include <OGRE/OgreSceneNode.h>
#include <OGRE/OgreSceneManager.h>
#include <tf/transform_listener.h>
#include <rviz/visualization_manager.h>
#include <rviz/properties/color_property.h>
#include <rviz/properties/float_property.h>
#include <rviz/properties/int_property.h>
#include <rviz/frame_manager.h>
#include <pluginlib/class_list_macros.h>
namespace plugin_lecture
{
PointDisplay::PointDisplay()
{
color_property_ = new rviz::ColorProperty("Color", QColor(200, 50, 50), "Color to draw the acceleration arrows.",
this, SLOT(updateColorAndAlpha()));
alpha_property_ = new rviz::FloatProperty("Alpha", 1.0, "0 is fully transparent, 1.0 is fully opaque.", this,
SLOT(updateColorAndAlpha()));
}
void PointDisplay::onInitialize()
{
frame_node_ = scene_node_->createChildSceneNode();
vis_arrow_.reset(new rviz::Arrow(scene_manager_, frame_node_));
float alpha = alpha_property_->getFloat();
Ogre::ColourValue color = color_property_->getOgreColor();
vis_arrow_->setColor(color.r, color.g, color.b, alpha);
Ogre::Vector3 arrow_scale(0, 0, 0);
vis_arrow_->setScale(arrow_scale);
MFDClass::onInitialize(); // MFDClass := MessageFilterDisplay<message type>
}
PointDisplay::~PointDisplay()
{
}
void PointDisplay::reset()
{
MFDClass::reset();
}
void PointDisplay::updateColorAndAlpha()
{
float alpha = alpha_property_->getFloat();
Ogre::ColourValue color = color_property_->getOgreColor();
vis_arrow_->setColor(color.r, color.g, color.b, alpha);
}
void PointDisplay::updateHistoryLength()
{
}
void PointDisplay::processMessage(const geometry_msgs::PointStamped::ConstPtr& msg)
{
Ogre::Quaternion orientation;
Ogre::Vector3 position;
if (!context_->getFrameManager()->getTransform(msg->header.frame_id, msg->header.stamp, position, orientation))
{
ROS_DEBUG("Error transforming from frame '%s' to frame '%s'", msg->header.frame_id.c_str(),
qPrintable(fixed_frame_));
return;
}
frame_node_->setPosition(position);
frame_node_->setOrientation(orientation);
Ogre::Vector3 arrow_dir(msg->point.x, msg->point.y, msg->point.z);
float arrow_length = arrow_dir.length() * 0.77;
Ogre::Vector3 arrow_scale(arrow_length, arrow_length, arrow_length);
vis_arrow_->setScale(arrow_scale);
vis_arrow_->setDirection(arrow_dir);
}
} // namespace plugin_lecture
PLUGINLIB_EXPORT_CLASS(plugin_lecture::PointDisplay, rviz::Display)
PointStamped를 표시하는 display plugin을 작성합니다. PoseStamped를 받고 3D 뷰에 표시합니다.
아마도 rviz에서 가장 자주 사용하는 것이이 Display 타입의 플러그인입니다.
소스 코드
클래스 선언: point_display.h
하나의 주제를 Subscribe하고 무언가를 표시한다고 하는 것만으로 하면
class PointDisplay: public rviz::MessageFilterDisplay<geometry_msgs::PointStamped>
와 같은 MessageFilterDisplay 클래스를 상속하는 것으로 간단하게 기술할 수 있습니다.클래스 구현
point_display.cpp
#include "point_display.h"
#include <OGRE/OgreSceneNode.h>
#include <OGRE/OgreSceneManager.h>
#include <tf/transform_listener.h>
#include <rviz/visualization_manager.h>
#include <rviz/properties/color_property.h>
#include <rviz/properties/float_property.h>
#include <rviz/properties/int_property.h>
#include <rviz/frame_manager.h>
#include <pluginlib/class_list_macros.h>
namespace plugin_lecture
{
PointDisplay::PointDisplay()
{
color_property_ = new rviz::ColorProperty("Color", QColor(200, 50, 50), "Color to draw the acceleration arrows.",
this, SLOT(updateColorAndAlpha()));
alpha_property_ = new rviz::FloatProperty("Alpha", 1.0, "0 is fully transparent, 1.0 is fully opaque.", this,
SLOT(updateColorAndAlpha()));
}
void PointDisplay::onInitialize()
{
frame_node_ = scene_node_->createChildSceneNode();
vis_arrow_.reset(new rviz::Arrow(scene_manager_, frame_node_));
float alpha = alpha_property_->getFloat();
Ogre::ColourValue color = color_property_->getOgreColor();
vis_arrow_->setColor(color.r, color.g, color.b, alpha);
Ogre::Vector3 arrow_scale(0, 0, 0);
vis_arrow_->setScale(arrow_scale);
MFDClass::onInitialize(); // MFDClass := MessageFilterDisplay<message type>
}
PointDisplay::~PointDisplay()
{
}
void PointDisplay::reset()
{
MFDClass::reset();
}
void PointDisplay::updateColorAndAlpha()
{
float alpha = alpha_property_->getFloat();
Ogre::ColourValue color = color_property_->getOgreColor();
vis_arrow_->setColor(color.r, color.g, color.b, alpha);
}
void PointDisplay::updateHistoryLength()
{
}
void PointDisplay::processMessage(const geometry_msgs::PointStamped::ConstPtr& msg)
{
Ogre::Quaternion orientation;
Ogre::Vector3 position;
if (!context_->getFrameManager()->getTransform(msg->header.frame_id, msg->header.stamp, position, orientation))
{
ROS_DEBUG("Error transforming from frame '%s' to frame '%s'", msg->header.frame_id.c_str(),
qPrintable(fixed_frame_));
return;
}
frame_node_->setPosition(position);
frame_node_->setOrientation(orientation);
Ogre::Vector3 arrow_dir(msg->point.x, msg->point.y, msg->point.z);
float arrow_length = arrow_dir.length() * 0.77;
Ogre::Vector3 arrow_scale(arrow_length, arrow_length, arrow_length);
vis_arrow_->setScale(arrow_scale);
vis_arrow_->setDirection(arrow_dir);
}
} // namespace plugin_lecture
PLUGINLIB_EXPORT_CLASS(plugin_lecture::PointDisplay, rviz::Display)
rviz::ColorProperty* color_property_;
등과 같은 미리 정해진 클래스를 인스턴스화하는 것만으로 자동으로 목록에 추가됩니다. 패널에서 값이 변경되면 여기에 지정된 callback 함수가 호출됩니다. processMessage()
가 호출됩니다. 여기서 3D 뷰 안에서 표시하는 설명을 합니다.context_->getFrameManager()->getTransform()
의 함수로 취득해 그리기. 빌드
cd ~/catkin_ws
catkin_make
실행
디스플레이 화면에서 추가를 눌러 원하는 플러그인을 선택합니다. Displays화면의 리스트 안에 나오므로 목적의 Topic나 변수를 설정해 사용합니다.
각 터미널에 대해 실행하기 전에
source ~/catkin_ws/devel/setup.bash
를 실행해야 합니다.참고
rviz display plugin 클래스 참조
목차 페이지 링크
ROS 강좌의 목차에의 링크
Reference
이 문제에 관하여(ROS 강좌 111 포인트 받기 rviz display plugin 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/srs/items/9977b8493e1a83cf764f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ROS 강좌의 목차에의 링크
Reference
이 문제에 관하여(ROS 강좌 111 포인트 받기 rviz display plugin 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/srs/items/9977b8493e1a83cf764f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)