• RE: Running QVIO on a hires camera

    Here is an outline of the data flow that you may want to start with:

    Choose the camera resolution, since it cannot be changed after logging

    • IMX412: 4040x3040 or 1996x1520 (2x2 binned), use full frame to maximize FOV (4:3 aspect ratio, not 16:9, which will crop the image)

    voxl-logger + copy intrinsics / extrinsics

    • log raw10 bayer and grey or normalized (or all 3)
    • log imu data
    • save camera intrinsics
    • save camera and imu extrinsics (extrinsics.conf)

    voxl-playback

    • option 1: simple:

      • playback grey / normalized, feed directly into voxl-qvio server
    • option2 : more complex

      • playback raw10 bayer
      • run offline misp implementation to debayer + AWB + normalize
      • publish grey / normalized
    • both options:

      • run voxl-qvio-server, which will load voxl-qvio-server.conf
      • playback imu into voxl-qvio-server
      • qvio server loads camera calibration and extrinsics
      • qvio server outputs vio pose
      • use voxl-logger to log the output of qvio
      • analyze the results of vio logs

    Misc Notes

    • QVIO performs better if the imu data is temperature compensated
      • during drone take-off, the imu temperature and therefore imu biases can change quickly and QVIO may have trouble tracking the biases
      • the bias correction can also be done offline and applied to the logged data imu data to produce better bias-compensated imu data (gyro, accel)
    • Consider also logging the global shutter camera (AR0144?) at the same time as IMX412, so that it is possible to compare output of QVIO using a global shutter camera vs rolling shutter.
    posted in GPS-denied Navigation (VIO)
  • RE: Running QVIO on a hires camera

    Hi @Rowan-Dempster ,

    The only things that you cannot change after the raw10 images are collected are:

    • raw frame resolution and any other camera settings (which we typically don't change anyway)
    • exposure and gain, as they are controlled by the auto exposure algorithm in real time
    • the auto exposure algorithm only runs if at least one processed stream is requested (yuv, encoded, normalized, etc), you can see the logic here. If the camera server only has a client for the bayer image, the Auto Exposure will not be updated, which is not good. The solution should be:
      • either log or use voxl-inspect-camera or any other client to get the yuv or grey stream going (or even encoded)
      • log raw10 bayer only, but you could also log the output video or YUVs
      • *** i will look into potentially adding a param to force the camera to always do AE processing even if there are no clients for the processed images (essentially disable idling).

    I would suggest not collecting too many data sets until you actually get the pipeline working, as you may realize that there is an issue in the data sets or something is missing. Probably best to focus on the processing pipeline..

    • You cannot simultaneously receive 2x2 binned and not binned images from the camera, so it either has to be in unbinned mode (4040x3040 resolution) or binned (1996x1520). You can always do binning / resizing in misp, but the readout time will change for the larger resolution, as we discussed before. So one thing to test would be potentially putting two IMX412 cameras side by side and simultaneously logging at 4040x3040 (cam1) and 1996x1520 (cam2), and then run offline processing pipeline to see if QVIO can indeed compensate properly for the larger rolling shutter skew. If you are able to run QVIO using full 4040x3040 resolution, then you can have EVERYTHING : 4k video, EIS, vio... you can still run EIS and save videos from the binned resolution, but they will be lower quality.

    Another thing to keep an eye on is what you are logging (bandwidth). I did some tests a while ago and voxl2 write speed to disk is quite high, about 1.5GB/s, but you can run out of disk space pretty quickly. However, it should definitely be able to log 4040x3040@30 + 1996x1520@30 (or @60). will probably need to use the ion buffers to log the raw10 images (which is supported, i just need to test), to skip the overhead for sending huge images over the pipes. Camera server already publishes the raw bayer via regular pipes and also ion buffers.

    I am going to look over the components needed for this and make sure they are in good state:

    • merge the new logging modes to dev (voxl-logger, voxl-replay)
    • make a cleaner example of simple standalone misp to include AWB, although you don't need AWB for VIO

    But either way, you should be able to start with logging tests and just see if you can playback the logs and get QVIO to do something reasonable from the log playback on target. To bypass MISP, you could just log the output of MISP for now (grey or normalized), so you have less components in the initial test pipeline. then build it up to include debayering, etc.

    Perhaps it is easy to log the raw10 bayer + grey or normalized image, so that you have the AE issue solved as well (making sure the AE is running), then for playback you can choose either normalized (feed directly into voxl-qvio-server) or raw10, which will need some debayering and other processing. It is good to have choices. But i would suggest starting with lower resolution first until you also double check ability to log 4K raw images.

    Alex

    posted in GPS-denied Navigation (VIO)
  • RE: Running QVIO on a hires camera

    @Rowan-Dempster ,

    Please see the following commit where we recently enabled publishing the normalized frame from IMX412 and IMX664 camera via regular and ION buffers: https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/commit/c42e2febbc6370f9bbc95aff0659718656af6906

    The parameters for 1996x1520 look good, basically you will be getting 2x2 binned (full frame) and then further down-scale to 998x760. since you are doing exact 2x2 downscale in misp, you can also remove interpolation, which will make the image a bit sharper, you can see this for reference: link -- basically change the sampler filter mode from linear (interpolate) to nearest. If you use non-integer down-sample, keep the linear interpolation.

    Regarding the resolution to use with VIO.. i think the 998x760 with nearest sampling should behave the same or better than AR0144 with 1280x800 resolution, mainly because the IMX412 has a much bigger lens (while still being pretty wide), so image quality is going to be better (of course, you need to calibrate intrinsics). Also the 4:3 aspect ratio may help capture more features in the vertical direction. That of course does not account for rolling shutter effects..

    There can definitely be benefit in going up in resolution and using 1996x1520, but you kind of have to use the extra resolution correctly.. typically you would detect features on lower resolution image and then refine using the full resolution (also for tracking features). However, in practice, often some small blur is applied to the image to get rid of pixel noise, etc, so very fine features won't get picked up. Unfortunately, we do not know exactly what QVIO does internally. it may do some kind of pyramidal image decomposition to do these things in a smart way. You should try it and check the cpu usage.

    Using MISP you can downsample and crop (while maintaining aspect ratio) to any resolution, so it's easy to experiment.

    If i had to test QVIO at different resolutions, i would log raw bayer images and imu data using voxl-logger and then use voxl-replay + offline misp + offline qvio to run tests on the same data sets with different processing parameters. This may sound complicated, but it's really not:

    So, if you are really serious about using hires camera for QVIO, since there are a lot of unknowns, you should consider setting up an offline processing pipeline, so that you can run repeatable tests and parameter sweeps. It requires some upfront work, but the pay-off will be significant. You can also use the offline pipeline for regression testing of performance and comparing to other VIO algorithms (which just need the MPA interface). We can discuss this topic more, if you are interested.

    imx412_fpv_eis_20250919_drivers.zip are the latest for IMX412. We should really make them default ones shipped in the VOXL2 SDK, but we have not done it.

    Since you are maintaining your own version of voxl-camera-server, you should add them to your voxl-camera-server repo and .deb and install them somewhere like /usr/share/modalai/voxl-camera-server/drivers. then modify the voxl-configure-camera script to first look for imx412 drivers in that folder and then fallback to searching /usr/share/modalai/chi-cdk/. In fact this is something I am considering, as maintaining camera drivers in the core system image is less flexible.

    EDIT: i guess the older version of the imx412 drivers are already in the repo, so you can just replace them with new ones in your camera server repo: link

    Let me know if you have any more questions. Sounds like a fun project 🙂

    Alex

    posted in GPS-denied Navigation (VIO)
  • RE: How much can cameras be obscured?

    @Myles-Levine , if you are masking out 90% of down-facing camera, then it is probably useless any movement of the features will get it out of the unmasked region very easily and feature will be dropped.. It may hurt VIO as there may be features going in and out, only trackable for a few frames (just adds to the complexity).

    You should try to move the down-facing camera to free up it's FOV or even have it facing slightly angled to the back of the drone..

    Alex

    posted in Ask your questions right here!
  • RE: Confusion about the VOXL 2 MIPI Boson+ website page

    Hello @Catalystmachine ,

    Sorry for the confusion. We have updated the page to be more clear that Boson is not included, see below: "(No Boson)" was added to the kit description.

    The title of the product already states "VOXL 2 MIPI Boson+ Adapters for Thermal IR FPV" as well as the Kit description used to say (Before we added (No Boson)) : "PCB Adapters Only..."

    The price of the Boson cameras varies significantly, depending on the specifications. You can contact a distributor to get more details. For example : https://www.oemcameras.com/product-category/thermal-imaging-cameras/thermal-imaging-cores/flir-boson-series-htm/boson-plus/ (you can find more at https://oem.flir.com/contact/find-a-dealer/)

    Please note that Boson+ series of the Boson sensor is required for compatibility with VOXL2.

    Regarding the pricing of the adapter kit, we do offer discounts in higher volumes, if you are interested, please send us a request: https://www.modalai.com/pages/contact-us

    ebff1907-0495-4a65-8f27-2138562022d3-image.png

    posted in Ask your questions right here!
  • RE: How much can cameras be obscured?

    @Myles-Levine
    Performance is evaluated with no external masks -- as we don't ship them. With masks, the answer is very dependent on use-case. Honestly, based on practical tests, it might be better to fly single-cam (full-view) with tight params for robustness than to fly multi-cam with obstructed view. Furthermore, you could try changing the location of your cameras, and doing an extrinsic IMU-CAM calibration with our Kalibr setup (guides available in past answered questions)

    posted in Ask your questions right here!
  • RE: How much can cameras be obscured?

    @Myles-Levine Absolutely, you're forcing the tracker to reduce the tracking continuity window, less persistent features -> SLAM feats drop.

    Perhaps, you could try reducing the spacing between features in the estimator_config yaml (track opts) to bump MSCKF feats and potentially SLAM feats; however, these are advanced settings. Please exercise your best judgment when changing this, modifications are not recommended for general/default use-case

    posted in Ask your questions right here!
  • RE: How much can cameras be obscured?

    @zauberflote1
    You could also disable the bottom cam in vio_cams.conf for VIO only

    posted in Ask your questions right here!
  • RE: How much can cameras be obscured?

    @Myles-Levine
    Hello There,

    Please check your SDK version, VINS is under constant development, so always prefer the latest tag available.

    Regarding occlusion during takeoff, please check your /etc/modalai/vio_cams.conf, if you have the occlusion flag during takeoff enabled, I would attempt disabling and confirm if the behaviour persists...

    Regarding Arbitrary mask, please refer to this past forum question, if you have any further questions, please don't hesitate to post.

    All the best,
    ZBFT

    posted in Ask your questions right here!
  • RE: Stinger control via mavlink joystick

    @qubotics-admin First you need to determine the version of PX4 running. With ssh or adb you can run the following at the command line: px4-ver all. You will see PX4 version and Vendor version. So, for example, for px4 version 1.14.0 and vendor version 8.134.3 then you would checkout the tag v1.14.0-8.134.3-dev from the repo to see that commit.

    posted in FPV Drones