[kdimensionalTree] Problems nearestNeighbour vs nearestNeighbor
bugWorkingUnconfirmed
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 条评论