ROS 강좌 111 포인트 받기 rviz display plugin 만들기

13476 단어 C++rvizROS

환경



이 기사는 다음 환경에서 작동합니다.


품목



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)
  • 이 클래스중에서는 「3D 뷰안에서 draw 하는 것」과 「설정 항목 일람으로서 패널에 표시하는 것」의 2개에 대해 기술합니다.
  • 패널에 표시하는 것은 rviz::ColorProperty* color_property_; 등과 같은 미리 정해진 클래스를 인스턴스화하는 것만으로 자동으로 목록에 추가됩니다. 패널에서 값이 변경되면 여기에 지정된 callback 함수가 호출됩니다.
  • 원하는 ROS 주제를 받으면 processMessage()가 호출됩니다. 여기서 3D 뷰 안에서 표시하는 설명을 합니다.
  • orge의 화살표는 축의 길이가 지정하는 길이가 되어, 축의 길이의 0.3배의 길이의 삼각 콘이 붙습니다. 길이를 약 0.77배로 하는 것으로 화살표의 끝까지를 원하는 길이로 할 수 있습니다.

  • 또 위의 예에서는 msg에 있는 header와 rviz의 「Fixed Frame」이 다른 경우는, 「Fixed Frame」->「msg에의 header」의 transform을 context_->getFrameManager()->getTransform() 의 함수로 취득해 그리기.

  • 빌드


    cd ~/catkin_ws
    catkin_make
    

    실행



    디스플레이 화면에서 추가를 눌러 원하는 플러그인을 선택합니다. Displays화면의 리스트 안에 나오므로 목적의 Topic나 변수를 설정해 사용합니다.
    각 터미널에 대해 실행하기 전에 source ~/catkin_ws/devel/setup.bash를 실행해야 합니다.



    참고



    rviz display plugin 클래스 참조

    목차 페이지 링크



    ROS 강좌의 목차에의 링크

    좋은 웹페이지 즐겨찾기