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 "pr2_interactive_manipulation/point_head_view_controller.h"
00031
00032 #include <rviz/visualization_manager.h>
00033 #include <OGRE/OgreSceneManager.h>
00034
00035 #include <OGRE/OgreViewport.h>
00036 #include <OGRE/OgreRay.h>
00037 #include <OGRE/OgreVector3.h>
00038
00039 #include <visualization_msgs/Marker.h>
00040
00041 namespace pr2_interactive_manipulation
00042 {
00043
00044 PointHeadViewController::PointHeadViewController( rviz::ROSImageTexture &texture,
00045 rviz::VisualizationManager* manager,
00046 const std::string& name) :
00047 rviz::ViewController( manager, name, manager->getSceneManager()->getRootSceneNode() ),
00048 texture_(texture),
00049 point_head_action_client_(0)
00050 {
00051 ros::NodeHandle n;
00052 #ifdef DEBUG_DISPLAY
00053 marker_pub_ = n.advertise<visualization_msgs::Marker>("point_head_view_controller/pointing_direction", 1);
00054 #endif
00055 global_orientation_ = Ogre::Quaternion::IDENTITY;
00056 }
00057
00058 PointHeadViewController::~PointHeadViewController()
00059 {
00060 delete point_head_action_client_;
00061 }
00062
00063 void PointHeadViewController::handleMouseEvent( rviz::ViewportMouseEvent& event)
00064 {
00065 if ( event.event.LeftDown() )
00066 {
00067 int width = event.viewport->getActualWidth();
00068 int height = event.viewport->getActualHeight();
00069
00070 Ogre::Ray mouse_ray = event.viewport->getCamera()->getCameraToViewportRay(
00071 (float)event.event.GetX() / (float)width, (float)event.event.GetY() / (float)height );
00072
00073 lookAt( mouse_ray.getPoint(1.0) );
00074 }
00075
00076 }
00077
00078 void PointHeadViewController::setTopic(const std::string& topic)
00079 {
00080 delete point_head_action_client_;
00081 topic_ = topic;
00082
00083
00084
00085 std::string action_topic = topic_;
00086
00087 size_t goal_str_pos = topic_.rfind("/goal");
00088 if (goal_str_pos != std::string::npos)
00089 {
00090 action_topic.erase(goal_str_pos);
00091 }
00092
00093 point_head_action_client_ = new PointHeadActionClient(action_topic, true);
00094 }
00095
00096
00097 void PointHeadViewController::lookAt( const Ogre::Vector3& look_at_point )
00098 {
00099 if ( !point_head_action_client_ )
00100 {
00101 return;
00102 }
00103
00104 if ( !texture_.getImage().get() )
00105 {
00106 ROS_ERROR( "No image received. Cannot compute look-at point." );
00107 return;
00108 }
00109
00110 point_head_action_client_->waitForServer( ros::Duration( 0.1 ) );
00111
00112 if ( !point_head_action_client_->isServerConnected() )
00113 {
00114 ROS_ERROR( "Point head action client is not connected!" );
00115 return;
00116 }
00117
00118 Ogre::Vector3 look_at_point_robot = look_at_point;
00119
00120
00121
00122 pr2_controllers_msgs::PointHeadGoal point_head_goal;
00123
00124 point_head_goal.pointing_axis.x = 0;
00125 point_head_goal.pointing_axis.y = 0;
00126 point_head_goal.pointing_axis.z = 1;
00127
00128 point_head_goal.pointing_frame = texture_.getImage()->header.frame_id;
00129
00130 point_head_goal.target.header.frame_id = manager_->getFixedFrame();
00131 point_head_goal.target.header.stamp = ros::Time::now();
00132
00133 point_head_goal.target.point.x = look_at_point_robot.x;
00134 point_head_goal.target.point.y = look_at_point_robot.y;
00135 point_head_goal.target.point.z = look_at_point_robot.z;
00136
00137 point_head_goal.max_velocity = 1.0;
00138
00139 point_head_action_client_->sendGoal( point_head_goal );
00140
00141 #ifdef DEBUG_DISPLAY
00142
00143 ROS_INFO( "Looking at position %f %f %f in pointing frame %s (fixed frame is %s)", point_head_goal.target.point.x,
00144 point_head_goal.target.point.y, point_head_goal.target.point.z,
00145 point_head_goal.pointing_frame.c_str(),
00146 point_head_goal.target.header.frame_id.c_str() );
00147
00148
00149
00150 visualization_msgs::Marker marker;
00151
00152 marker.header.frame_id = manager_->getFixedFrame();
00153 marker.header.stamp = ros::Time::now();
00154
00155
00156
00157 marker.ns = "PointHeadViewController";
00158 marker.id = 0;
00159
00160
00161 marker.type = visualization_msgs::Marker::SPHERE;
00162
00163
00164 marker.action = visualization_msgs::Marker::ADD;
00165
00166
00167 marker.pose.position.x = look_at_point_robot.x;
00168 marker.pose.position.y = look_at_point_robot.y;
00169 marker.pose.position.z = look_at_point_robot.z;
00170 marker.pose.orientation.x = 0.0;
00171 marker.pose.orientation.y = 0.0;
00172 marker.pose.orientation.z = 0.0;
00173 marker.pose.orientation.w = 1.0;
00174
00175
00176 marker.scale.x = 0.05;
00177 marker.scale.y = 0.05;
00178 marker.scale.z = 0.05;
00179
00180
00181 marker.color.r = 0.0f;
00182 marker.color.g = 1.0f;
00183 marker.color.b = 0.0f;
00184 marker.color.a = 1.0;
00185
00186 marker.lifetime = ros::Duration();
00187
00188
00189 marker_pub_.publish(marker);
00190
00191 #endif
00192 }
00193
00194 }