ROS 강좌 102 Point 보내기 rviz tool plugin 만들기
환경
이 기사는 다음 환경에서 작동합니다.
품목
값
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)
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)
#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()
에서 초기화 처리를 작성합니다. activate()
가 발생합니다. 이 외에도 키 이벤트도 취할 수 있습니다. return의 값으로 rviz에 지령을 보낼 수 있습니다. Render(아마 그리기 이벤트가 일어난다), Finished(툴의 선택이 해제된다)로 양쪽 모두를 일으키고 싶을 때는 deactivate()
로 연결된 값을 return로 돌려줍니다. 빌드
cd ~/catkin_ws
catkin_make
실행
Rviz를 표시하고 화면 상단의 더하기 버튼을 눌러 플러그인을 선택합니다. 상단 목록에서 원하는 플러그인을 선택하고 3D 뷰에서 클릭합니다. 클릭 한 위치가 processMouseEvent()
라는 주제로 게시됩니다.
참고
rviz tool plugin 클래스 참조
rviz_plugin_tutorials
목차 페이지 링크
ROS 강좌의 목차에 대한 링크
Reference
이 문제에 관하여(ROS 강좌 102 Point 보내기 rviz tool plugin 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/srs/items/adddd3dbd0da2d52d68b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
cd ~/catkin_ws
catkin_make
Rviz를 표시하고 화면 상단의 더하기 버튼을 눌러 플러그인을 선택합니다. 상단 목록에서 원하는 플러그인을 선택하고 3D 뷰에서 클릭합니다. 클릭 한 위치가
processMouseEvent()
라는 주제로 게시됩니다.참고
rviz tool plugin 클래스 참조
rviz_plugin_tutorials
목차 페이지 링크
ROS 강좌의 목차에 대한 링크
Reference
이 문제에 관하여(ROS 강좌 102 Point 보내기 rviz tool plugin 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/srs/items/adddd3dbd0da2d52d68b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ROS 강좌의 목차에 대한 링크
Reference
이 문제에 관하여(ROS 강좌 102 Point 보내기 rviz tool plugin 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/srs/items/adddd3dbd0da2d52d68b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)