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 #include <fps_motion_tool.h>
00028
00029 namespace rviz
00030 {
00031
00032 FPSMotionTool::FPSMotionTool()
00033 {
00034 shortcut_key_ = 'q';
00035 }
00036
00037 FPSMotionTool::~FPSMotionTool() {}
00038
00039 void FPSMotionTool::onInitialize()
00040 {
00041 setName( "FPS Motion" );
00042
00043 step_length_property_ = new FloatProperty( "Step Length", 0.1,
00044 "The length by with the position is updated on each step.",
00045 getPropertyContainer(), SLOT( setOffset() ), this );
00046
00047 boost_property_ = new FloatProperty( "Boost Property", 0.5,
00048 "Gives the boost factor which is applied if pressing shift.",
00049 getPropertyContainer(), SLOT( setBoost() ), this );
00050
00051 fly_property_ = new BoolProperty( "Fly Mode", false,
00052 "In fly mode it is possible to move along the z axis as well.",
00053 getPropertyContainer(), SLOT( setFlyMode() ), this );
00054
00055 left_hand_property_ = new BoolProperty( "Left Hand Mode", false,
00056 "In left hand mode one uses the arrows to move around, instead of wasd.",
00057 getPropertyContainer(), SLOT( setLeftHandMode() ), this );
00058
00059 fallback_tool_property_ = new EnumProperty( "Fallback Tool", QString("rviz/Interact"),
00060 "Determines to which tool the control switches, if the tool is deactivated.",
00061 getPropertyContainer(), SLOT( setFallbackTool() ), this );
00062
00063 fallback_view_controller_property_ = new EnumProperty( "Fallback ViewController", QString("rviz/Orbit"),
00064 "Determines to which view controller the control switches, if the tool is deactivated.",
00065 getPropertyContainer(), SLOT( setFallbackViewController() ), this );
00066 m_pos_offset = 0.1;
00067 m_boost = 0.5;
00068 m_fly_mode = false;
00069 m_left_hand_mode = false;
00070
00071 setFallbackToolProperty();
00072 setFallbackViewControllerProperty();
00073 }
00074
00075 void FPSMotionTool::setFallbackViewControllerProperty()
00076 {
00077 fallback_view_controller_property_->clearOptions();
00078 m_view_controller_classes.clear();
00079
00080 m_view_controller_classes = context_->getViewManager()->getFactory()->getDeclaredClassIds();
00081
00082 for( int i = 0; i < m_view_controller_classes.size(); i++ )
00083 {
00084 if(m_view_controller_classes[i] != QString("rviz/FPSMotion"))
00085 {
00086 fallback_view_controller_property_->addOption(m_view_controller_classes[i], i);
00087 m_view_controller.push_back(context_->getViewManager()->getViewAt(i));
00088 }
00089
00090 }
00091
00092 fallback_view_controller_property_->show();
00093 setFallbackViewController();
00094 }
00095
00096 void FPSMotionTool::setFallbackToolProperty()
00097 {
00098 fallback_tool_property_->clearOptions();
00099 m_tools.clear();
00100
00101 m_tool_classes = context_->getToolManager()->getToolClasses();
00102
00103 for(int i = 0; i < m_tool_classes.size(); i++)
00104 {
00105 if(m_tool_classes[i] != getClassId())
00106 {
00107 fallback_tool_property_->addOption(m_tool_classes[i], i);
00108 m_tools.push_back(context_->getToolManager()->getTool(i));
00109 }
00110 }
00111
00112 fallback_tool_property_->show();
00113 setFallbackTool();
00114 }
00115
00116 void FPSMotionTool::activate()
00117 {
00118 context_->getViewManager()->setCurrentViewControllerType(QString("rviz/FPSMotion"));
00119 setFallbackToolProperty();
00120 setFallbackViewControllerProperty();
00121
00122 if(m_tool_classes.contains(QString("rviz/Select")))
00123 {
00124 m_removed_select = true;
00125 context_->getToolManager()->removeTool(m_tool_classes.indexOf(QString("rviz/Select")));
00126 }
00127 }
00128
00129 void FPSMotionTool::deactivate(){ }
00130
00131 int FPSMotionTool::processKeyEvent(QKeyEvent *event, rviz::RenderPanel* panel)
00132 {
00133 if(panel->getViewController()->getClassId().toStdString() != "rviz/FPSMotion")
00134 {
00135 ROS_WARN("The FPS Motion Tool only works with an active rviz/FPSMotion ViewController. \n If you use the shortkeys to select ('e') and deselect ('e') this tool, the switching will be automatized for you.");
00136 }
00137 else
00138 {
00139 double update = m_pos_offset;
00140
00141 if(event->modifiers() & Qt::ShiftModifier)
00142 {
00143 update += m_boost * m_pos_offset;
00144 }
00145
00146
00147 if ((event->key() == Qt::Key_W && !m_left_hand_mode) || (event->key() == Qt::Key_Up && m_left_hand_mode))
00148 {
00149 if(m_fly_mode)
00150 ((rviz::FPSMotionViewController*) panel->getViewController())->fly(0.0, 0.0, -update);
00151 else
00152 ((rviz::FPSMotionViewController*) panel->getViewController())->move(0.0, 0.0, -update);
00153 }
00154
00155 if ((event->key() == Qt::Key_S && !m_left_hand_mode) || (event->key() == Qt::Key_Down && m_left_hand_mode))
00156 {
00157 if(m_fly_mode)
00158 ((rviz::FPSMotionViewController*) panel->getViewController())->fly(0.0, 0.0, update);
00159 else
00160 ((rviz::FPSMotionViewController*) panel->getViewController())->move(0.0, 0.0, update);
00161 }
00162
00163
00164 if ((event->key() == Qt::Key_A && !m_left_hand_mode) || (event->key() == Qt::Key_Left && m_left_hand_mode))
00165 {
00166 if(m_fly_mode)
00167 ((rviz::FPSMotionViewController*) panel->getViewController())->fly(-update, 0.0, 0.0);
00168 else
00169 ((rviz::FPSMotionViewController*) panel->getViewController())->move(-update, 0.0, 0.0);
00170 }
00171
00172
00173 if ((event->key() == Qt::Key_D && !m_left_hand_mode) || (event->key() == Qt::Key_Right && m_left_hand_mode))
00174 {
00175 if(m_fly_mode)
00176 ((rviz::FPSMotionViewController*) panel->getViewController())->fly(update, 0.0, 0.0);
00177 else
00178 ((rviz::FPSMotionViewController*) panel->getViewController())->move(update, 0.0, 0.0);
00179 }
00180
00181
00182
00183 if ((event->key() == Qt::Key_Up && !m_left_hand_mode) || (event->key() == Qt::Key_W && m_left_hand_mode))
00184 {
00185 ((rviz::FPSMotionViewController*) panel->getViewController())->changeZ(update);
00186 }
00187
00188 if ((event->key() == Qt::Key_Down && !m_left_hand_mode) || (event->key() == Qt::Key_S && m_left_hand_mode))
00189 {
00190 ((rviz::FPSMotionViewController*) panel->getViewController())->changeZ(-update);
00191 }
00192
00193
00194
00195 if ((event->key() == Qt::Key_Left && !m_left_hand_mode) || (event->key() == Qt::Key_A && m_left_hand_mode))
00196 {
00197 ((rviz::FPSMotionViewController*) panel->getViewController())->yaw(update);
00198 }
00199
00200 if ((event->key() == Qt::Key_Right && !m_left_hand_mode) || (event->key() == Qt::Key_D && m_left_hand_mode))
00201 {
00202 ((rviz::FPSMotionViewController*) panel->getViewController())->yaw(-update);
00203 }
00204
00205
00206 if (event->key() == Qt::Key_F)
00207 {
00208 m_fly_mode = !m_fly_mode;
00209 fly_property_->setValue(m_fly_mode);
00210 fly_property_->show();
00211 }
00212
00213
00214 if (event->key() == Qt::Key_R)
00215 {
00216 m_fly_mode = false;
00217 fly_property_->setValue(m_fly_mode);
00218 fly_property_->show();
00219
00220 ((rviz::FPSMotionViewController*) panel->getViewController())->reset();
00221 }
00222
00223
00224 if (event->key() == Qt::Key_E)
00225 {
00226 context_->getToolManager()->setCurrentTool(m_fallback_tool);
00227 context_->getViewManager()->setCurrentViewControllerType(m_fallback_view_controller);
00228
00229 if(m_removed_select)
00230 {
00231 context_->getToolManager()->addTool(QString("rviz/Select"));
00232 }
00233 }
00234 }
00235
00236 return Render;
00237 }
00238
00239 int FPSMotionTool::processMouseEvent(rviz::ViewportMouseEvent& event)
00240 {
00241 if (event.panel->getViewController())
00242 {
00243 event.panel->getViewController()->handleMouseEvent(event);
00244 setCursor( event.panel->getViewController()->getCursor() );
00245 }
00246 return 0;
00247 }
00248
00249 }
00250
00251 #include <pluginlib/class_list_macros.h>
00252 PLUGINLIB_EXPORT_CLASS(rviz::FPSMotionTool, rviz::Tool)