ROS 강좌 102 Point 보내기 rviz tool plugin 만들기

12166 단어 로봇rvizROS

환경



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


품목



CPU
Core i5-8250U

우분투
20.04

ROS
Noetic


설치에 대한 자세한 내용은 ROS 강좌02 설치을 참조하십시오.
또한이 기사의 프로그램은 github에 업로드되었습니다. ROS 강좌 11 git 저장소을 참조하십시오.

개요



Rviz의 tool plugin을 만드는 방법을 설명합니다. 이번에는 PointStamped 형식을 보내는 플러그인을 만듭니다. 3D 뷰에서 클릭하면 해당 위치에 따라 PoseStamped 주제를 제출하고 해당 위치에 마커를 배치합니다.

소스 코드



클래스 선언: point_tool.h
클래스 구현:

plugin_lecture/src/rviz/tool/point_tool.cpp
#include "point_tool.h"
#include <OGRE/OgreSceneNode.h>
#include <OGRE/OgreSceneManager.h>
#include <OGRE/OgreEntity.h>
#include <ros/ros.h>
#include <rviz/viewport_mouse_event.h>
#include <rviz/visualization_manager.h>
#include <rviz/geometry.h>
#include <rviz/ogre_helpers/shape.h>
#include <rviz/frame_manager.h>
#include <geometry_msgs/PointStamped.h>
#include <pluginlib/class_list_macros.h>

namespace plugin_lecture
{
PointTool::PointTool() : nh_()
{
  shortcut_key_ = 'm';
}

PointTool::~PointTool()
{
}

void PointTool::onInitialize()
{
  vis_shape_.reset(new rviz::Shape(rviz::Shape::Cylinder, scene_manager_));
  Ogre::Vector3 shape_pos(0, 2, 0);
  vis_shape_->setPosition(shape_pos);
  Ogre::Quaternion shape_q(0.7, 0.7, 0, 0);
  vis_shape_->setOrientation(shape_q);
  vis_shape_->setColor(0, 0, 1, 1);
  vis_shape_->getRootNode()->setVisible(false);

  point_pub_ = nh_.advertise<geometry_msgs::PointStamped>("point", 10);
}

void PointTool::activate()
{
  vis_shape_->setColor(0, 0, 1, 1);
  vis_shape_->getRootNode()->setVisible(true);
}

void PointTool::deactivate()
{
  vis_shape_->setColor(0.5, 0.5, 0.5, 1);
}

int PointTool::processMouseEvent(rviz::ViewportMouseEvent& event)
{
  Ogre::Vector3 intersection;
  Ogre::Plane ground_plane(Ogre::Vector3::UNIT_Z, 0.0f);
  if (rviz::getPointOnPlaneFromWindowXY(event.viewport, ground_plane, event.x, event.y, intersection))
  {
    vis_shape_->setPosition(intersection);
    if (event.leftDown())
    {
      geometry_msgs::PointStamped point_msg;
      point_msg.header.frame_id = context_->getFrameManager()->getFixedFrame();
      point_msg.header.stamp = ros::Time::now();
      point_msg.point.x = intersection.x;
      point_msg.point.y = intersection.y;
      point_msg.point.z = intersection.z;
      point_pub_.publish(point_msg);
      return Render | Finished;
    }
  }
  return Render;
}

}  // namespace plugin_lecture
PLUGINLIB_EXPORT_CLASS(plugin_lecture::PointTool, rviz::Tool)
  • shortcut_key_ = 'm'; 는 단축키 등록입니다. 필수는 아니지만 등록할 때 이 키를 누르면 이 도구를 선택할 수 있습니다.
  • 기본적으로 생성자 대신 onInitialize() 에서 초기화 처리를 작성합니다.
  • 툴이 선택되면(버튼을 누르면)
  • 또한 3D 뷰 위에 마우스가 오면 activate() 가 발생합니다. 이 외에도 키 이벤트도 취할 수 있습니다. return의 값으로 rviz에 지령을 보낼 수 있습니다. Render(아마 그리기 이벤트가 일어난다), Finished(툴의 선택이 해제된다)로 양쪽 모두를 일으키고 싶을 때는 deactivate() 로 연결된 값을 return로 돌려줍니다.
  • vis_shape_는 Rviz의 3D 뷰에서 원통을 표시하는 클래스입니다. 여기는 Ogre의 API입니다. 101 ogre에서 3D 그리기 하지만 해설을 하고 있습니다.

  • 빌드


    cd ~/catkin_ws
    catkin_make
    

    실행



    Rviz를 표시하고 화면 상단의 더하기 버튼을 눌러 플러그인을 선택합니다. 상단 목록에서 원하는 플러그인을 선택하고 3D 뷰에서 클릭합니다. 클릭 한 위치가 processMouseEvent()라는 주제로 게시됩니다.



    참고



    rviz tool plugin 클래스 참조
    rviz_plugin_tutorials

    목차 페이지 링크



    ROS 강좌의 목차에 대한 링크

    좋은 웹페이지 즐겨찾기