ITADN

[kdimensionalTree] Problems nearestNeighbour vs nearestNeighbor

#118Openfightforlife 创建于 2025-05-29
bugWorkingUnconfirmed
F
fightforlifecommented
Hi there, I am currently trying the use the kdtree to find the nearest neighbour in a cloud of 2dim points. But I encountered some problems: ``` lib/kdimensionalTree/src/kDimensionalTree.h: In instantiation of 'SimpleVector<T>& KDimensionalTree<T>::nearestNeighbour(SimpleVector<T>&) [with T = double]': src/main.cpp:232:69: required from here lib/kdimensionalTree/src/kDimensionalTree.h:190:27: error: no matching function for call to 'KDimensionalTree<double>::nearestNeighbour(KDimensionalTree<double>::KDimensionalNode*&, SimpleVector<double>&, int)' KDimensionalNode* nearest = nearestNeighbour(root, point, 0); ^~~~~~~ lib/kdimensionalTree/src/kDimensionalTree.h:189:22: note: candidate: 'SimpleVector<T>& KDimensionalTree<T>::nearestNeighbour(SimpleVector<T>&) [with T = double]' SimpleVector<T>& nearestNeighbour(SimpleVector<T>& point){ ^~~~~~~~~~~~~~~~ lib/kdimensionalTree/src/kDimensionalTree.h:189:22: note: candidate expects 1 argument, 3 provided lib/kdimensionalTree/src/kDimensionalTree.h:191:24: error: cannot bind non-const lvalue reference of type 'SimpleVector<double>&' to an rvalue of type 'SimpleVector<double>' return nearest ? nearest->point : SimpleVector<T>(); ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *** [.pio/build/lilygo-t-display-s3/src/main.cpp.o] Error 1 ``` The first issue seems to be a naming problem: nearestNeigh**bour** (KDtree) vs nearestNeigh**bor** (KDimensionalNode) Function The second problem seems to be the return of `SimpleVector<T>();` in an `SimpleVector<T>& ` Function. (in case of empty nearest) I fixed both by changing the function to the following: ``` SimpleVector<T> nearestNeighbour(SimpleVector<T>& point){ KDimensionalNode* nearest = nearestNeighbor(root, point, 0); return nearest ? nearest->point : SimpleVector<T>(); } ``` The programm is now building and starting correctly! But I still have problems with unhandled exceptions in some cases. I still have to figure out what is happening there. ``` Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled. Core 1 register dump: PC : 0x420076b8 PS : 0x00060e30 A0 : 0x8200778b A1 : 0x3fceba30 A2 : 0x00000000 A3 : 0x3fcebe18 A4 : 0x00000000 A5 : 0x00000000 A6 : 0x00000000 A7 : 0x00000002 A8 : 0x82007703 A9 : 0x3fc9a3a8 A10 : 0x3fcaee8c A11 : 0x3fcaee8c A12 : 0x81f36840 A13 : 0x3fd277e8 A14 : 0x00000000 A15 : 0x000003fa SAR : 0x00000014 EXCCAUSE: 0x0000001c EXCVADDR: 0x00000004 LBEG : 0x40054bf0 LEND : 0x40054c0f LCOUNT : 0x00000000 Backtrace: 0x420076b5:0x3fceba30 0x42007788:0x3fceba60 0x4200776a:0x3fcebaa0 0x4200776a:0x3fcebae0 0x4200776a:0x3fcebb20 0x4200776a:0x3fcebb60 0x4200776a:0x3fcebba0 0x4200776a:0x3fcebbe0 0x4200776a:0x3fcebc20 0x4200776a:0x3fcebc60 0x4200776a:0x3fcebca0 0x4200776a:0x3fcebce0 0x4200776a:0x3fcebd20 0x4200776a:0x3fcebd60 0x4200776a:0x3fcebda0 0x42007ca3:0x3fcebde0 0x42015e7d:0x3fcebf70 #0 0x420076b5 in SimpleVector<double>::operator[](unsigned int) const at lib/SimpleVector/src/SimpleVector.h:266 (inlined by) KDimensionalTree<double>::distance(SimpleVector<double> const&, SimpleVector<double> const&) at lib/kdimensionalTree/src/kDimensionalTree.h:153 #1 0x42007788 in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:107 #2 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #3 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #4 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #5 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #6 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #7 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #8 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #9 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #10 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #11 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #12 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #13 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #14 0x4200776a in KDimensionalTree<double>::nearestNeighbor(KDimensionalTree<double>::KDimensionalNode*, SimpleVector<double> const&, int) at lib/kdimensionalTree/src/kDimensionalTree.h:102 #15 0x42007ca3 in KDimensionalTree<double>::nearestNeighbour(SimpleVector<double>&) at lib/kdimensionalTree/src/kDimensionalTree.h:190 (inlined by) loop() at src/main.cpp:232 #16 0x42015e7d in loopTask(void*) at /home/fred/.platformio/packages/framework-arduinoespressif32/cores/esp32/main.cpp:50 ``` I can reproduce this with the following code. the nearestNeighbour Function results in the exception. Everyting (lat, long) are doubles. ``` KDimensionalTree<double> radarList(2); // Fetch some data via http and save in a json document, convet to array JsonArray pois = doc["pois"]; for (JsonVariant v : pois) { radarList.insert({v["lat"].as<double>(),v["lng"].as<double>()}); } SimpleVector<double> searchPoint = {status.curLatitude, status.curLongitude}; SimpleVector<double> test = radarList.nearestNeighbour(searchPoint); Serial.println(gps.distanceBetween(status.curLatitude, status.curLongitude, test.get(0), test.get(1))); ```
2 条评论