This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IWR6843AOPEVM: Differences observed from tracking a fall event when the orientation is not the same

Part Number: IWR6843AOPEVM

Hi,

Our company has tested multiple configurations over the course of the last few months with the People Counting 3D demo (wall-mounted). Nonetheless, we consistently see a difference in the measured position that is output from the sensor's tracking module when comparing the true position vs the measured one when facing towards the sensor and facing away from the sensor.

We believe the error in the tracking should come from the Kalman Filter prediction. However, the measured velocity seems to be within the same range when facing towards or away from the sensor, yet the output position shows different behaviors.

Question:

1. What is causing major differences in the tracker behavior when falling towards and away from the sensor
2. How can we tune the sensor configuration in order to have a precise and exact measurement in the tracking position when falling in all directions/orientations

References:

[1] Detection Layer Tuning Guide:                                           https://dev.ti.com/tirex/explore/node?node=AEdNr6XV-uJkInkTP0HOAw__VLyFKFf__LATEST
[2] Tracker Layer Tuning Guide:                                               https://dev.ti.com/tirex/explore/node?node=AHZY4H1u04B21l9zTRElvQ__VLyFKFf__LATEST
[3] Tracking radar targets with multiple reflective points:     https://dev.ti.com/tirex/explore/node?node=AM.QUGqhwdBqRvUeI98JuA__VLyFKFf__LATEST

           

Test Setup:

Human subject. Male. 1.75m. standard size.
The subject is standing and falling either facing towards or away from the sensor. Fall area is around 3-4m away from the sensor, on the same axis, as shown below:

Test Results:

1. 3D People Counting default configuration

The first test sequence has been done with the default configuration that comes with the 3D People Counting demo (wall-mounted). We decided to modify the following parameters as it would simplify the test setup and should have no impact on the test results:

frameCfg --> 100 ms refresh rate instead of 55ms
stateparam, boundaryboxes, allocation --> shouldn't have any impact
trackingCfg --> limited to 1 target

Complete configuration:

"dfeDataOutputMode": "1",
"channelCfg": "15 7 0",
"adcCfg": "2 1",
"adcbufCfg": "-1 0 1 1 1",
"lowPower": "0 0",
"profileCfg": "0 60.75 30.00 25.00 59.10 394758 0 54.71 1 96 2950.00 2 1 36",
"chirpCfg0": "0 0 0 0 0 0 0 1",
"chirpCfg1": "1 1 0 0 0 0 0 2",
"chirpCfg2": "2 2 0 0 0 0 0 4",
"frameCfg": "0 2 96 0 100 1 0",
"dynamicRACfarCfg": "-1 4 4 2 2 8 12 4 12 5.00 8.00 0.40 1 1",
"staticRACfarCfg": "-1 6 2 2 2 8 8 6 4 8.00 15.00 0.30 0 0",
"dynamicRangeAngleCfg": "-1 0.75 0.0010 1 0",
"dynamic2DAngleCfg": "-1 3.0 0.0300 1 0 1 0.30 0.85 8.00",
"staticRangeAngleCfg": "-1 0 8 8",
"antGeometry0": "-1 -1 0 0 -3 -3 -2 -2 -1 -1 0 0",
"antGeometry1": "-1 0 -1 0 -3 -2 -3 -2 -3 -2 -3 -2",
"antPhaseRot": "1 -1 1 -1 1 -1 1 -1 1 -1 1 -1",
"fovCfg": "-1 70.0 70.0",
"compRangeBiasAndRxChanPhase": "0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0",
"staticBoundaryBox": "-3.5 1.78 1.5 6.50 -2.40 1",
"boundaryBox": "-3.5 1.78 1.5 6.50 -2.40 1",
"gatingParam": "3.3 2 2 2 10",
"stateParam": "9 3 600 600 8 6000",
"allocationParam": "19 43 0.01 20 1.5 15",
"maxAcceleration": "0.1 0.1 0.1",
"trackingCfg": "1 2 800 1 46 96 100",
"presenceBoundaryBox": "-4 4 0.5 6 0 3",
"sensorStop": "0",
"flushCfg": "0",
"sensorStart": "0",
"sensorPosition": "0 0 0"

The following graphs show a clear distinction between the falling event when occurring towards the sensor and away from the sensor. When facing towards the sensor, all results (12/12) have the same outcome: the centroid's height goes from 1.0m to under 0m. The "landing" height (after the fall) is always between the range of [-0.2m ; 0m], which is really precise. When facing AWAY from the sensor, most of the results show that the falling event has not been tracked properly, where the "landing" Z final positions are between the range of [-0.35m ; 1.6m]

When switching the mattress so it becomes perpendicular to the sensor (rotating it of 90 degrees), the results are the same as facing TOWARDS the radar, which makes us believe this has something to do with the range detection and maybe the Doppler effect. When looking at the Kalman filter formula [3], we know that the centroid's velocity is taken into account:

We suspected at first that falling in a different direction could cause a different measurement on the radial velocities, which would cause a different computation for the centroid's Z speed, which would then cause a difference in the tracking computation and outcome. However,  the velocity in the Z axis seems the be the same, as shown below:

2. Personalized configuration

After reading most of the documentation (see all references), we tried to tune the following parameters:

a. profileCfg

We tried to come with a profileCfg that would offer (theoretically) a better range resolution and a better velocity resolution. As shown, in the previous graph, the maximum velocity from a falling event doesn't go over 2 [m/s]

Name Start Freq slope [MHz/us] digOutSRate num ADC Max Unambiguous Range Max Snr Range Range Res sweep_bandwidth total_bandwidth Max Unambiguous Velocity Velocity Resolution
Personalized 60 36.94 2052.27 128 7.50 16.47 0.0651 2303.95 2684.43 5.14 0.081
Default People Counting 60.75 54.71 2950 96 7.28 16.38 0.0842 1780.39 3148.14 4.51 0.093

b. dynamicRACfarCfg

Based on [2], the dynamicCFAR Range Threshold could impact the centroid's velocity computation if the threshold discards some points that have valuable measured info on the radial velocity. We tried to lower the range and elevation thresholds in order to include more points to the tracked target

"dynamicRACfarCfg" : "-1 4 4 2 2 8 12 4 8 4.00 6.00 0.40 1 1",

c. dynamic2DAngleCfg

Better resolution within the elevation axis

"-1 2 0.0300 1 0 1 0.30 0.85 8.00",

d. maxAcceleration

As mentioned in [2], the higher the max acceleration is set, the more the prediction relies on the measured events instead of the prediction

"maxAcceleration" : "0.5 0.5 0.5",

e. trackingCfg

Maximum velocity of the tracker is up and the velocity resolution has been set to the minimum

"trackingCfg" : "1 2 800 1 52 1 100",

Personalized Configuration:

"dfeDataOutputMode" : "1",
"channelCfg" : "15 7 0",
"adcCfg" : "2 1",
"adcbufCfg" : "-1 0 1 1 1",
"lowPower" : "0 0",
"profileCfg" : "0 60.00 30.00 10.3 74.17 592137 0 36.94 1 128 2052.27 2 1 36",
"chirpCfg0" : "0 0 0 0 0 0 0 1",
"chirpCfg1" : "1 1 0 0 0 0 0 2",
"chirpCfg2" : "2 2 0 0 0 0 0 4",
"frameCfg" : "0 2 96 0 100 1 0",
"dynamicRACfarCfg" : "-1 4 4 2 2 8 12 4 8 4.00 6.00 0.40 1 1",
"staticRACfarCfg" : "-1 6 2 2 2 8 8 6 4 8.00 15.00 0.30 0 0",
"dynamicRangeAngleCfg" : "-1 0.75 0.0010 1 0",
"dynamic2DAngleCfg" : "-1 2 0.0300 1 0 1 0.30 0.85 8.00",
"staticRangeAngleCfg" : "-1 0 8 8",
"antGeometry0" : "-1 -1 0 0 -3 -3 -2 -2 -1 -1 0 0",
"antGeometry1" : "-1 0 -1 0 -3 -2 -3 -2 -3 -2 -3 -2",
"antPhaseRot" : "1 -1 1 -1 1 -1 1 -1 1 -1 1 -1",
"fovCfg" : "-1 60.0 60.0",
"compRangeBiasAndRxChanPhase" : "0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0",
"staticBoundaryBox" : "-3.5 1.78 1.5 6.50 -2.40 1",
"boundaryBox" : "-3.5 1.78 1.5 6.50 -2.40 1",
"gatingParam" : "3.3 2 2 2 10",
"stateParam" : "9 3 600 600 8 6000",
"allocationParam" : "19 43 0.01 20 1.5 15",
"maxAcceleration" : "0.5 0.5 0.5",
"trackingCfg" : "1 2 800 3 52 1 100",
"presenceBoundaryBox" : "-4 4 0.5 6 0 3",
"sensorStop" : "0",
"flushCfg" : "0",
"sensorStart" : "0",
"sensorPosition" : "0 0 0"

The results are the same:

---

I am aware this has been a long post, but our company is really looking for any help on how to solve this issue and more importantly, what exactly is causing the discrepancies

Thank you and regards,

Justin

  • Hi Justin,

    No worries on the long post. In fact, it's quite helpful to have the level of detailed debug you have described already. I would like to suggest taking a step back though, and seeing if your point cloud output looks the same when you fall towards/away from the radar. If the point cloud data looks the same, then we can move onto the tracking layer, but the tracking layer is only as good as the point cloud it receives from the detection layer.

    In oob_parser.py, line 122 sets

    self.saveBinary = 0

    change this to 

    self.saveBinary = 1

    Then, when you run the demo, you should see that every 1000 frames, a .bin file should appear in the binData folder. Run the experiment a few times and save this output. I will connect with you offline to share some scripts to debug this output, and we can see if the point cloud looks the same (but rotated 180 degrees) when you fall towards the radar and away from it. Also remember, the script only saves on the 1000th frame, so if your experiment concludes at say frame 4352, then wait until the next multiple of 1000 (5000 in this case) to close the visualizer and save/rename the bin files generated.

    Best,

    Nate