/** * @brief Mouse right click on map * @param p_x * @param p_y * @note If a marker is clicked, the markerClicked() signal * containing the marker id is emitted, otherwise the context menu * to save the new place is shown */ void MarbleMap::mouseRightClick(int p_x, int p_y) { #ifdef DBG_MARBLE_MAP qDebug() << "MarbleMap::mouseRightClick() pt = " << p_x << ", " << p_y; #endif int l_id = -1; QVector<const GeoDataPlacemark *> l_v = whichFeatureAt(QPoint(p_x, p_y)); if(0 < l_v.size()) // since we can have more placemarks (e.g. zoom too low) { l_id = l_v.at(0)->id(); // then, get the first one emit markerClicked(l_id); } else { QMenu l_menu; l_menu.addAction("Save this location?"); QPoint l_pos = mapToGlobal(QPoint(p_x, p_y)); // the menu position is relative to screen and not to widget QAction* l_action = l_menu.exec(l_pos); if (l_action) { qreal l_lng; qreal l_lat; geoCoordinates(p_x, p_y, l_lng, l_lat); #ifdef DBG_MARBLE_MAP qDebug() << "MarbleMap::mouseRightClick() going to create marker at " << l_lat << ", " << l_lng; #endif createMarker(l_lat, l_lng); } } }
void FiducialsNode::tag_cb(int id, double x, double y, double z, double twist, double dx, double dy, double dz, int visible) { if (!publish_markers) return; visualization_msgs::Marker marker = createMarker(fiducial_namespace, id); marker.type = visualization_msgs::Marker::CUBE; marker.action = visualization_msgs::Marker::ADD; marker.pose = scale_position(x, y, z, 0); marker.scale.x = dx / scale; marker.scale.y = dy / scale; marker.scale.z = dz / scale; if( visible ) { marker.color = tag_color; } else { marker.color = hidden_tag_color; } marker.lifetime = ros::Duration(); marker_pub->publish(marker); // publish text(ID) version of marker char str_id[12]; snprintf(str_id, 12, "%d", id); marker.text = str_id; marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING; marker.pose.position.z += (marker.scale.z/2.0) + 0.05; // draw text above marker marker.color.r = marker.color.g = marker.color.b = 1.0; // white marker.scale.x = marker.scale.y = marker.scale.z = 0.2; marker.id = id + 10000; marker.ns = fiducial_namespace + "_text"; marker_pub->publish(marker); }
void ShapeMarker::createInteractiveMarker () { visualization_msgs::InteractiveMarker imarker ; // ROS_INFO("\tcreating interactive marker for shape < %d >", shape_.id); stringstream ss; if(!arrows_ && !deleted_) { ss.str(""); ss.clear() ; ss << shape_.id ; marker_.name = ss.str (); marker_.header = shape_.header; marker_.header.stamp = ros::Time::now() ; } else if(arrows_) { ROS_INFO("Second Marker... ") ; ss.str(""); ss.clear() ; ss << "second_marker_" <<shape_.id ; imarker_.name = ss.str (); imarker_.header = shape_.header; imarker_.header.stamp = ros::Time::now() ; } else if(deleted_) { ROS_INFO("Deleted Marker... ") ; ss.str(""); ss.clear() ; ss << "deleted_marker_" <<shape_.id ; deleted_imarker_.name = ss.str (); deleted_imarker_.header = shape_.header; deleted_imarker_.header.stamp = ros::Time::now() ; } visualization_msgs::InteractiveMarkerControl im_ctrl_for_second_marker; /* create marker */ if (!deleted_ && !arrows_) { ss.str(""); ss.clear() ; ss.str (""); im_ctrl.always_visible = true; ss << "shape_" << shape_.id << "_control"; im_ctrl.name = ss.str (); im_ctrl.description = "shape_markers"; im_ctrl.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON; createMarker (im_ctrl); marker_.controls.push_back(im_ctrl) ; im_server_->insert (marker_ ); im_server_ ->applyChanges() ; menu_handler_.apply (*im_server_, marker_.name); } else if (arrows_) { createMarker (im_ctrl_for_second_marker); imarker_.controls.push_back(im_ctrl_for_second_marker) ; im_server_->insert (imarker_ ); im_server_ ->applyChanges() ; // menu_handler_.apply (*im_server_, imarker_.name); } else if(deleted_){ im_ctrl_for_second_marker.always_visible = true; im_ctrl_for_second_marker.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON; createMarker (im_ctrl_for_second_marker); deleted_imarker_.controls.push_back(im_ctrl_for_second_marker) ; im_server_->insert (deleted_imarker_ ); im_server_ ->applyChanges() ; menu_handler_.apply (*im_server_, deleted_imarker_.name); } }
void Selection3DDisplayCustom::createMarker(int xo, int yo, int x, int y) { createMarker(false,x,y); }
void FiducialsNode::location_cb(int id, double x, double y, double z, double bearing) { ROS_INFO("location_announce:id=%d x=%f y=%f bearing=%f", id, x, y, bearing * 180. / 3.1415926); visualization_msgs::Marker marker = createMarker(position_namespace, id); ros::Time now = marker.header.stamp; marker.type = visualization_msgs::Marker::ARROW; marker.action = visualization_msgs::Marker::ADD; marker.pose = scale_position(x, y, z, bearing); marker.scale.x = 0.2 / scale; marker.scale.y = 0.05 / scale; marker.scale.z = 0.05 / scale; marker.color = position_color; marker.lifetime = ros::Duration(); marker_pub->publish(marker); // TODO: subtract out odometry position, and publish transform from // map to odom double tf_x = marker.pose.position.x; double tf_y = marker.pose.position.y; double tf_yaw = bearing; // publish a transform based on the position if( use_odom ) { // if we're using odometry, look up the odom transform and subtract it // from our position so that we can publish a map->odom transform // such that map->odom->base_link reports the correct position std::string tf_err; if( tf_buffer.canTransform(pose_frame, odom_frame, now, ros::Duration(0.1), &tf_err ) ) { // get odometry position from TF tf2::Quaternion tf_quat; tf_quat.setRPY(0.0, 0.0, tf_yaw); tf2::Transform pose(tf_quat, tf2::Vector3(tf_x, tf_y, 0)); // look up camera transform if we can if( last_camera_frame.length() > 0 ) { if( tf_buffer.canTransform(pose_frame, last_camera_frame, now, ros::Duration(0.1), &tf_err) ) { geometry_msgs::TransformStamped camera_tf; camera_tf = tf_buffer.lookupTransform(pose_frame, last_camera_frame, now); tf2::Transform camera = msg_to_tf(camera_tf); pose = pose * camera.inverse(); } else { ROS_ERROR("Cannot look up transform from %s to %s: %s", pose_frame.c_str(), last_camera_frame.c_str(), tf_err.c_str()); } } geometry_msgs::TransformStamped odom; odom = tf_buffer.lookupTransform(odom_frame, pose_frame, now); tf2::Transform odom_tf = msg_to_tf(odom); // M = C * O // C^-1 * M = O // C^-1 = O * M-1 tf2::Transform odom_correction = (odom_tf * pose.inverse()).inverse(); geometry_msgs::TransformStamped transform; tf2::Vector3 odom_correction_v = odom_correction.getOrigin(); transform.transform.translation.x = odom_correction_v.getX(); transform.transform.translation.y = odom_correction_v.getY(); transform.transform.translation.z = odom_correction_v.getZ(); tf2::Quaternion odom_correction_q = odom_correction.getRotation(); transform.transform.rotation.x = odom_correction_q.getX(); transform.transform.rotation.y = odom_correction_q.getY(); transform.transform.rotation.z = odom_correction_q.getZ(); transform.transform.rotation.w = odom_correction_q.getW(); transform.header.stamp = now; transform.header.frame_id = world_frame; transform.child_frame_id = odom_frame; //tf2::transformTF2ToMsg(odom_correction, transform, now, world_frame, //odom_frame); if (publish_tf) tf_pub.sendTransform(transform); } else { ROS_ERROR("Can't look up base transform from %s to %s: %s", pose_frame.c_str(), odom_frame.c_str(), tf_err.c_str()); } } else { // we're publishing absolute position geometry_msgs::TransformStamped transform; transform.header.stamp = now; transform.header.frame_id = world_frame; transform.child_frame_id = pose_frame; transform.transform.translation.x = tf_x; transform.transform.translation.y = tf_y; transform.transform.translation.z = 0.0; transform.transform.rotation = tf::createQuaternionMsgFromYaw(tf_yaw); if (publish_tf) tf_pub.sendTransform(transform); } }