मुझे दो बिंदु बादल मिले। उनका मिलान करने के लिए मैं आईसीपी के साथ पंजीकरण करने का प्रयास करता हूं। बिंदु बादल सुपर समान नहीं हैं, लेकिन मैं कम से कम उन्हें एक साथ बहुत करीब लाना चाहता हूं।

पीसीएल लाइब्रेरी से IterativeClosestPoint का उपयोग करते समय यह तब काम करता है जब मैं अपने पॉइंटक्लाउड A को स्रोत के रूप में और पॉइंटक्लाउड B को लक्ष्य के रूप में उपयोग करता हूं। लेकिन जब मैं स्रोत के रूप में B और लक्ष्य के रूप में A का उपयोग करता हूं तो यह काम नहीं करता है। बाद के मामले में यह मेरे दोनों बादलों के बीच की दूरी को भी बढ़ा देता है।

क्या कोई जानता है कि मुझसे क्या गलती हो रही है? स्रोत/लक्ष्य बदलते समय प्रदर्शन में अंतर क्यों होना चाहिए?

यह मेरा कोड है:

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;  
icp.setInputSource(A);
icp.setInputTarget(B);
icp.setMaximumIterations(50);
icp.setTransformationEpsilon(1e-8);
icp.setEuclideanFitnessEpsilon(1);
icp.setMaxCorrespondenceDistance(0.5); // 50cm
icp.setRANSACOutlierRejectionThreshold(0.03);
icp.align(aligned_model_cloud);

मैं किसी भी विचार और इनपुट के लिए खुश हूं।

संपादित करें: ये रहे दो बादल क्लाउड A क्लाउड B

अपडेट करें: मैंने स्रोत के रूप में Cloud A और लक्ष्य के रूप में Cloud A* का उपयोग करके अपने कोड की कोशिश की। जहाँ Cloud A*, Cloud A की एक प्रति है, जिसका केवल x-अक्ष पर अनुवाद है। मैंने Cloud B के साथ भी यही प्रयोग किया और दोनों सफलतापूर्वक icp में परिवर्तित हो गए।

लेकिन जैसे ही मैं स्रोत के रूप में Cloud B और लक्ष्य के रूप में Cloud A का उपयोग करता हूं, यह अब काम नहीं करता है और क्लाउड को केवल एक छोटा सा (यहां तक ​​​​कि गलत दिशा में) ले जाने के बाद अभिसरण करता है। मैंने अभिसरण मानदंड की जाँच की और पाया कि यह CONVERGENCE_CRITERIA_REL_MSE है (जब transfromationEpslion लगभग शून्य है)। मैंने सापेक्ष MSE को कम करने की कोशिश की icp.getConvergeCriteria()->setRelativeMSE(1e-15) लेकिन यह सफल नहीं हुआ। कनवर्जिंग के बाद रिलेटिवएमएसई के मूल्य की जांच करते समय मुझे कुछ ऐसा मिलता है: -124034642 जिसका मेरे लिए कोई मतलब नहीं है।

अपडेट2: मैंने पहले बिना आईसीपी के बादलों को एक साथ काफी पास ले जाया। ऐसा करते समय आईसीपी ठीक काम करता है।

अपडेट3: मैं पहले अनुमान और बाद में आईसीपी के लिए एफपीएफएच कर रहा हूं। ऐसा करना भी काम करता है।

0
progNewbie 13 पद 2019, 14:17

1 उत्तर

सबसे बढ़िया उत्तर

यह प्रश्न पुराना है और ओपी को पहले ही एक समाधान मिल गया है, लेकिन मैं सिर्फ ओपी के मामले में समझाऊंगा और किसी को यह उपयोगी लगेगा।

सबसे पहले, आईसीपी दो बादलों के बीच पत्राचार का अनुमान लगाकर काम करता है और फिर उनके बीच की समग्र दूरी को कम करता है। और ICP निकटतम बिंदु डेटा संघ (इसलिए नाम Iterative निकटतम बिंदु) का उपयोग करके पत्राचार का अनुमान लगाता है।

और जैसा कि आप जानते हैं, निकटतम पड़ोसी ग्राफ निर्देशित है। कहने का तात्पर्य यह है कि यदि बिंदु A का निकटतम पड़ोसी बिंदु B है, तो बिंदु B का निकटतम पड़ोसी नहीं हो सकता है क्योंकि C, A की तुलना में B के अधिक निकट है!

यहां छवि विवरण दर्ज करें
अब जबकि ICP दो बादलों के बीच पत्राचार का अनुमान लगाने के लिए निकटतम बिंदु डेटा संघ का उपयोग करता है, A को स्रोत के रूप में निर्दिष्ट करने पर B को निर्दिष्ट करने से भिन्न पत्राचार सेट प्राप्त होगा। यह आपके द्वारा देखे गए अंतरों की व्याख्या करता है।

आमतौर पर अंतर छोटा होता है और आप ICP के बाद नोटिस नहीं कर सकते हैं। लेकिन आपके मामले में, मैंने पाया कि आपके द्वारा प्रदान किए गए दो बादल बहुत अलग हैं (एक अतिरिक्त बड़ा है और दूसरा छोटा है) और संबंध बहुत विषम हो गया है।

यदि आप यह सुनिश्चित करना चाहते हैं कि परिणाम सममित है, तो आप दोनों क्लाउड से निकटतम बिंदु पत्राचार करने के लिए डेटा एसोसिएशन चरण (पीसीएल ऐसा करने का विकल्प प्रदान कर सकते हैं) को बदल सकते हैं (और यह क्लासिक आईसीपी का सिर्फ एक प्रकार है। के लिए अधिक जानकारी के लिए आप मेरा अन्य उत्तर देख सकते हैं।

1
Jing Zhao 6 अप्रैल 2020, 15:23