diff --git a/cfg/calibration.xml b/cfg/calibration.xml deleted file mode 100644 index 7d50215c490e79033f56051aac4eb7d6752958b4..0000000000000000000000000000000000000000 --- a/cfg/calibration.xml +++ /dev/null @@ -1,10 +0,0 @@ -<rosparam> -delay: 0.240481138229 -i: 0.014848087221 -k: 0.157088698842 -j: 0.0105477702755 -w: 0.987416538014 -y: -0.00328448660645 -x: 0.00618500813615 -z: 0.0660937172089 -</rosparam> diff --git a/include/file_reader.h b/include/file_reader.h index 1c80f6c91e00ccc2762316923a1a72ae8a7a5965..e08430becef5e3afb19f6695b5d01feb6a762b17 100644 --- a/include/file_reader.h +++ b/include/file_reader.h @@ -11,8 +11,8 @@ class FileReader{ double ValueFromString (const std::string & value_str); tf2::Transform GetTransformFromVector (const std::vector<double> & values); tf2::Transform ReadTransformFromJSON (const std::string & json_file_path); - tf2::Transform ReadTransformFromXML (const std::string & xml_file_path); tf2::Transform ReadFirstTransformFromCSV (const std::string & csv_file_path); tf2::Transform GetBaseWorldFromTransforms ( tf2::Transform hand_eye , tf2::Transform base_hand, tf2::Transform world_eye); + tf2::Transform GetBaseFromFilePaths (const std::string & hand_eye_json_path, const std::string & base_hand_csv, const std::string & world_eye_csv); }; diff --git a/include/htc_vive_tracker_alg_node.h b/include/htc_vive_tracker_alg_node.h index 13991787a388ab5037430a4a74914afdcc6a68bd..5756cebc9583e5f24ce3aa4e1d8196eb28c38839 100644 --- a/include/htc_vive_tracker_alg_node.h +++ b/include/htc_vive_tracker_alg_node.h @@ -46,7 +46,11 @@ class HtcViveTrackerAlgNode : public algorithm_base::IriBaseAlgorithm<HtcViveTra private: // [publisher attributes] //tf2_ros::TransformBroadcaster tf_broadcaster_; + const std::string BASE_NAME = "iri_wam_link_base"; + const std::string WORLD_NAME = "chaperone"; + FileReader file_reader_; geometry_msgs::TransformStamped transform_stamped_; + geometry_msgs::TransformStamped transform_wam_chaperone_; float ax_, ay_,az_,angle_rad_; bool apply_rotation_; double wam_to_chaperone_x_, wam_to_chaperone_y_, wam_to_chaperone_z_; @@ -133,6 +137,7 @@ class HtcViveTrackerAlgNode : public algorithm_base::IriBaseAlgorithm<HtcViveTra void PrintAllDeviceNames(); void ApplyRotation(tf2::Quaternion & q, float x, float y, float z, float angle); tf2::Quaternion ApplyRotationForIRIStandardCoordinates(const tf2::Quaternion & orig); + void SetValuesWamToChaperone (const std::string & hand_eye_json_path, const std::string & base_hand_csv, const std::string & world_eye_csv); }; #endif diff --git a/src/file_reader.cpp b/src/file_reader.cpp index f95e880f8b63ff2c26ade6122da449cf659b6f58..68c4777115da82ec2b358fda79933abc55dfa0f7 100644 --- a/src/file_reader.cpp +++ b/src/file_reader.cpp @@ -1,27 +1,29 @@ #include "file_reader.h" +std::vector<std::string> string_values = {"x","y","z","i","j","k","w"}; tf2::Transform FileReader::ReadTransformFromJSON (const std::string & json_file_path){ std::ifstream json_file(json_file_path); + //std::cout<"Reading JSON FILE : "<<std::endl; std::string line; + std::string data_value; + std::vector<double>json_values(string_values.size(),0.0); // x,y,z, qx,qy,qz,qw + while (json_file.good()){ - getline(json_file,line); + getline(json_file,line,'"'); + for (int i = 0; i<string_values.size(); ++i){ + if (line == string_values[i]){ + getline(json_file,data_value,','); + json_values[i] = std::stod(data_value.erase(0,1)); + } + } } - tf2::Transform transform; + + tf2::Transform transform = GetTransformFromVector(json_values); return transform; } -tf2::Transform FileReader::ReadTransformFromXML (const std::string & xml_file_path){ - std::ifstream xml_file(xml_file_path); - std::string line; - while (xml_file.good()){ - getline(xml_file,line); - } - tf2::Transform transform; - return transform; - -} tf2::Transform FileReader::ReadFirstTransformFromCSV (const std::string & csv_file_path){ std::ifstream csv_file(csv_file_path); @@ -70,10 +72,19 @@ double ValueFromString (const std::string & value_str){ return std::stod (value_str); } -tf2::Transform GetBaseWorldFromTransforms ( tf2::Transform hand_eye , tf2::Transform base_hand, tf2::Transform world_eye){ +tf2::Transform FileReader::GetBaseWorldFromTransforms ( tf2::Transform hand_eye , tf2::Transform base_hand, tf2::Transform world_eye){ tf2::Transform t1 = base_hand*hand_eye; t1 = t1*(world_eye.inverse()); return t1; } + +tf2::Transform FileReader::GetBaseFromFilePaths (const std::string & hand_eye_json_path, const std::string & base_hand_csv, const std::string & world_eye_csv){ + + tf2::Transform hand_eye_t = ReadTransformFromJSON (hand_eye_json_path); + tf2::Transform base_hand_t = ReadFirstTransformFromCSV (base_hand_csv); + tf2::Transform world_eye_t = ReadFirstTransformFromCSV (world_eye_csv); + + return GetBaseWorldFromTransforms (hand_eye_t, base_hand_t, world_eye_t); +} diff --git a/src/htc_vive_tracker_alg_node.cpp b/src/htc_vive_tracker_alg_node.cpp index bb6e8469312a8c37c470c260ef74c5d4931d7faf..2e822f63ba9ab0d138dca4b35db6c18e9fdfe901 100644 --- a/src/htc_vive_tracker_alg_node.cpp +++ b/src/htc_vive_tracker_alg_node.cpp @@ -4,18 +4,14 @@ HtcViveTrackerAlgNode::HtcViveTrackerAlgNode(void) : algorithm_base::IriBaseAlgorithm<HtcViveTrackerAlgorithm>() { this->loop_rate_ = 20; - bool verbose = true; - //"delay": -7165.209842681885, - //"rotation": { - this->wam_to_chaperone_i_ = -0.004155247641619615; - this->wam_to_chaperone_j_ = 0.010017762641695618; - this->wam_to_chaperone_k_ = -0.9953359445264848; - this->wam_to_chaperone_w_ = 0.09585789420940735; - //}, - //"translation": { - this->wam_to_chaperone_x_ = 0.0006095892506164251; - this->wam_to_chaperone_y_ = -0.006141146275579224; - this->wam_to_chaperone_z_ = 0.07223111590777255; + bool verbose = true; + this-> SetValuesWamToChaperone( + "/home/pmlab/iri-lab/iri_ws/src/iri_htc_vive_tracker/cfg/calibration.json", + + "/home/pmlab/iri-lab/iri_ws/src/iri_htc_vive_tracker/cfg/aligned_tf_poses_wam.csv", + "/home/pmlab/iri-lab/iri_ws/src/iri_htc_vive_tracker/cfg/aligned_tf_poses_tracker.csv"); + + // } //init class attributes if necessary @@ -225,26 +221,22 @@ void HtcViveTrackerAlgNode::ApplyRotation(tf2::Quaternion & orig, float ax, floa void HtcViveTrackerAlgNode::BroadcastWAMToChaperoneTransformation (){ static tf2_ros::TransformBroadcaster tf_broadcaster; - geometry_msgs::TransformStamped transform_stamped_wam_chaperone; - transform_stamped_wam_chaperone.header.stamp = ros::Time::now(); - transform_stamped_wam_chaperone.header.frame_id = "chaperone"; - transform_stamped_wam_chaperone.child_frame_id = "iri_wam_link_base"; - transform_stamped_wam_chaperone.transform.translation.x = this->wam_to_chaperone_x_; - transform_stamped_wam_chaperone.transform.translation.y = this->wam_to_chaperone_y_; - transform_stamped_wam_chaperone.transform.translation.z = this->wam_to_chaperone_z_; + tf_broadcaster.sendTransform(this->transform_wam_chaperone_); + +} +void HtcViveTrackerAlgNode::SetValuesWamToChaperone (const std::string & hand_eye_json_path, const std::string & base_hand_csv, const std::string & world_eye_csv){ - - - - transform_stamped_wam_chaperone.transform.rotation.x = this->wam_to_chaperone_i_; - transform_stamped_wam_chaperone.transform.rotation.y = this->wam_to_chaperone_j_; - transform_stamped_wam_chaperone.transform.rotation.z = this->wam_to_chaperone_k_; - transform_stamped_wam_chaperone.transform.rotation.w = this->wam_to_chaperone_w_; + this->transform_wam_chaperone_.transform = Tf2ToGeometryMsgTranformConversion (file_reader_.GetBaseFromFilePaths(hand_eye_json_path, base_hand_csv, world_eye_csv)); + this->transform_wam_chaperone_.header.frame_id = BASE_NAME; + this->transform_wam_chaperone_.child_frame_id = WORLD_NAME; +} +geometry_msgs::Transform Tf2ToGeometryMsgTransformConversion(tf2::Transform & transform_original){ + geometry_msgs::Transform transform_final; + transform_final.translation = transform_original.getOrigin(); + transform_final.rotation = transform_original.getRotation(); - tf_broadcaster.sendTransform(transform_stamped_wam_chaperone); - } /* main function */ int main(int argc,char *argv[])