diff --git a/launch/wam_follow_device.launch b/launch/wam_follow_device.launch index 3dd4754e08a9507c29b7b70673e655cd76b11683..1ecae5b6abb1d4145a9e65e8ab671c159e58e6b4 100644 --- a/launch/wam_follow_device.launch +++ b/launch/wam_follow_device.launch @@ -2,6 +2,7 @@ <!-- Initialize htc vive and publish transformation --> <arg name="device" default="tracker_1"/> + <include file="$(find iri_htc_vive_tracker)/launch/publish_wam_chaperone_link.launch"/> <node pkg="iri_htc_vive_tracker" type = "iri_htc_vive_tracker" name = "iri_htc_vive_tracker" diff --git a/src/htc_vive_tracker_alg_node.cpp b/src/htc_vive_tracker_alg_node.cpp index 4f41de27ab6c674367a93700551c22dff71218d9..6b0a55af25f67a9feab07516c3d1070daa70bee7 100644 --- a/src/htc_vive_tracker_alg_node.cpp +++ b/src/htc_vive_tracker_alg_node.cpp @@ -32,21 +32,22 @@ HtcViveTrackerAlgNode::HtcViveTrackerAlgNode(void) : } - vo_publisher_ = this->public_node_handle_.advertise<nav_msgs::Odometry>("vo",100); - pose_publisher_ = this->public_node_handle_.advertise<geometry_msgs::PoseStamped>("new_pose",100); - filtered_odometry_subscriber_ = this->public_node_handle_.subscribe("filtered_odometry", 100, &HtcViveTrackerAlgNode::filtered_odometryCallback, this); // [init publishers] + vo_publisher_ = this->public_node_handle_.advertise<nav_msgs::Odometry>("vo",100); + pose_publisher_ = this->public_node_handle_.advertise<geometry_msgs::PoseStamped>("new_pose",100); // [init subscribers] + filtered_odometry_subscriber_ = this->public_node_handle_.subscribe("filtered_odometry", 100, &HtcViveTrackerAlgNode::filtered_odometryCallback, this); + // [init services] - this->trigger_pulse_server_ = this->public_node_handle_.advertiseService("trigger_pulse", &HtcViveTrackerAlgNode::trigger_pulse_serverCallback, this); + this->trigger_pulse_server_ = this->public_node_handle_.advertiseService("trigger_pulse", &HtcViveTrackerAlgNode::trigger_pulse_serverCallback, this); + this->get_button_server_ = this->public_node_handle_.advertiseService("button_pressed", &HtcViveTrackerAlgNode::get_button_serverCallback,this); - this->get_button_server_ = this->public_node_handle_.advertiseService("button_pressed", &HtcViveTrackerAlgNode::get_button_serverCallback,this); // [init clients] // [init action servers] @@ -71,7 +72,7 @@ void HtcViveTrackerAlgNode::BroadcastAllPoses(void) { } // HMD always returns a dummy position which is either (0,0,0,1) or the position of a tracking_reference. - if (names[i]=="hmd_1" && !this->publish_hmd_) { + if (names[i]=="hmd_1" && !this->config_.publish_hmd) { continue; } else{ @@ -79,8 +80,6 @@ void HtcViveTrackerAlgNode::BroadcastAllPoses(void) { } } } - - } void HtcViveTrackerAlgNode::mainNodeThread(void) @@ -92,13 +91,38 @@ void HtcViveTrackerAlgNode::mainNodeThread(void) // This function broadcasts the poses of all devices detected this->BroadcastAllPoses(); - } /* [subscriber callbacks] */ +void HtcViveTrackerAlgNode::filtered_odometryCallback(const nav_msgs::Odometry::ConstPtr & msg){ + geometry_msgs::PoseStamped new_pose; + new_pose.pose = msg->pose.pose; + new_pose.header.stamp = ros::Time::now(); + new_pose.header.frame_id = this->alg_.WORLD_NAME; + pose_publisher_.publish(new_pose); +} + /* [service callbacks] */ +bool HtcViveTrackerAlgNode::trigger_pulse_serverCallback(iri_htc_vive_tracker::TriggerHapticPulse::Request &req, iri_htc_vive_tracker::TriggerHapticPulse::Response &res) { + res.success = this->alg_.TriggerHapticPulse(req.device_name, this->config_.pulse_length); + if (!res.success) { + res.message = this->alg_.DEVICE_NOT_FOUND_MSG; + } + return true; +} + +bool HtcViveTrackerAlgNode::get_button_serverCallback(iri_htc_vive_tracker::GetButtonPressed::Request &req, iri_htc_vive_tracker::GetButtonPressed::Response &res) { + vr::EVRButtonId button_pressed = this->alg_.GetPressedButton(req.device_name); + res.button_pressed = (int) button_pressed; + res.success = this->alg_.IsDeviceDetected (req.device_name); + if (!res.success) res.message = this->alg_.DEVICE_NOT_FOUND_MSG; + return true; +} + + + /* [action callbacks] */ /* [action requests] */ @@ -108,12 +132,11 @@ void HtcViveTrackerAlgNode::node_config_update(Config &config, uint32_t level) this->alg_.lock(); if (config.print_devices) { - this->PrintAllDeviceNames(); + config.print_devices = false; + this->PrintAllDeviceNames(); } - this->haptic_pulse_strength_ = config.pulse_length; this->config_=config; - this->publish_hmd_ = config.publish_hmd; this->alg_.unlock(); } @@ -130,18 +153,19 @@ void HtcViveTrackerAlgNode::BroadcastPoseRotated(const std::string & device_name if (this->alg_.GetDevicePositionQuaternion(device_name,pose,quaternion)) { + + tf::Quaternion q = tf::Quaternion(quaternion[0], quaternion[1], quaternion[2], quaternion[3]); + + //Apply the necessary rotations so that the coordinate system is the one decided at IRI + q = this -> ApplyRotationForIRIStandardCoordinates(q); + this->transform_stamped_.header.stamp = ros::Time::now(); this->transform_stamped_.header.frame_id = this->alg_.WORLD_NAME; - transform_stamped_.child_frame_id = device_name; + transform_stamped_.child_frame_id = device_name; transform_stamped_.transform.translation.x = pose[0]; transform_stamped_.transform.translation.y = pose[1]; transform_stamped_.transform.translation.z = pose[2]; - tf::Quaternion q = tf::Quaternion(quaternion[0], quaternion[1], quaternion[2], quaternion[3]); - - //Apply the necessary rotations so that the coordinate system is the one decided at IRI - q = this -> ApplyRotationForIRIStandardCoordinates(q); - transform_stamped_.transform.rotation.x = q.x(); transform_stamped_.transform.rotation.y = q.y(); transform_stamped_.transform.rotation.z = q.z(); @@ -177,20 +201,25 @@ void HtcViveTrackerAlgNode::PrintAllDeviceNames() { } } } + tf::Quaternion HtcViveTrackerAlgNode::ApplyRotationForIRIStandardCoordinates(const tf::Quaternion & orig) { tf::Quaternion q_result; //Define rotations by axis + angle tf::Vector3 x_axis(1.0, 0.0, 0.0); + tf::Vector3 y_axis(0.0, 1.0, 0.0); tf::Vector3 z_axis(0.0, 0.0, 1.0); tf::Quaternion rotation_x90 = tf::Quaternion(x_axis, M_PI/2); + tf::Quaternion rotation_minusx90 = tf::Quaternion(x_axis, -M_PI/2); tf::Quaternion rotation_x180 = tf::Quaternion(x_axis, M_PI); tf::Quaternion rotation_z90 = tf::Quaternion(z_axis, M_PI/2); + tf::Quaternion rotation_minusy90 = tf::Quaternion(y_axis, -M_PI/2); + tf::Quaternion rotation_minusz90 = tf::Quaternion(z_axis, -M_PI/2); //Apply two pre-rotations, in order to match axis in device //Apply two post-rotations, in order to match axis to coordinate system. - q_result = rotation_z90*rotation_x90*orig*rotation_x180*rotation_z90; - + //q_result = rotation_z90*rotation_x90*orig*rotation_x180*rotation_z90; + q_result = rotation_z90*rotation_x90*orig*rotation_minusy90*rotation_minusx90; return q_result; } @@ -199,32 +228,6 @@ tf::Quaternion HtcViveTrackerAlgNode::ApplyRotationForIRIStandardCoordinates(con -void HtcViveTrackerAlgNode::filtered_odometryCallback(const nav_msgs::Odometry::ConstPtr & msg){ - geometry_msgs::PoseStamped new_pose; - new_pose.pose = msg->pose.pose; - new_pose.header.stamp = ros::Time::now(); - new_pose.header.frame_id = this->alg_.WORLD_NAME; - pose_publisher_.publish(new_pose); -} - -bool HtcViveTrackerAlgNode::trigger_pulse_serverCallback(iri_htc_vive_tracker::TriggerHapticPulse::Request &req, iri_htc_vive_tracker::TriggerHapticPulse::Response &res) { - res.success = this->alg_.TriggerHapticPulse(req.device_name, this->haptic_pulse_strength_); - if (!res.success) { - res.message = this->alg_.DEVICE_NOT_FOUND_MSG; - } - - return true; - -} - -bool HtcViveTrackerAlgNode::get_button_serverCallback(iri_htc_vive_tracker::GetButtonPressed::Request &req, iri_htc_vive_tracker::GetButtonPressed::Response &res) { - vr::EVRButtonId button_pressed = this->alg_.GetPressedButton(req.device_name); - res.button_pressed = (int) button_pressed; - res.success = this->alg_.IsDeviceDetected (req.device_name); - if (!res.success) res.message = this->alg_.DEVICE_NOT_FOUND_MSG; - return true; -} - nav_msgs::Odometry HtcViveTrackerAlgNode::CreateOdometryFromPoseVel(const geometry_msgs::Pose & pose, const Velocity & vel){ geometry_msgs::TwistWithCovariance twist_msg;