// this function is called each frame void glutDisplay (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); glDisable(GL_TEXTURE_2D); if (!g_bPause) { // Read next available data g_Context.WaitAndUpdateAll(); } // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); DrawDepthMap(depthMD, sceneMD); glutSwapBuffers(); Sleep(5); // todo: adjust }
// this function is called each frame void glutDisplay(void) { //send stuff twice every frame executeInputLoop(); executeInputLoop(); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); glDisable(GL_TEXTURE_2D); if (!g_bPause) { // Read next available data g_Context.WaitOneUpdateAll(g_UserGenerator); } // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); //draw the suff with openGL DrawDepthMap(depthMD, sceneMD); glutSwapBuffers(); }
// this function is called each frame void glutDisplay (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); #ifdef USE_GLUT glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #else glOrthof(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #endif glDisable(GL_TEXTURE_2D); if (!g_bPause) { // Read next available data g_Context.WaitOneUpdateAll(g_DepthGenerator); } // Process the data //DRAW g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); DrawDepthMap(depthMD, sceneMD, g_nPlayer); if (g_nPlayer != 0) { XnPoint3D com; g_UserGenerator.GetCoM(g_nPlayer, com); if (com.Z == 0) { g_nPlayer = 0; FindPlayer(); } } #ifdef USE_GLUT glutSwapBuffers(); #endif }
// this function is called each frame void glutDisplay (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); glDisable(GL_TEXTURE_2D); if (!g_bPause) { // Read next available data g_Context.WaitAndUpdateAll(); } ros::Time tstamp=ros::Time::now(); // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); DrawDepthMap(depthMD, sceneMD); std::vector<mapping_msgs::PolygonalMap> pmaps; body_msgs::Skeletons skels; getSkels(pmaps,skels); ROS_DEBUG("skels size %d \n",pmaps.size()); if(pmaps.size()){ skels.header.stamp=tstamp; skels.header.seq = depthMD.FrameID(); skels.header.frame_id="/openni_depth_optical_frame"; skel_pub.publish(skels); pmaps.front().header.stamp=tstamp; pmaps.front().header.seq = depthMD.FrameID(); pmaps.front().header.frame_id="/openni_depth_optical_frame"; pmap_pub.publish(pmaps[0]); } glutSwapBuffers(); }
// this function is called each frame void glutDisplay () { clock_t t1 = clock(); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; xn::ImageMetaData imageMD; g_DepthGenerator.GetMetaData(depthMD); g_ImageGenerator.GetMetaData(imageMD); #ifndef USE_GLES glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #else glOrthof(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #endif glDisable(GL_TEXTURE_2D); if (!g_bPause) { // Read next available data g_Context.WaitOneUpdateAll(g_UserGenerator); } // Process the data g_DepthGenerator.GetMetaData(depthMD); g_ImageGenerator.GetMetaData(imageMD); g_UserGenerator.GetUserPixels(0, sceneMD); if(Show_Image == FALSE) DrawDepthMap(depthMD, sceneMD,COM_tracker,Bounding_Box); else { DrawImageMap(imageMD, depthMD, sceneMD,COM_tracker,Bounding_Box); } #ifndef USE_GLES glutSwapBuffers(); #endif clock_t t2 = clock(); std::cout << t2 - t1 << std::endl; }
// Callback: Finished calibration void XN_CALLBACK_TYPE UserCalibration_CalibrationEnd(xn::SkeletonCapability& capability, XnUserID nId, XnBool bSuccess, void* pCookie) { if (bSuccess) { // Calibration succeeded - save this first calibration and start tracking the user ROS_INFO("[bk_skeletal_tracker] Calibration complete, now tracking user %d", nId); g_bhasCal=true; first_calibrated_user_ = nId; g_UserGenerator.GetSkeletonCap().SaveCalibrationData(nId, 0); g_UserGenerator.GetSkeletonCap().StartTracking(nId); // Save the user's calibration // Get mask of this user xn::SceneMetaData sceneMD; cv::Mat label_image; g_UserGenerator.GetUserPixels(0, sceneMD); getUserLabelImage(sceneMD, label_image); label_image = (label_image == nId); xn::ImageMetaData imageMD; //g_ImageGenerator.GetMetaData(imageMD); cv::Mat rgb; rgb = getRGB(imageMD); original_cal_.init(rgb, label_image); user_cal_ = original_cal_; } else { // Calibration failed ROS_INFO("[bk_skeletal_tracker] Calibration failed for user %d", nId); if (g_bNeedPose) g_UserGenerator.GetPoseDetectionCap().StartPoseDetection(g_strPose, nId); else g_UserGenerator.GetSkeletonCap().RequestCalibration(nId, true); } }
void publishTransforms(const std::string& frame_id, image_transport::Publisher& pub) { XnUserID users[15]; XnUInt16 users_count = 15; g_UserGenerator.GetUsers(users, users_count); for (int i = 0; i < users_count; ++i) { XnUserID user = users[i]; if (!g_UserGenerator.GetSkeletonCap().IsTracking(user)) continue; publishTransform(user, XN_SKEL_HEAD, frame_id, "head"); publishTransform(user, XN_SKEL_NECK, frame_id, "neck"); publishTransform(user, XN_SKEL_TORSO, frame_id, "torso"); publishTransform(user, XN_SKEL_LEFT_SHOULDER, frame_id, "left_shoulder"); publishTransform(user, XN_SKEL_LEFT_ELBOW, frame_id, "left_elbow"); publishTransform(user, XN_SKEL_LEFT_HAND, frame_id, "left_hand"); publishTransform(user, XN_SKEL_RIGHT_SHOULDER, frame_id, "right_shoulder"); publishTransform(user, XN_SKEL_RIGHT_ELBOW, frame_id, "right_elbow"); publishTransform(user, XN_SKEL_RIGHT_HAND, frame_id, "right_hand"); publishTransform(user, XN_SKEL_LEFT_HIP, frame_id, "left_hip"); publishTransform(user, XN_SKEL_LEFT_KNEE, frame_id, "left_knee"); publishTransform(user, XN_SKEL_LEFT_FOOT, frame_id, "left_foot"); publishTransform(user, XN_SKEL_RIGHT_HIP, frame_id, "right_hip"); publishTransform(user, XN_SKEL_RIGHT_KNEE, frame_id, "right_knee"); publishTransform(user, XN_SKEL_RIGHT_FOOT, frame_id, "right_foot"); } // publish segmented image xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); PublishPeopleImage(depthMD, sceneMD, pub); }
// this function is called each frame void glutDisplay (void) { xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; xn::ImageMetaData imageMD; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); g_DepthGenerator.GetMetaData(depthMD); g_ImageGenerator.GetMetaData(imageMD); #ifndef USE_GLES glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #else glOrthof(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #endif glDisable(GL_TEXTURE_2D); // Read next available data g_Context.WaitOneUpdateAll(g_UserGenerator); // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); g_ImageGenerator.GetMetaData(imageMD); // Draw the input fetched from the Kinect DrawKinectInput(depthMD, sceneMD, imageMD); #ifndef USE_GLES glutSwapBuffers(); #endif }
int main(int argc, char **argv) { XnStatus nRetVal = XN_STATUS_OK; xn::EnumerationErrors errors; if( USE_RECORED_DATA ){ g_Context.Init(); g_Context.OpenFileRecording(RECORD_FILE_PATH); xn::Player player; // Player nodeの取得 nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_PLAYER, player); CHECK_RC(nRetVal, "Find player"); LOG_D("PlaybackSpeed: %d", player.GetPlaybackSpeed()); xn:NodeInfoList nodeList; player.EnumerateNodes(nodeList); for( xn::NodeInfoList::Iterator it = nodeList.Begin(); it != nodeList.End(); ++it){ if( (*it).GetDescription().Type == XN_NODE_TYPE_IMAGE ){ nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_ImageGenerator); CHECK_RC(nRetVal, "Find image node"); LOG_D("%s", "ImageGenerator created."); } else if( (*it).GetDescription().Type == XN_NODE_TYPE_DEPTH ){ nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_DepthGenerator); CHECK_RC(nRetVal, "Find depth node"); LOG_D("%s", "DepthGenerator created."); } else{ LOG_D("%s %s %s", ::xnProductionNodeTypeToString((*it).GetDescription().Type ), (*it).GetInstanceName(), (*it).GetDescription().strName); } } } else{ LOG_I("Reading config from: '%s'", CONFIG_XML_PATH); nRetVal = g_Context.InitFromXmlFile(CONFIG_XML_PATH, g_scriptNode, &errors); if (nRetVal == XN_STATUS_NO_NODE_PRESENT){ XnChar strError[1024]; errors.ToString(strError, 1024); LOG_E("%s\n", strError); return (nRetVal); } else if (nRetVal != XN_STATUS_OK){ LOG_E("Open failed: %s", xnGetStatusString(nRetVal)); return (nRetVal); } nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_DepthGenerator); CHECK_RC(nRetVal,"No depth"); // ImageGeneratorの作成 nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_ImageGenerator); CHECK_RC(nRetVal, "Find image generator"); } // UserGeneratorの取得 nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_USER, g_UserGenerator); if(nRetVal!=XN_STATUS_OK){ nRetVal = g_UserGenerator.Create(g_Context); CHECK_RC(nRetVal, "Create user generator"); } XnCallbackHandle hUserCallbacks, hCalibrationStart, hCalibrationComplete, hPoseDetected; if (!g_UserGenerator.IsCapabilitySupported(XN_CAPABILITY_SKELETON)){ LOG_E("%s", "Supplied user generator doesn't support skeleton"); return 1; } nRetVal = g_UserGenerator.RegisterUserCallbacks(User_NewUser, User_LostUser, NULL, hUserCallbacks); CHECK_RC(nRetVal, "Register to user callbacks"); g_SkeletonCap = g_UserGenerator.GetSkeletonCap(); nRetVal = g_SkeletonCap.RegisterToCalibrationStart(UserCalibration_CalibrationStart, NULL, hCalibrationStart); CHECK_RC(nRetVal, "Register to calibration start"); nRetVal = g_SkeletonCap.RegisterToCalibrationComplete(UserCalibration_CalibrationComplete, NULL, hCalibrationComplete); CHECK_RC(nRetVal, "Register to calibration complete"); if (g_SkeletonCap.NeedPoseForCalibration()){ g_bNeedPose = TRUE; if (!g_UserGenerator.IsCapabilitySupported(XN_CAPABILITY_POSE_DETECTION)){ LOG_E("%s", "Pose required, but not supported"); return 1; } nRetVal = g_UserGenerator.GetPoseDetectionCap().RegisterToPoseDetected(UserPose_PoseDetected, NULL, hPoseDetected); CHECK_RC(nRetVal, "Register to Pose Detected"); g_SkeletonCap.GetCalibrationPose(g_strPose); } g_SkeletonCap.SetSkeletonProfile(XN_SKEL_PROFILE_ALL); nRetVal = g_Context.StartGeneratingAll(); CHECK_RC(nRetVal, "StartGenerating"); // 表示用の画像データの作成 XnMapOutputMode mapMode; g_ImageGenerator.GetMapOutputMode(mapMode); g_rgbImage = cvCreateImage(cvSize(mapMode.nXRes, mapMode.nYRes), IPL_DEPTH_8U, 3); LOG_I("%s", "Starting to run"); if(g_bNeedPose){ LOG_I("%s", "Assume calibration pose"); } xn::Recorder recorder; if( DO_RECORED && !USE_RECORED_DATA ){ // レコーダーの作成 LOG_I("%s", "Setup Recorder"); nRetVal = recorder.Create(g_Context); CHECK_RC(nRetVal, "Create recorder"); // 保存設定 nRetVal = recorder.SetDestination(XN_RECORD_MEDIUM_FILE, RECORD_FILE_PATH); CHECK_RC(nRetVal, "Set recorder destination file"); // 深度、ビデオカメラ入力を保存対象として記録開始 nRetVal = recorder.AddNodeToRecording(g_DepthGenerator, XN_CODEC_NULL); CHECK_RC(nRetVal, "Add depth node to recording"); nRetVal = recorder.AddNodeToRecording(g_ImageGenerator, XN_CODEC_NULL); CHECK_RC(nRetVal, "Add image node to recording"); LOG_I("%s", "Recorder setup done."); } while (!xnOSWasKeyboardHit()) { g_Context.WaitOneUpdateAll(g_UserGenerator); if( DO_RECORED && !USE_RECORED_DATA ){ nRetVal = recorder.Record(); CHECK_RC(nRetVal, "Record"); } // ビデオカメラ画像の生データを取得 xn::ImageMetaData imageMetaData; g_ImageGenerator.GetMetaData(imageMetaData); // メモリコピー xnOSMemCopy(g_rgbImage->imageData, imageMetaData.RGB24Data(), g_rgbImage->imageSize); // BGRからRGBに変換して表示 cvCvtColor(g_rgbImage, g_rgbImage, CV_RGB2BGR); // UserGeneratorからユーザー識別ピクセルを取得 xn::SceneMetaData sceneMetaData; g_UserGenerator.GetUserPixels(0, sceneMetaData); XnUserID allUsers[MAX_NUM_USERS]; XnUInt16 nUsers = MAX_NUM_USERS; g_UserGenerator.GetUsers(allUsers, nUsers); for (int i = 0; i < nUsers; i++) { // キャリブレーションに成功しているかどうか if (g_SkeletonCap.IsTracking(allUsers[i])) { // スケルトンを描画 DrawSkelton(allUsers[i], i); } } // 表示 cvShowImage("User View", g_rgbImage); // ESCもしくはqが押されたら終了させる if (cvWaitKey(10) == 27) { break; } } if( !USE_RECORED_DATA ){ g_scriptNode.Release(); } g_DepthGenerator.Release(); g_UserGenerator.Release(); g_Context.Release(); if (g_rgbImage != NULL) { cvReleaseImage(&g_rgbImage); } g_Context.Shutdown(); }
void KinectDataPub::spin(bool async) { static bool onceThrough = false; if (!onceThrough){ XnStatus nRetVal = XN_STATUS_OK; nRetVal = context.StartGeneratingAll(); CHECK_RC(nRetVal, "StartGenerating"); onceThrough = true; printf("Starting to run\n"); if (needPose){ printf("Assume calibration pose\n"); } } XnUserID aUsers[MAX_NUM_USERS]; XnUInt16 nUsers; SkeletonInfo skels[MAX_NUM_USERS]; SensorMsg msg; xn::DepthMetaData depthMD; xn::SceneMetaData sceneMD; while(!xnOSWasKeyboardHit()){ context.WaitOneUpdateAll(userGen); /** * nUsers is used both as input and output parameters. * When it's used as input parameter, it indicates the size of the user ID * array, while, when it's used as output parameter, it means the number * of users recognized. Therefore, it needs to be re-initialized in a loop. */ nUsers = MAX_NUM_USERS; userGen.GetUsers(aUsers, nUsers); memset(&msg, 0, sizeof(SensorMsg)); for (XnUInt16 i = 0; i < nUsers; ++i){ if (userGen.GetSkeletonCap().IsTracking(aUsers[i])){ // get the user's skeleton skels[i].user = aUsers[i]; getSkeleton(skels[i]); } else skels[i].user = 0; // user is not tracked } depthGen.GetMetaData(depthMD); // depth map userGen.GetUserPixels(0, sceneMD); // labels msg.nUsers = nUsers; // num of users detected, either tracked or not msg.pSkels = skels; msg.pDepthMD = &depthMD; msg.pSceneMD = &sceneMD; for (int i = 0; i < subscribers.size(); ++i) subscribers[i]->notify(RAD_SENSOR_MSG, &msg); if (async) return; } }
/* The matlab mex function */ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { XnUInt64 *MXadress; double *Pos; int Jdimsc[2]; Jdimsc[0]=225; Jdimsc[1]=7; plhs[0] = mxCreateNumericArray(2, Jdimsc, mxDOUBLE_CLASS, mxREAL); Pos = mxGetPr(plhs[0]); if(nrhs==0) { printf("Open failed: Give Pointer to Kinect as input\n"); mexErrMsgTxt("Kinect Error"); } MXadress = (XnUInt64*)mxGetData(prhs[0]); if(MXadress[0]>0){ g_Context = ((xn::Context*) MXadress[0])[0]; } if(MXadress[2]>0) { g_DepthGenerator = ((xn::DepthGenerator*) MXadress[2])[0]; } else { mexErrMsgTxt("No Depth Node in Kinect Context"); } if(MXadress[4]>0) { g_UserGenerator = ((xn::UserGenerator*) MXadress[4])[0]; } else { mexErrMsgTxt("No User Node in Kinect Context"); } XnStatus nRetVal = XN_STATUS_OK; XnCallbackHandle hUserCallbacks, hCalibrationCallbacks, hPoseCallbacks; if (!g_UserGenerator.IsCapabilitySupported(XN_CAPABILITY_SKELETON)) { printf("Supplied user generator doesn't support skeleton\n"); return; } g_UserGenerator.RegisterUserCallbacks(User_NewUser, User_LostUser, NULL, hUserCallbacks); g_UserGenerator.GetSkeletonCap().RegisterCalibrationCallbacks(UserCalibration_CalibrationStart, UserCalibration_CalibrationEnd, NULL, hCalibrationCallbacks); if (g_UserGenerator.GetSkeletonCap().NeedPoseForCalibration()) { g_bNeedPose = TRUE; if (!g_UserGenerator.IsCapabilitySupported(XN_CAPABILITY_POSE_DETECTION)) { printf("Pose required, but not supported\n"); return; } g_UserGenerator.GetPoseDetectionCap().RegisterToPoseCallbacks(UserPose_PoseDetected, NULL, NULL, hPoseCallbacks); g_UserGenerator.GetSkeletonCap().GetCalibrationPose(g_strPose); } g_UserGenerator.GetSkeletonCap().SetSkeletonProfile(XN_SKEL_PROFILE_ALL); char strLabel[50] = ""; XnUserID aUsers[15]; XnUInt16 nUsers = 15; int r=0; xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); g_UserGenerator.GetUsers(aUsers, nUsers); for (int i = 0; i < nUsers; ++i) { if (g_UserGenerator.GetSkeletonCap().IsTracking(aUsers[i])) { //printf(strLabel, "%d - Looking for pose", aUsers[i]); XnSkeletonJointPosition joint[15]; g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_HEAD, joint[0]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_NECK, joint[1]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_LEFT_SHOULDER, joint[2]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_LEFT_ELBOW, joint[3]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_LEFT_HAND, joint[4]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_RIGHT_SHOULDER, joint[5]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_RIGHT_ELBOW, joint[6]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_RIGHT_HAND, joint[7]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_TORSO, joint[8]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_LEFT_HIP, joint[9]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_LEFT_KNEE, joint[10]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_LEFT_FOOT, joint[11]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_RIGHT_HIP, joint[12]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_RIGHT_KNEE, joint[13]); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i],XN_SKEL_RIGHT_FOOT, joint[14]); XnPoint3D pt[1]; for(int j=0; j<15; j++) { Pos[j +r]=aUsers[i]; Pos[j+Jdimsc[0] +r]=joint[j].fConfidence; Pos[j+Jdimsc[0]*2+r]=joint[j].position.X; Pos[j+Jdimsc[0]*3+r]=joint[j].position.Y; Pos[j+Jdimsc[0]*4+r]=joint[j].position.Z; pt[0] = joint[j].position; g_DepthGenerator.ConvertRealWorldToProjective(1, pt, pt); Pos[j+Jdimsc[0]*5+r]=pt[0].X; Pos[j+Jdimsc[0]*6+r]=pt[0].Y; } r+=15; } } }
// this function is called each frame void glutDisplay (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Setup the OpenGL viewpoint glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); // Check if Registration is done for Depth and RGB Images - Brandyn, Sravanthi g_DepthGenerator.GetAlternativeViewPointCap().SetViewPoint(g_ImageGenerator); // g_DepthGenerator.GetAlternativeViewPointCap().ResetViewPoint(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; xn::ImageMetaData imageMD; g_DepthGenerator.GetMetaData(depthMD); g_ImageGenerator.GetMetaData(imageMD); #ifdef USE_GLUT glOrtho(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #else glOrthof(0, depthMD.XRes(), depthMD.YRes(), 0, -1.0, 1.0); #endif glDisable(GL_TEXTURE_2D); if (!g_bPause) { // Read next available data g_Context.WaitAndUpdateAll(); } // Process the data //DRAW // Check if Registration is done for Depth and RGB Images - Brandyn, Sravanthi g_DepthGenerator.GetAlternativeViewPointCap().SetViewPoint(g_ImageGenerator); // g_DepthGenerator.GetAlternativeViewPointCap().ResetViewPoint(); g_DepthGenerator.GetMetaData(depthMD); g_ImageGenerator.GetMetaData(imageMD); g_UserGenerator.GetUserPixels(0, sceneMD); DrawDepthMap(depthMD, imageMD, sceneMD, g_nPlayer); if (g_nPlayer != 0) { XnPoint3D com; g_UserGenerator.GetCoM(g_nPlayer, com); if (com.Z == 0) { g_nPlayer = 0; FindPlayer(); } } #ifdef USE_GLUT glutSwapBuffers(); #endif }
int main(int argc, char **argv) { ros::init(argc, argv, "PersonTracker"); ros::NodeHandle nh; ros::Rate loop_rate(10); ROS_INFO("Initalizing Arm Connection...."); ros::Publisher leftArmPublisher = nh.advertise<prlite_kinematics::SphereCoordinate>("/armik/n0/position", 1000); ros::Publisher rightArmPublisher = nh.advertise<prlite_kinematics::SphereCoordinate>("/armik/n1/position", 1000); yourmom = nh.advertise<prlite_kinematics::some_status_thing>("kinect_hack_status", 1000); ros::Duration(2.0).sleep(); prlite_kinematics::SphereCoordinate coord; prlite_kinematics::some_status_thing status; coord.radius = 35.0; coord.phi = 0.0; coord.theta = 0.0; status.lulz = 0; //initialized/reset yourmom.publish(status); leftArmPublisher.publish(coord); rightArmPublisher.publish(coord); ROS_INFO("Initalizing Kinect + NITE...."); XnStatus nRetVal = XN_STATUS_OK; xn::EnumerationErrors errors; nRetVal = g_Context.InitFromXmlFile(SAMPLE_XML_PATH, &errors); if (nRetVal == XN_STATUS_NO_NODE_PRESENT) { XnChar strError[1024]; errors.ToString(strError, 1024); printf("%s\n", strError); return (nRetVal); } else if (nRetVal != XN_STATUS_OK) { printf("Open failed: %s\n", xnGetStatusString(nRetVal)); return (nRetVal); } nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_DepthGenerator); CHECK_RC(nRetVal, "Find depth generator"); nRetVal = g_Context.FindExistingNode(XN_NODE_TYPE_USER, g_UserGenerator); if (nRetVal != XN_STATUS_OK) { nRetVal = g_UserGenerator.Create(g_Context); CHECK_RC(nRetVal, "Find user generator"); } XnCallbackHandle hUserCallbacks, hCalibrationCallbacks, hPoseCallbacks; if (!g_UserGenerator.IsCapabilitySupported(XN_CAPABILITY_SKELETON)) { printf("Supplied user generator doesn't support skeleton\n"); return 1; } g_UserGenerator.RegisterUserCallbacks(User_NewUser, User_LostUser, NULL, hUserCallbacks); g_UserGenerator.GetSkeletonCap().RegisterCalibrationCallbacks(UserCalibration_CalibrationStart, UserCalibration_CalibrationEnd, NULL, hCalibrationCallbacks); if (g_UserGenerator.GetSkeletonCap().NeedPoseForCalibration()) { g_bNeedPose = TRUE; if (!g_UserGenerator.IsCapabilitySupported(XN_CAPABILITY_POSE_DETECTION)) { printf("Pose required, but not supported\n"); return 1; } g_UserGenerator.GetPoseDetectionCap().RegisterToPoseCallbacks(UserPose_PoseDetected, NULL, NULL, hPoseCallbacks); g_UserGenerator.GetSkeletonCap().GetCalibrationPose(g_strPose); } g_UserGenerator.GetSkeletonCap().SetSkeletonProfile(XN_SKEL_PROFILE_ALL); nRetVal = g_Context.StartGeneratingAll(); CHECK_RC(nRetVal, "StartGenerating"); ROS_INFO("Ready To Go!\n"); while (ros::ok()) { // Update OpenNI g_Context.WaitAndUpdateAll(); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); // Print positions XnUserID aUsers[15]; XnUInt16 nUsers = 15; g_UserGenerator.GetUsers(aUsers, nUsers); for (int i = 0; i < nUsers; ++i) { if(g_UserGenerator.GetSkeletonCap().IsTracking(aUsers[i])) { // Read joint positions for person (No WRISTs) XnSkeletonJointPosition torsoPosition, lShoulderPosition, rShoulderPosition, neckPosition, headPosition, lElbowPosition, rElbowPosition; XnSkeletonJointPosition rWristPosition, lWristPosition, rHipPosition, lHipPosition, lKneePosition, rKneePosition; XnSkeletonJointPosition lFootPosition, rFootPosition; g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_TORSO, torsoPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_NECK, neckPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_HEAD, headPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_SHOULDER, lShoulderPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_RIGHT_SHOULDER, rShoulderPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_ELBOW, lElbowPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_RIGHT_ELBOW, rElbowPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_HAND, lWristPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_RIGHT_HAND, rWristPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_HIP, lHipPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_RIGHT_HIP, rHipPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_KNEE, lKneePosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_RIGHT_KNEE, rKneePosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_FOOT, lFootPosition); g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_RIGHT_FOOT, rFootPosition); // Read Joint Orientations XnSkeletonJointOrientation torsoOrientation, lShoulderOrientation, rShoulderOrientation, lHipOrientation, rHipOrientation; XnSkeletonJointOrientation lWristOrientation, rWristOrientation, lElbowOrientation, rElbowOrientation; XnSkeletonJointOrientation headOrientation, neckOrientation; XnSkeletonJointOrientation lKneeOrientation, rKneeOrientation, lFootOrientation, rFootOrientation; g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_TORSO, torsoOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_HEAD, headOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_NECK, neckOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_LEFT_SHOULDER, lShoulderOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_RIGHT_SHOULDER, rShoulderOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_LEFT_HIP, lHipOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_RIGHT_HIP, rHipOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_LEFT_ELBOW, lElbowOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_RIGHT_ELBOW, rElbowOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_LEFT_HAND, lWristOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_RIGHT_HAND, rWristOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_LEFT_KNEE, lKneeOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_RIGHT_KNEE, rKneeOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_LEFT_FOOT, lFootOrientation); g_UserGenerator.GetSkeletonCap().GetSkeletonJointOrientation(aUsers[i], XN_SKEL_RIGHT_FOOT, rFootOrientation); XnFloat* m = torsoOrientation.orientation.elements; KDL::Rotation torsoO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = lShoulderOrientation.orientation.elements; KDL::Rotation lShouldO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = rShoulderOrientation.orientation.elements; KDL::Rotation rShouldO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = lHipOrientation.orientation.elements; KDL::Rotation lHipO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = rHipOrientation.orientation.elements; KDL::Rotation rHipO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = headOrientation.orientation.elements; KDL::Rotation headO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = neckOrientation.orientation.elements; KDL::Rotation neckO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = lElbowOrientation.orientation.elements; KDL::Rotation lElbowO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = rElbowOrientation.orientation.elements; KDL::Rotation rElbowO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = lWristOrientation.orientation.elements; KDL::Rotation lWristO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = rWristOrientation.orientation.elements; KDL::Rotation rWristO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = lKneeOrientation.orientation.elements; KDL::Rotation lKneeO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = rKneeOrientation.orientation.elements; KDL::Rotation rKneeO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = lFootOrientation.orientation.elements; KDL::Rotation lFootO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); m = rFootOrientation.orientation.elements; KDL::Rotation rFootO(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); double qx = 0.0, qy = 0.0, qz = 0.0, qw = 0.0; // Get Points in 3D space XnPoint3D torso = torsoPosition.position; XnPoint3D lShould = lShoulderPosition.position; XnPoint3D rShould = rShoulderPosition.position; XnPoint3D lElbow = lElbowPosition.position; XnPoint3D rElbow = rElbowPosition.position; XnPoint3D lWrist = lWristPosition.position; XnPoint3D rWrist = rWristPosition.position; XnPoint3D neck = neckPosition.position; XnPoint3D head = headPosition.position; XnPoint3D lHip = lHipPosition.position; XnPoint3D rHip = rHipPosition.position; XnPoint3D lKnee = lKneePosition.position; XnPoint3D rKnee = rKneePosition.position; XnPoint3D lFoot = lFootPosition.position; XnPoint3D rFoot = rFootPosition.position; // ---------- ARM CONTROLLER HACK ------------------ // Calculate arm length of user double lenL = calc3DDist( lShould, lElbow ) + calc3DDist( lElbow, lWrist ); double lenR = calc3DDist( rShould, rElbow ) + calc3DDist( rElbow, rWrist ); double distL = calc3DDist(lShould, lWrist); double distR = calc3DDist(rShould, rWrist); // Calculate positions prlite_kinematics::SphereCoordinate lCoord; prlite_kinematics::SphereCoordinate rCoord; lCoord.radius = 35 * (distL / lenL); rCoord.radius = 35 * (distR / lenR); lCoord.theta = -atan2(lShould.X - lWrist.X, lShould.Z - lWrist.Z); rCoord.theta = -atan2(rShould.X - rWrist.X, rShould.Z - rWrist.Z); if(lCoord.theta > 1.0) lCoord.theta = 1.0; if(lCoord.theta < -1.0) lCoord.theta = -1.0; if(rCoord.theta > 1.0) rCoord.theta = 1.0; if(rCoord.theta < -1.0) rCoord.theta = -1.0; lCoord.phi = -atan2(lShould.Y - lWrist.Y, lShould.X - lWrist.X); rCoord.phi = -atan2(rShould.Y - rWrist.Y, rShould.X - rWrist.X); if(lCoord.phi > 1.25) lCoord.phi = 1.25; if(lCoord.phi < -0.33) lCoord.phi = -0.33; if(rCoord.phi > 1.2) rCoord.phi = 1.25; if(rCoord.phi < -0.33) rCoord.phi = -0.33; ROS_INFO("User %d: Left (%lf,%lf,%lf), Right (%lf,%lf,%lf)", i, lCoord.radius, lCoord.theta, lCoord.phi, rCoord.radius, rCoord.theta, rCoord.phi); // Publish to arms leftArmPublisher.publish(rCoord); rightArmPublisher.publish(lCoord); // ---------- END HACK ----------------- // Publish Transform static tf::TransformBroadcaster br; tf::Transform transform; std::stringstream body_name, neck_name, lshould_name, rshould_name, head_name, relbow_name, lelbow_name, lwrist_name, rwrist_name; std::stringstream lhip_name, rhip_name, lknee_name, rknee_name, lfoot_name, rfoot_name; body_name << "Torso (" << i << ")" << std::ends; neck_name << "Neck (" << i << ")" << std::ends; head_name << "Head (" << i << ")" << std::ends; lshould_name << "Shoulder L (" << i << ")" << std::ends; rshould_name << "Shoulder R (" << i << ")" << std::ends; lelbow_name << "Elbow L (" << i << ")" << std::ends; relbow_name << "Elbow R (" << i << ")" << std::ends; lwrist_name << "Wrist L (" << i << ")" << std::ends; rwrist_name << "Wrist R (" << i << ")" << std::ends; lhip_name << "Hip L (" << i << ")" << std::ends; rhip_name << "Hip R (" << i << ")" << std::ends; lknee_name << "Knee L (" << i << ")" << std::ends; rknee_name << "Knee R (" << i << ")" << std::ends; lfoot_name << "Foot L (" << i << ")" << std::ends; rfoot_name << "Foot R (" << i << ")" << std::ends; // Publish Torso torsoO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(torso.X / ADJUST_VALUE, torso.Y / ADJUST_VALUE, torso.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", body_name.str().c_str())); // Publish Left Shoulder lShouldO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(lShould.X / ADJUST_VALUE, lShould.Y / ADJUST_VALUE, lShould.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", lshould_name.str().c_str())); // Publish Right Shoulder rShouldO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(rShould.X / ADJUST_VALUE, rShould.Y / ADJUST_VALUE, rShould.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", rshould_name.str().c_str())); // Publish Left Elbow lElbowO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(lElbow.X / ADJUST_VALUE, lElbow.Y / ADJUST_VALUE, lElbow.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", lelbow_name.str().c_str())); // Publish Right Elbow rElbowO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(rElbow.X / ADJUST_VALUE, rElbow.Y / ADJUST_VALUE, rElbow.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", relbow_name.str().c_str())); // Publish Left Wrist lWristO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(lWrist.X / ADJUST_VALUE, lWrist.Y / ADJUST_VALUE, lWrist.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", lwrist_name.str().c_str())); // Publish Right Wrist rWristO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(rWrist.X / ADJUST_VALUE, rWrist.Y / ADJUST_VALUE, rWrist.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", rwrist_name.str().c_str())); // Publish Neck neckO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(neck.X / ADJUST_VALUE, neck.Y / ADJUST_VALUE, neck.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", neck_name.str().c_str())); // Publish Head headO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(head.X / ADJUST_VALUE, head.Y / ADJUST_VALUE, head.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", head_name.str().c_str())); // Publish Left Hip lHipO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(lHip.X / ADJUST_VALUE, lHip.Y / ADJUST_VALUE, lHip.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", lhip_name.str().c_str())); // Publish Right Hip rHipO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(rHip.X / ADJUST_VALUE, rHip.Y / ADJUST_VALUE, rHip.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", rhip_name.str().c_str())); // Publish Left Knee lKneeO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(lKnee.X / ADJUST_VALUE, lKnee.Y / ADJUST_VALUE, lKnee.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", lknee_name.str().c_str())); // Publish Right Knee rKneeO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(rKnee.X / ADJUST_VALUE, rKnee.Y / ADJUST_VALUE, rKnee.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", rknee_name.str().c_str())); // Publish Left Foot lFootO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(lFoot.X / ADJUST_VALUE, lFoot.Y / ADJUST_VALUE, lFoot.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", lfoot_name.str().c_str())); // Publish Right Foot rFootO.GetQuaternion(qx, qy, qz, qw); transform.setOrigin(tf::Vector3(rFoot.X / ADJUST_VALUE, rFoot.Y / ADJUST_VALUE, rFoot.Z / ADJUST_VALUE)); transform.setRotation(tf::Quaternion(qx, qy, qz, qw)); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", rfoot_name.str().c_str())); } } ros::spinOnce(); //loop_rate.sleep(); } g_Context.Shutdown(); return 0; }
void matrixCalc(void *outputs) { TML::Matrix out1(outputs, 0); TML::Matrix out2(outputs, 1); TML::Matrix out3(outputs, 2); TML::Matrix out4(outputs, 3); xn::DepthMetaData depthMD; xn::SceneMetaData sceneMD; xn::ImageMetaData imageMD; depth.GetMetaData(depthMD); user.GetUserPixels(0, sceneMD); image.GetMetaData(imageMD); context.WaitNoneUpdateAll(); t_jit_matrix_info tmi; memset(&tmi, 0, sizeof(tmi)); tmi.dimcount = 2; tmi.planecount = 1; tmi.dimstride[0] = 4; tmi.dimstride[1] = depthMD.XRes()*4; int width = tmi.dim[0] = depthMD.XRes(); int height = tmi.dim[1] = depthMD.YRes(); tmi.type = _jit_sym_float32; out1.resizeTo(&tmi); tmi.planecount = 1; tmi.dimstride[0] = 1; tmi.dimstride[1] = depthMD.XRes(); tmi.type = _jit_sym_char; out2.resizeTo(&tmi); tmi.planecount = 4; tmi.dimstride[0] = 4; tmi.dimstride[1] = depthMD.XRes()*4; tmi.type = _jit_sym_char; out3.resizeTo(&tmi); const XnDepthPixel* pDepth = depthMD.Data(); float *depthData = (float*)out1.data(); //Copy depth data int x,y; for (y=0; y<height; y++) { for (x=0; x<width; x++) { depthData[0] = (float)pDepth[0]/powf(2, 15); depthData++; pDepth++; } } //Get the users unsigned char *userData = (unsigned char*)out2.data(); const XnLabel* pLabels = sceneMD.Data(); for (y=0; y<height; y++) { for (x=0; x<width; x++) { userData[0] = pLabels[0]; userData++; pLabels++; } } //Get the colors const XnRGB24Pixel* pPixels = imageMD.RGB24Data(); unsigned char *pixData = (unsigned char*)out3.data(); for (y=0; y<height; y++) { for (x=0; x<width; x++) { pixData[0] = 0; pixData[1] = pPixels[0].nRed; pixData[2] = pPixels[0].nGreen; pixData[3] = pPixels[0].nBlue; pixData+=4; pPixels++; } } //For all the users -- output the joint info... XnUserID aUsers[15]; XnUInt16 nUsers = 15; user.GetUsers(aUsers, nUsers); int rUsers = 0; xn::SkeletonCapability sc = user.GetSkeletonCap(); int i; for (i=0; i<nUsers; i++) { if (user.GetSkeletonCap().IsTracking(aUsers[i])) rUsers++; } tmi.dimcount = 2; tmi.planecount = 3; tmi.dimstride[0] = 3*4; tmi.dimstride[1] = 24*3*4; tmi.dim[0] = 24; tmi.dim[1] = rUsers; tmi.type = _jit_sym_float32; out4.resizeTo(&tmi); float *sData = (float*)out4.data(); if (rUsers == 0) { int n; for (n=0; n<24; n++) { sData[0] = 0; sData[1] = 0; sData[2] = 0; sData+=3; } } else { for (i=0; i<nUsers; i++) { if (user.GetSkeletonCap().IsTracking(aUsers[i])) { int n; for (n=0; n<24; n++) { XnSkeletonJointPosition jp; user.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], (XnSkeletonJoint)(n+1), jp); sData[0] = (1280 - jp.position.X) / 2560; sData[1] = (1280 - jp.position.Y) / 2560; sData[2] = jp.position.Z * 7.8125 / 10000; // if (n == 0) // { // post("%f %f %f\n", sData[0], sData[1], sData[2]); // } sData+=3; } } } } //post("%i\n", rUsers); }
// this function is called each frame void glutDisplay (void) { if(gScene == NULL) return; gScene->simulate(1.0f/30.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // 射影マトリックス glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(100.0f, (float)glutGet(GLUT_WINDOW_WIDTH)/(float)glutGet(GLUT_WINDOW_HEIGHT), 1.0f, 10000.0f); // 視点の位置 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f); xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; g_DepthGenerator.GetMetaData(depthMD); if (!g_bPause) { // Read next available data g_Context.WaitAndUpdateAll(); } for(int i=0;i<2;i++){ for(int j=0;j<15;j++){ oldjpoint[i][j]=jpoint[i][j]; } } // Process the data g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); CalculateJoint(); head.x=(jpoint[0][0].X); head.y=(jpoint[0][0].Y); head.z=(jpoint[0][0].Z); neck.x=(jpoint[0][1].X); neck.y=(jpoint[0][1].Y); neck.z=(jpoint[0][1].Z); rshoulder.x=(jpoint[0][2].X); rshoulder.y=(jpoint[0][2].Y); rshoulder.z=(jpoint[0][2].Z); relbow.x=(jpoint[0][3].X*2+oldjpoint[0][3].X)/3; relbow.y=(jpoint[0][3].Y*2+oldjpoint[0][3].Y)/3; relbow.z=(jpoint[0][3].Z*2+oldjpoint[0][3].Z)/3; rhand.x=(jpoint[0][4].X*2+oldjpoint[0][4].X)/3; rhand.y=(jpoint[0][4].Y*2+oldjpoint[0][4].Y)/3; rhand.z=(jpoint[0][4].Z*2+oldjpoint[0][4].Z)/3; lshoulder.x=(jpoint[0][5].X*2+oldjpoint[0][5].X)/3; lshoulder.y=(jpoint[0][5].Y*2+oldjpoint[0][5].Y)/3; lshoulder.z=(jpoint[0][5].Z*2+oldjpoint[0][5].Z)/3; lelbow.x=(jpoint[0][6].X*2+oldjpoint[0][6].X)/3; lelbow.y=(jpoint[0][6].Y*2+oldjpoint[0][6].Y)/3; lelbow.z=(jpoint[0][6].Z*2+oldjpoint[0][6].Z)/3; lhand.x=(jpoint[0][7].X*2+oldjpoint[0][7].X)/3; lhand.y=(jpoint[0][7].Y*2+oldjpoint[0][7].Y)/3; lhand.z=(jpoint[0][7].Z*2+oldjpoint[0][7].Z)/3; torso.x=(jpoint[0][8].X*2+oldjpoint[0][8].X)/3; torso.y=(jpoint[0][8].Y*2+oldjpoint[0][8].Y)/3; torso.z=(jpoint[0][8].Z*2+oldjpoint[0][8].Z)/3; rhip.x=(jpoint[0][9].X*2+oldjpoint[0][9].X)/3; rhip.y=(jpoint[0][9].Y*2+oldjpoint[0][9].Y)/3; rhip.z=(jpoint[0][9].Z*2+oldjpoint[0][9].Z)/3; rknee.x=(jpoint[0][10].X*2+oldjpoint[0][10].X)/3; rknee.y=(jpoint[0][10].Y*2+oldjpoint[0][10].Y)/3; rknee.z=(jpoint[0][10].Z*2+oldjpoint[0][10].Z)/3; rfoot.x=(jpoint[0][11].X*2+oldjpoint[0][11].X)/3; rfoot.y=(jpoint[0][11].Y*2+oldjpoint[0][11].Y)/3; rfoot.z=(jpoint[0][11].Z*2+oldjpoint[0][11].Z)/3; lhip.x=(jpoint[0][12].X*2+oldjpoint[0][12].X)/3; lhip.y=(jpoint[0][12].Y*2+oldjpoint[0][12].Y)/3; lhip.z=(jpoint[0][12].Z*2+oldjpoint[0][12].Z)/3; lknee.x=(jpoint[0][13].X*2+oldjpoint[0][13].X)/3; lknee.y=(jpoint[0][13].Y*2+oldjpoint[0][13].Y)/3; lknee.z=(jpoint[0][13].Z*2+oldjpoint[0][13].Z)/3; lfoot.x=(jpoint[0][14].X*2+oldjpoint[0][14].X)/3; lfoot.y=(jpoint[0][14].Y*2+oldjpoint[0][14].Y)/3; lfoot.z=(jpoint[0][14].Z*2+oldjpoint[0][14].Z)/3; printf("%f, %f, %f\n",rightreduction.x, rightreduction.y, rightreduction.z); printf("%f, %f, %f\n",leftreduction.x, leftreduction.y, leftreduction.z); if(jpoint[0][8].X!=0.0&&jpoint[0][8].Y!=0.0&&jpoint[0][8].Z!=0.0){ Head->setGlobalPosition(NxVec3(-head.x+positionx, -head.y+positiony, -head.z+positionz)); Head->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); Neck->setGlobalPosition(NxVec3(-neck.x+positionx, -neck.y+positiony, -neck.z+positionz)); Neck->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightshoulder->setGlobalPosition(NxVec3(-rshoulder.x+positionx, -rshoulder.y+positiony, -rshoulder.z+positionz)); rightshoulder->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightelbow->setGlobalPosition(NxVec3(-relbow.x+positionx, -relbow.y+positiony, -relbow.z+positionz)); rightelbow->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); righthand->setGlobalPosition(NxVec3(-rhand.x+positionx, -rhand.y+positiony, -rhand.z+positionz)); righthand->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftshoulder->setGlobalPosition(NxVec3(-lshoulder.x+positionx, -lshoulder.y+positiony, -lshoulder.z+positionz)); leftshoulder->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftelbow->setGlobalPosition(NxVec3(-lelbow.x+positionx, -lelbow.y+positiony, -lelbow.z+positionz)); leftelbow->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); lefthand->setGlobalPosition(NxVec3(-lhand.x+positionx, -lhand.y+positiony, -lhand.z+positionz)); lefthand->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); Torso->setGlobalPosition(NxVec3(-torso.x+positionx, -torso.y+positiony, -torso.z+positionz)); Torso->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); righthip->setGlobalPosition(NxVec3(-rhip.x+positionx, -rhip.y+positiony, -rhip.z+positionz)); righthip->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightknee->setGlobalPosition(NxVec3(-rknee.x+positionx, -rknee.y+positiony, -rknee.z+positionz)); rightknee->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); rightfoot->setGlobalPosition(NxVec3(-rfoot.x+positionx, -rfoot.y+positiony, -rfoot.z+positionz)); rightfoot->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); lefthip->setGlobalPosition(NxVec3(-lhip.x+positionx, -lhip.y+positiony, -lhip.z+positionz)); lefthip->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftknee->setGlobalPosition(NxVec3(-lknee.x+positionx, -lknee.y+positiony, -lknee.z+positionz)); leftknee->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); leftfoot->setGlobalPosition(NxVec3(-lfoot.x+positionx, -lfoot.y+positiony, -lfoot.z+positionz)); leftfoot->setLinearVelocity(NxVec3(0.0f, 0.0f, 0.0f)); } glPushMatrix(); glBegin(GL_POLYGON); glColor4f(0.2f,1.2f,0.1f,1.0f); // 地面の色 glVertex3f( 10000.0f,-1.0f, 10000.0f); glVertex3f( 10000.0f,-1.0f,-10000.0f); glVertex3f(-10000.0f,-1.0f,-10000.0f); glVertex3f(-10000.0f,-1.0f, 10000.0f); glEnd(); glPopMatrix(); //地平線の描画 glPushMatrix(); glColor4f(1.0f, 1.0f, 1.0f,1.0f); glLineWidth(1); glBegin(GL_LINES); for(int i=-10000; i< 10000; i+=500) { glVertex3f( i , -0.2f,-10000 ); glVertex3f( i , -0.2f, 10000 ); glVertex3f(-10000, -0.2f, i ); glVertex3f( 10000, -0.2f, i ); } glEnd(); glPopMatrix(); switch(gameflag){ case 0: // スタート画面 glViewport( 0, 0, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT) ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0.0f, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT), 0.0f, 0.0f, 1.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glPushMatrix(); glColor3d(1.0, 1.0, 0.0); glRasterPos3d(GL_WIN_SIZE_X/2-80, GL_WIN_SIZE_Y/2, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,"Push 's' -> START"); glPopMatrix(); printf("Push 's' -> START\n"); break; case 1: // ゲーム終了時 glViewport( 0, 0, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT) ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0.0f, (float)glutGet(GLUT_WINDOW_WIDTH),(float)glutGet(GLUT_WINDOW_HEIGHT), 0.0f, 0.0f, 1.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glPushMatrix(); glColor3d(0.0, 0.0, 1.0); glRasterPos3d(GL_WIN_SIZE_X/2-60, GL_WIN_SIZE_Y/2+20, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,"GAME OVER"); glPopMatrix(); glPushMatrix(); glColor3d(1.0, 1.0, 0.0); glRasterPos3d(GL_WIN_SIZE_X/2-65, GL_WIN_SIZE_Y/2, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,gametime); glPopMatrix(); glPushMatrix(); glColor3d(1.0, 0.0, 0.0); glRasterPos3d(GL_WIN_SIZE_X/2-90, GL_WIN_SIZE_Y/2-20, 0.0); drawBitmapString(GLUT_BITMAP_HELVETICA_18,"Push 'r' -> RESTART"); glPopMatrix(); printf("GAME OVER\ntime -> %f\n",(double)(t2 - t1) / CLOCKS_PER_SEC); break; case 2: // ゲーム中の画面 glEnable(GL_DEPTH_TEST); // アクターの描画 int nbActors = gScene->getNbActors(); NxActor** actors = gScene->getActors(); while(nbActors--) { NxActor* actor = *actors++; if(!actor->userData) continue; glPushMatrix(); glEnable(GL_LIGHTING); float glMat[16]; actor->getGlobalPose().getColumnMajor44(glMat); glMultMatrixf(glMat); myData* mydata = (myData*)actor->userData; int shape = mydata->shape; int color = mydata->color; switch(shape){ case 1: glColor4f(0.0f,0.0f,1.0f,1.0f); if(mydata->houkou==0){ link(pole[0], pole[4]); } else if(mydata->houkou==1){ tlink(3000.0,2000.0,6000.0,-3000.0,2000.0,6000.0); tlink(-3000.0,2000.0,4000.0,-3000.0,2000.0,6000.0); } else if(mydata->houkou==2){ ylink(3000.0,2000.0,4000.0,-3000.0,2000.0,4000.0); ylink(3000.0,2000.0,6000.0,-3000.0,2000.0,6000.0); } else if(mydata->houkou==3){ // パネル glColor4f(0.0f,1.0f,1.0f,1.0f); cuboid(mydata->width*2,mydata->length*2, mydata->height*2); } else if(mydata->houkou==4){ } break; case 2: if(mydata->ball == 1){ glColor4f(1.0f,0.0f,0.0f,1.0f); // ボールの色 glutSolidSphere(mydata->size,15,15); } else if(mydata->ball == 0){ glColor4f(1.0f,1.0f,0.0f,1.0f); glutSolidSphere(mydata->size,15,15); } break; case 4: glColor4f(1.0f,0.0f,0.0f,1.0f); cylinder(50, 100, 50); break; } glDisable(GL_LIGHTING); glPopMatrix(); } glDisable(GL_DEPTH_TEST); t2 = clock(); balltimer2 = clock(); btime=(double)(balltimer2 - balltimer1) / CLOCKS_PER_SEC; gtime=(double)(t2 - t1) / CLOCKS_PER_SEC; printf("%f\n",gtime); if(gtime<=10.0){ balldire=2.0; ballspeed=250.0; } else if(gtime<=20.0){ balldire=1.5; ballspeed=300.0; } else if(gtime<=30.0){ balldire=1.0; ballspeed=350.0; } else if(gtime<=40.0){ balldire=0.5; ballspeed=400.0; } break; } // 描画の終了 gScene->flushStream(); gScene->fetchResults(NX_RIGID_BODY_FINISHED, true); glutSwapBuffers(); }
// this function is called each frame void glutDisplay (void) { static ros::Duration pub_interval(1.0/pub_rate_temp_); static ros::Time last_pub(0.0); static int num_skipped = 0; num_skipped++; ros::Time now_time = ros::Time::now(); // Update stuff from OpenNI XnStatus status = g_Context.WaitAndUpdateAll(); if( status != XN_STATUS_OK ){ ROS_ERROR_STREAM("Updating context failed: " << status); return; } xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; xn::ImageMetaData imageMD; g_DepthGenerator.GetMetaData(depthMD); g_UserGenerator.GetUserPixels(0, sceneMD); //g_ImageGenerator.GetMetaData(imageMD); cv::Mat depth_image; getDepthImage(depthMD, depth_image); double minval, maxval; cv::minMaxLoc(depth_image, &minval, &maxval); // Convert user pixels to an OpenCV image cv::Mat label_image; getUserLabelImage(sceneMD, label_image); sensor_msgs::PointCloud cloud; cloud.header.stamp = now_time; cloud.header.frame_id = frame_id_; cloud.channels.resize(1); cloud.channels[0].name = "intensity"; // Convert users into better format XnUserID aUsers[15]; XnUInt16 nUsers = 15; g_UserGenerator.GetUsers(aUsers, nUsers); cv::Mat this_mask; XnPoint3D center_mass; double pixel_area; cv::Scalar s; vector<user> users; if( g_bhasCal && now_time-last_pub > pub_interval ) { bool has_lock = false; last_pub = now_time; ROS_DEBUG_STREAM(num_skipped << " refreshes inbetween publishing"); num_skipped = 0; cv::imshow( "Tracked user" , user_cal_.getImage() ); cv::imshow( "Original calibration", original_cal_.getImage() ); cv::Mat rgb, rgb_mask; // getRGB(rgb, rgb_mask); rgb = getRGB(imageMD); for (unsigned int i = 0; i < nUsers; i++) { user this_user; this_user.uid = aUsers[i]; // Bitwise mask of pixels belonging to this user this_mask = (label_image == this_user.uid); this_user.numpixels = cv::countNonZero(this_mask); // Compare this user to the target this_user.pc.init(rgb, this_mask); double similarity = this_user.pc.compare(user_cal_ ); double sim_to_orig = this_user.pc.compare(original_cal_); this_user.similarity = similarity; this_user.similarity_to_orig = sim_to_orig; /* ros::Time t1 = ros::Time::now(); double emd = this_user.pc.getEMD (user_cal_ ); double emd_to_orig = this_user.pc.getEMD (original_cal_); ros::Duration d = (ros::Time::now() - t1); ROS_INFO_STREAM("EMD took " << (d.sec) );*/ if( now_time > save_timer_ ){ ROS_WARN_STREAM("[bk_skeletal_tracker] Say Cheezbuger"); save_timer_ = now_time + ros::Duration(60*60*24); g_bSaveFrame = true; } if( g_bSaveFrame ) { time_t t = ros::WallTime::now().sec; char buf[1024] = ""; struct tm* tms = localtime(&t); strftime(buf, 1024, "%Y-%m-%d-%H-%M-%S", tms); std::string prefix = ( boost::format("capture_%s_user%d") % buf % this_user.uid ).str(); cv::Mat rgb_masked; rgb.copyTo(rgb_masked, this_mask); saveMat(rgb_masked , prefix + "_rgb" ); saveMat(this_mask , prefix + "_mask" ); saveMat(this_user.pc.getHist() , prefix + "_hist" ); saveMat(this_user.pc.getImage(), prefix + "_himg" ); } // Mean depth this_user.meandepth = cv::mean(depth_image, this_mask)[0]; this_user.silhouette_area = 0; // Find the area of the silhouette in cartesian space for( int i=0; i<this_mask.rows; i++) { for( int j=0; j<this_mask.cols; j++ ) { if( this_mask.at<uchar>(i,j) != 0 ) { pixel_area = cam_model_.getDeltaX(1, depth_image.at<float>(i,j)) * cam_model_.getDeltaY(1, depth_image.at<float>(i,j)); this_user.silhouette_area += pixel_area; } } } // Find the center in 3D g_UserGenerator.GetCoM(this_user.uid, center_mass); this_user.center3d.point = vecToPt(center_mass); ROS_DEBUG_STREAM(boost::format("User %d: area %.3fm^2, mean depth %.3fm") % (unsigned int)this_user.uid % this_user.silhouette_area % this_user.meandepth); // Screen out unlikely users based on area if( this_user.meandepth > min_dist_ && this_user.silhouette_area < max_area_ && this_user.silhouette_area > min_area_ ) { ROS_INFO_STREAM(boost::format("User %d new: %.0f --- orig: %.0f") % ((int)this_user.uid) % (100*similarity) % (100*sim_to_orig) ); /*ROS_INFO_STREAM(boost::format("EMD new: %.2f --- orig: %.2f") % (emd) % (emd_to_orig) );*/ if( similarity > PersonCal::getMatchThresh() ) { user_cal_.update(rgb, this_mask); } else{ if( sim_to_orig > PersonCal::getMatchThresh() ) { ROS_WARN_STREAM("Reset to original calibration"); user_cal_ = original_cal_; } } std::stringstream window_name; window_name << "user_" << ((int)this_user.uid); cv::imshow(window_name.str(), this_user.pc.getImage()); ROS_DEBUG("Accepted user"); users.push_back(this_user); // Visualization geometry_msgs::Point32 p; p.x = this_user.center3d.point.x; p.y = this_user.center3d.point.y; p.z = this_user.center3d.point.z; cloud.points.push_back(p); cloud.channels[0].values.push_back(0.0f); } } // Try to associate the tracker with a user if( latest_tracker_.first != "" ) { // Transform the tracker to this time. Note that the pos time is updated but not the restamp. tf::Point pt; tf::pointMsgToTF(latest_tracker_.second.pos.pos, pt); tf::Stamped<tf::Point> loc(pt, latest_tracker_.second.pos.header.stamp, latest_tracker_.second.pos.header.frame_id); try { tfl_->transformPoint(frame_id_, now_time-ros::Duration(.1), loc, latest_tracker_.second.pos.header.frame_id, loc); latest_tracker_.second.pos.header.stamp = now_time; latest_tracker_.second.pos.header.frame_id = frame_id_; latest_tracker_.second.pos.pos.x = loc[0]; latest_tracker_.second.pos.pos.y = loc[1]; latest_tracker_.second.pos.pos.z = loc[2]; } catch (tf::TransformException& ex) { ROS_ERROR("(finding) Could not transform person to this time"); } people_msgs::PositionMeasurement pos; if( users.size() > 0 ) { std::stringstream users_ss; users_ss << boost::format("(finding) Tracker \"%s\" = (%.2f,%.2f) Users = ") % latest_tracker_.first % latest_tracker_.second.pos.pos.x % latest_tracker_.second.pos.pos.y; // Find the closest user to the tracker user closest; closest.distance = BIGDIST_M; foreach(user u, users) { u.distance = pow(latest_tracker_.second.pos.pos.x - u.center3d.point.x, 2.0) + pow(latest_tracker_.second.pos.pos.y - u.center3d.point.y, 2.0); users_ss << boost::format("(%.2f,%.2f), ") % u.center3d.point.x % u.center3d.point.y; if( u.distance < closest.distance ) { if( u.similarity > PersonCal::getMatchThresh() ) { closest = u; } else { ROS_WARN_STREAM("Ignored close user not matching (" << u.uid << ")"); } } }//foreach