00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "point_cloud_display.h"
00031 #include "rviz/visualization_manager.h"
00032 #include "rviz/properties/property.h"
00033 #include "rviz/properties/property_manager.h"
00034 #include "rviz/frame_manager.h"
00035
00036 #include <ros/time.h>
00037 #include "ogre_tools/point_cloud.h"
00038
00039 #include <tf/transform_listener.h>
00040
00041 #include <OGRE/OgreSceneNode.h>
00042 #include <OGRE/OgreSceneManager.h>
00043
00044 namespace rviz
00045 {
00046
00047 PointCloudDisplay::PointCloudDisplay( const std::string& name, VisualizationManager* manager )
00048 : PointCloudBase( name, manager )
00049 , tf_filter_(*manager->getTFClient(), "", 10, threaded_nh_)
00050 {
00051 tf_filter_.connectInput(sub_);
00052 tf_filter_.registerCallback(&PointCloudDisplay::incomingCloudCallback, this);
00053 vis_manager_->getFrameManager()->registerFilterForTransformStatusCheck(tf_filter_, this);
00054 }
00055
00056 PointCloudDisplay::~PointCloudDisplay()
00057 {
00058 unsubscribe();
00059 tf_filter_.clear();
00060 }
00061
00062 void PointCloudDisplay::setTopic( const std::string& topic )
00063 {
00064 unsubscribe();
00065 topic_ = topic;
00066 reset();
00067 subscribe();
00068
00069 propertyChanged(topic_property_);
00070
00071 causeRender();
00072 }
00073
00074 void PointCloudDisplay::onEnable()
00075 {
00076 PointCloudBase::onEnable();
00077
00078 subscribe();
00079 }
00080
00081 void PointCloudDisplay::onDisable()
00082 {
00083 unsubscribe();
00084 tf_filter_.clear();
00085
00086 PointCloudBase::onDisable();
00087 }
00088
00089 void PointCloudDisplay::subscribe()
00090 {
00091 if ( !isEnabled() )
00092 {
00093 return;
00094 }
00095
00096 sub_.subscribe(threaded_nh_, topic_, 2);
00097 }
00098
00099 void PointCloudDisplay::unsubscribe()
00100 {
00101 sub_.unsubscribe();
00102 }
00103
00104 void PointCloudDisplay::incomingCloudCallback(const sensor_msgs::PointCloudConstPtr& cloud)
00105 {
00106 addMessage(cloud);
00107 }
00108
00109 void PointCloudDisplay::targetFrameChanged()
00110 {
00111 }
00112
00113 void PointCloudDisplay::fixedFrameChanged()
00114 {
00115 tf_filter_.setTargetFrame( fixed_frame_ );
00116
00117 PointCloudBase::fixedFrameChanged();
00118 }
00119
00120 void PointCloudDisplay::createProperties()
00121 {
00122 topic_property_ = property_manager_->createProperty<ROSTopicStringProperty>( "Topic", property_prefix_, boost::bind( &PointCloudDisplay::getTopic, this ),
00123 boost::bind( &PointCloudDisplay::setTopic, this, _1 ), parent_category_, this );
00124 setPropertyHelpText(topic_property_, "sensor_msgs::PointCloud topic to subscribe to.");
00125 ROSTopicStringPropertyPtr topic_prop = topic_property_.lock();
00126 topic_prop->setMessageType(ros::message_traits::datatype<sensor_msgs::PointCloud>());
00127
00128 PointCloudBase::createProperties();
00129 }
00130
00131 }