ST意法半导体
直播中

李秀云

7年用户 814经验值
私信 关注
[问答]

怎么操作ROI来感测光圈内特定像素的距离?

你好。
在MWC 2018上,ST展示了带有RGB摄像头和VL53L1x的演示,在实时图像上有多个测量点

本周我得到了评估板,这个设备的在线数据表和API手册没有足够的细节如何为多个ROI操作这个配置

我尝试使用示例代码来解决这个问题,但结果确实有意义,距离测量似乎是正确的,但即使我只覆盖传感器的一半,它在光圈内的所有像素上都是相似的

有人成功操作ROI来感测光圈内特定像素的距离吗?

我为多个ROI开发了一个小测试应用程序,这里我覆盖了传感器的一半,因为你可以看到所有像素返回相同的结果:


谢谢

伊塔马尔

以上来自于谷歌翻译


以下为原文





Hi.

At the MWC 2018, ST presented a demo with RGB camera and the VL53L1x with multiple measurement points on the live image
.

I got the evaluation boards this week, the datasheet and API manuals online for this device don’t have enough details how to operate this configuration for multiple ROI
,

I tried to work through this using the example code but the results does make any sense, the distance measurement seems to be correct but it’s similar on all of the pixels within the aperture even when I cover just half of the sensor
.

Did someone succeed operating the ROI to sense the distance in specific pixel within the aperture?


I've developed a small test app for the multiple ROI, here i'm covering half of the sensor, as you can see all pixels returns around the same result:





Thanks
,

Itamar

回帖(4)

陈思阳

2018-10-22 16:32:29
使用多个ROI的同样问题。也许有人可以发布一些小代码如何获得整个FoV的正确范围值(13 * 13阵列,每个项目一个测距值)。
BR,
Albagir

以上来自于谷歌翻译


以下为原文




Same issue for me using multiple ROIs. Maybe someone could post some small code how to obtain the correct range value for the whole FoV (13*13 array, one ranging value per item).
BR,
Albagir
举报

李舒桀

2018-10-22 16:50:06
是的,我可以确认在我这边有同样的问题,不知道如何解决这个问题。

以上来自于谷歌翻译


以下为原文




Yes, I can confirm that on my side I have the same problem and don't know how to solve this issue.
举报

陈思阳

2018-10-22 17:03:10
谁解决了这个问题,可以提供一些代码?

以上来自于谷歌翻译


以下为原文




Anyone who solved the issue and can provide some code?
举报

王竹

2018-10-22 17:14:31
Itamar -
查看您的数据,您没有“覆盖传感器的一半”。尽管有相当大的红外滤光片,传感器上的孔真的很小。
我试过这个实验。
我将传感器放在一个打开的盒子底部向上看。
这让我可以小心地放置目标。我用尺子作为目标。
我用了一个20厘米左右的盒子和13厘米高的盒子。但尺寸并不重要。
我标记了中心线和+/- 12.5度。
 
这允许我重复地将目标移入和移出视场(FoV)。统治者只是放在盒子的两侧。
 
代码如下:
 
void AutonomousLowPowerRangingTest(void)
{
 uint32_t pMeasurementTimingBudgetMicroSeconds;
 VL53L1_UserRoi_t Roi;
 static VL53L1_RangingMeasurementData_t RangingData;
 printf('自主测距测试 n');
 status = VL53L1_WaitDeviceBooted(Dev);
 status + = VL53L1_DataInit(Dev);
 status + = VL53L1_StaticInit(Dev);
 status + = VL53L1_SetPresetMode(Dev,VL53L1_PRESETMODE_LOWPOWER_AUTONOMOUS);
 status + = VL53L1_SetDistanceMode(Dev,VL53L1_DISTANCEMODE_LONG);
 status + = VL53L1_SetMeasurementTimingBudgetMicroSeconds(Dev,20000); // 8毫秒
 status + = VL53L1_SetInterMeasurementPeriodMilliSeconds(Dev,100);
 status + = VL53L1_GetMeasurementTimingBudgetMicroSeconds(Dev,& pMeasurementTimingBudgetMicroSeconds);
 printf('时间预算=%d  n',pMeasurementTimingBudgetMicroSeconds);
 Roi.TopLeftX = 0;
 Roi.TopLeftY = 15;
 Roi.BotRightX = 15;
 Roi.BotRightY = 0;
#if 1
 Roi.TopLeftX = 5;
 Roi.TopLeftY = 15;
 Roi.BotRightX = 10;
 Roi.BotRightY = 0;
#万一
 status + = VL53L1_SetUserROI(Dev,& Roi);
 status + = VL53L1_StartMeasurement(Dev);
 
 如果(状态){
 printf('你有点错误 n');
 而(1);
 }
 
 做//中断模式
 {
 __WFI(); //等待中断 - 您也可以轮询
 if(IntCount!= 0){
 IntCount = 0;
 status = VL53L1_GetRangingMeasurementData(Dev,& RangingData);
 如果(状态== 0){
 printf('%d,%d,%。2f,%。2f,%d  n',RangingData.RangeStatus,RangingData.RangeMilliMeter,
 RangingData.SignalRateRtnMegaCps / 65536.0,RangingData.AmbientRateRtnMegaCps / 65336.0,HAL_GetTick());
 }
 status = VL53L1_ClearInterruptAndStartMeasurement(Dev);
 }
 }
 而(1);
我遇到的一个问题是理解协调系统。
假设(0,0)位置在芯片的左下角。 (15,15)在右上方。
然后查看EVK,使USB位于“顶部”,字符正面朝上。
 
使用(0,15)(15,0)FoV运行代码。移动你的统治者,直到你确信你在FoV的边缘。用这些边标记框。
然后使用(5,15)(10,0)FoV运行代码。再次移动统治者,直到你确信FoV已经“移入”。
 我的投资回报率发生了很大变化。这是我所期待的。
 
我唯一担心的是ROI变化可能不会立即改变。如果范围已开始,则可能仅在范围结束后生效。

以上来自于谷歌翻译


以下为原文





Itamar -

Looking at your data, you didn't 'cover half the sensor'. Despite the rather large IR filter, the hole in the sensor is REALLY small.

I tried this experiment.

I placed my sensor in the bottom of an open box looking up.

This allows me to carefully place my targets. I used a ruler as a target.

I used a box 20cm on a side and 13cm tall. But the dimensions aren't really important.

I marked the centerline and +/- 12.5 degrees.



This allows me to move targets in and out of the Field of View (FoV) repeatably. The ruler simply rests on the sides of the box.



Code follows:



void AutonomousLowPowerRangingTest(void)

{

            uint32_t pMeasurementTimingBudgetMicroSeconds;

            VL53L1_UserRoi_t Roi;

            static VL53L1_RangingMeasurementData_t RangingData;

            printf('Autonomous Ranging Testn');

            status = VL53L1_WaitDeviceBooted(Dev);

            status += VL53L1_DataInit(Dev);

            status += VL53L1_StaticInit(Dev);

            status += VL53L1_SetPresetMode(Dev,VL53L1_PRESETMODE_LOWPOWER_AUTONOMOUS);

            status += VL53L1_SetDistanceMode(Dev, VL53L1_DISTANCEMODE_LONG);

            status += VL53L1_SetMeasurementTimingBudgetMicroSeconds(Dev,20000); // 8 ms

            status += VL53L1_SetInterMeasurementPeriodMilliSeconds(Dev, 100);

            status += VL53L1_GetMeasurementTimingBudgetMicroSeconds(Dev, &pMeasurementTimingBudgetMicroSeconds);

            printf('Timing Budget = %dn', pMeasurementTimingBudgetMicroSeconds);

            Roi.TopLeftX = 0;

            Roi.TopLeftY = 15;

            Roi.BotRightX = 15;

            Roi.BotRightY = 0;

#if 1

            Roi.TopLeftX = 5;

            Roi.TopLeftY = 15;

            Roi.BotRightX = 10;

            Roi.BotRightY = 0;

#endif

            status += VL53L1_SetUserROI( Dev, &Roi);

            status += VL53L1_StartMeasurement(Dev);



            if(status){

                        printf('YOU DID SOMETHING WRONG n');

                        while(1);

            }           

            

                        do // interrupt mode

                        {

                                    __WFI(); // Wait For Interrupt - you could also poll

                                    if(IntCount !=0 ){

                                                IntCount=0;

                                                status = VL53L1_GetRangingMeasurementData(Dev, &RangingData);

                                                if(status==0){

                                                            printf('%d,%d,%.2f,%.2f,%dn', RangingData.RangeStatus,RangingData.RangeMilliMeter,

                                                                        RangingData.SignalRateRtnMegaCps/65536.0,RangingData.AmbientRateRtnMegaCps/65336.0,HAL_GetTick());

                                                }

                                                status = VL53L1_ClearInterruptAndStartMeasurement(Dev);

                                    }

                        }

                        while(1);

One issue I had was understanding the co-ordinate system.

Assume the (0,0) location is in the bottom left of the chip. (15,15) is in the upper right.

Then view the EVK so the USB is at the ‘top’ and the characters are right-side-up.



Run the code using the (0,15) (15,0) FoV. Move your rulers in an out until you are convinced you are at the edge of the FoV. Mark the box with these edges.

Then run the code using the (5,15) (10,0) FoV. Again move the rulers in an out until you are convinced the FoV has moved “in”.

I get a pretty significant change in the ROI. It's about what I would expect.



My only worry is that an ROI change might not change immediately. If a range has started, it might only take effect after the range finishes.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分