diff --git a/pps_ws/src/d_fall_pps/src/ViconDataPublisher.cpp b/pps_ws/src/d_fall_pps/src/ViconDataPublisher.cpp index 3ef987b3d2fae818c156950cf5f9c63fb7b38203..6b9fcc54ea0979b032ed123d57c8d6e2f7bc0258 100644 --- a/pps_ws/src/d_fall_pps/src/ViconDataPublisher.cpp +++ b/pps_ws/src/d_fall_pps/src/ViconDataPublisher.cpp @@ -30,6 +30,19 @@ int main(int argc, char* argv[]) { ros::Publisher viconDataPublisher = nodeHandle.advertise<d_fall_pps::ViconData>("ViconData", 1); + //publish something random if no viconData is available for testing + /* + d_fall_pps::ViconData viconData; + double i = 1; + while(true) + { + viconData.roll = i; + viconDataPublisher.publish(viconData); + ++i; + } + //the code will not go further than here if testing without real ViconData + */ + Client client; //connect client to Vicon computer @@ -47,18 +60,22 @@ int main(int argc, char* argv[]) { } //set data stream parameters - client.SetStreamMode(ViconDataStreamSDK::CPP::StreamMode::ClientPull); + client.SetStreamMode(ViconDataStreamSDK::CPP::StreamMode::ClientPull); //phfriedl: maybe ServerPush instead of ClientPull for less latency? client.EnableSegmentData(); client.EnableMarkerData(); client.EnableUnlabeledMarkerData(); client.EnableDeviceData(); - // Set the global up axis + // Set the global up axis, such that Z is up client.SetAxisMapping(Direction::Forward, Direction::Left, Direction::Up); + //TODO + //maybe we need a loop rate?---------e.g. 0.5 MHz ----------------------------- + //ros::Rate loop_rate(500000) + while (ros::ok()) { // Get a frame while (client.GetFrame().Result != Result::Success) { @@ -70,8 +87,9 @@ int main(int argc, char* argv[]) { // //Process the data and publish on topic for (int index = 0; index < subjectCount; index++) { - std::string subjectName = client.GetSubjectName(index).SubjectName; - std::string segmentName = client.GetSegmentName(subjectName, index).SegmentName; + std::string subjectName = client.GetSubjectName(index).SubjectName; + std::string segmentName = client.GetSegmentName(subjectName, 0).SegmentName; //last value had to be changed to 0 instead of index, 27.03.17 + Output_GetSegmentGlobalTranslation outputTranslation = client.GetSegmentGlobalTranslation(subjectName, segmentName); @@ -79,16 +97,23 @@ int main(int argc, char* argv[]) { Output_GetSegmentGlobalRotationQuaternion outputRotation = client.GetSegmentGlobalRotationQuaternion(subjectName, segmentName); + //calculate position and rotation of Crazyflie double quat_x = outputRotation.Rotation[0]; double quat_y = outputRotation.Rotation[1]; double quat_z = outputRotation.Rotation[2]; double quat_w = outputRotation.Rotation[3]; + ROS_INFO("x-value and w-value:"); + ROS_INFO_STREAM(quat_x); + ROS_INFO_STREAM(quat_w); //TODO check whether this transformation is correct double roll = atan2(2 * (quat_w * quat_x + quat_y * quat_z), 1 - 2 * (quat_x * quat_x + quat_y * quat_y)); double pitch = asin(2 * (quat_w * quat_y - quat_z * quat_x)); double yaw = atan2(2 * (quat_w * quat_z + quat_x * quat_y), 1 - 2 * (quat_y * quat_y + quat_z * quat_z)); + ROS_INFO("roll:"); + ROS_INFO_STREAM(roll); + ROS_INFO("----------------------"); //calculate time until frame data was received Output_GetLatencyTotal outputLatencyTotal = client.GetLatencyTotal(); @@ -102,6 +127,7 @@ int main(int argc, char* argv[]) { //build and publish message d_fall_pps::ViconData viconData; viconData.crazyflieName = subjectName; + viconData.x = outputTranslation.Translation[0]; viconData.y = outputTranslation.Translation[1]; viconData.z = outputTranslation.Translation[2]; @@ -110,7 +136,9 @@ int main(int argc, char* argv[]) { viconData.yaw = yaw; viconData.acquiringTime = totalViconLatency; + //finally publish viconDataPublisher.publish(viconData); + } }