Connecting 2 Boson Cameras and 2 MIPI Cameras (4 Cameras Total)
-
- I want to connect 4 cameras using the VOXL2 or VOXL2-mini.
a) The camera configuration is 2 Boson cameras + 2 MIPI cameras.
Can I use 2 Boson cameras simultaneously?
b) Can I use 2 VOXL2 Mini Dual Hi-res and Boson MIPI Adapters (MCCA-M0194-2) simultaneously?- The Boson camera resolution is only 640x512, but I need 320x240. Is it possible to connect the 320x240 camera sold by FLIR?
Thanks,
-
Hi @Jskim
I'll let someone else from the SW team respond regarding how to configure your SW for this, but I can assure you from a HW viewpoint, we cannot support 2 Bosons directly on VOXL 2 Mini. There is not enough output power.
We only have enough power on a VOXL 2 Mini to power either a High Power ToF or a single Boson, along with our other suite of Tacking and HiRes image sensors. But, 2 ToFs or 2 Bosons will most likely fail and make the power supplies droop/starve the rest of the system, creating other random failures.VOXL 2 M0154 (not the Mini, sometimes referred to as "classic" or "full size") has enough power to run two of these types of image sensors.
-
Thank you for your quick response.
We will proceed with the review using the VOXL 2 M0154.
[Questions]- Please tell me how to configure the SW (2 EOs, 2 Bosons, 4 cameras total).
- Please also check if the Boson320 can be used.
Thanks
-
@Jskim , I will try it and will let you know. The test will include a Boson 640 + IMX412 (M0161), Boson320 + IMX412 (M0161) -- all connected to VOXL2 via two M0194.
Alex
-
@Jskim ,
As Vinny mentioned, since VOXL2 Mini does not have the 5V power budget for 2 Bosons, the only option is using VOXL2.
I have tested two configurations that work, please see below. Either Boson can be 320 or 640. Also instead of IMX412 (M0161), you could use IMX664 (M0186) or AR0144 (M0166).
Option 1:
- M0181 mounting hole aligns with VOXL2 mounting hole near J8
- no mounting holes for M0155 or M0162
- not possible to add other cameras
- use voxl2 kernel variant 1.0.1
Option 2:
- M0181 mounting hole aligns with VOXL2 mounting hole near J8
- second M0181 (near J6) does not have any mounting hole alignment. The tab can either be broken off or attached to an external attachment point)
- more cameras could be added to J7, but will need to watch out for mechanical constraints
- use voxl2 kernel variant 1.0.1
Option 3 (not recommended)
- identical to Option 2 (connection-wise)
- no mounting hole alignment, overhang
- M0194 is designed mainly for VOXL2 Mini (M0104)
M0181 Connection detail:
I will follow up tomorrow with software setup details.
Alex
-
@Alex-Kushleyev said in Connecting 2 Boson Cameras and 2 MIPI Cameras (4 Cameras Total):
I will follow up tomorrow with software setup details
Thank you for the prompt technical support.
Regards,
Kim -
I am going to document this using the Option 2, which is probably the best one:
Software Setup
- VOXL2 SDK 1.4.5 or later (1.5.0 or later recommended)
- copy the following
sensormodule
files to/usr/lib/camera/
cp /usr/share/modalai/chi-cdk/boson/com.qti.sensormodule.boson_0.bin /usr/lib/camera/ cp /usr/share/modalai/chi-cdk/boson/com.qti.sensormodule.boson_4.bin /usr/lib/camera/
You can find the latest IMX412 drivers here (depending on the SDK, there may or may not be imx412 driver for camera slot 5, but this zip has all of them): https://storage.googleapis.com/modalai_public/temp/imx412_test_bins/20250919/imx412_fpv_eis_20250919_drivers.zip
push the imx412 drivers from your PC:
adb push com.qti.sensormodule.imx412_fpv_20250919_1.bin /usr/lib/camera/ adb push com.qti.sensormodule.imx412_fpv_20250919_5.bin /usr/lib/camera/
Double check
maxRAWSizes=20
is set in/vendor/etc/camera/camxoverridesettings.txt
-- this is to ensure we can use all available modes in the IMX412 camera driver.At this point, you should be able to detect all 4 cameras:
voxl2:/$ voxl-camera-server -l DEBUG: Attempting to open the hal module DEBUG: SUCCESS: Camera module opened on attempt 0 DEBUG: ----------- Number of cameras: 4 DEBUG: Cam idx: 0, Cam slot: 0, Slave Address: 0x00D4, Sensor Id: 0x00FF DEBUG: Cam idx: 1, Cam slot: 1, Slave Address: 0x0034, Sensor Id: 0x0577 DEBUG: Cam idx: 2, Cam slot: 4, Slave Address: 0x00D4, Sensor Id: 0x00FF DEBUG: Cam idx: 3, Cam slot: 5, Slave Address: 0x0034, Sensor Id: 0x0577 DEBUG: Note: This list comes from the HAL module and may not be indicative DEBUG: of configurations that have full pipelines DEBUG: Number of cameras: 4 ...
The camera slot numbers should match up our configuration.
Generate
voxl-camera-server.conf
configuration file based on the camera software IDs (not slot ids). The syntax for the arguments tocamera-server-config-helper
is and array of the following entries:<camera-name>:<camera-type>:<camera-sw-id>
camera-server-config-helper boson320:boson-fpv:0 hires_front:imx412-fpv-misp:1 boson640:boson-fpv:2 hires_down:imx412-fpv-misp:3
For the Boson sensors, which are 320x256, edit the config file to update
preview_width
,preview_height
,misp_width
,misp_height
(set to 320 and 256 accordingly)Make sure your Boson sensors are configured for 8bit post AGC output and MIPI is enabled (https://docs.modalai.com/M0153/#boson-software-setup)
Finally, the IMX412 cameras in this configuration will be outputting up to 4 streams of different resolution. It is a good example of how to use MISP for multiple output streams. If you are not using all of them, it will probably be best to disable them (set
enable
to 0 under correspondingmisp_channels
entry. If you disable the 3 additional misp channels, the main MISP output will still be enabled, which may be sufficient for you. Also note the default video encoding in this setup is h265, so it won't be viewable viavoxl-portal
-- you could change it toh264
. Also, the configuration for the IMX412 cameras is not using the ISP, but using our own implementation MISP, which is a light weight ISP pipeline that runs on the CPU and GPU. If you want to enable the ISP, the config file will need to be changed slightly.Here is the config file i generated using the above command
camera-server-config-helper boson320:boson-fpv:0 hires_front:imx412-fpv-misp:1 boson640:boson-fpv:2 hires_down:imx412-fpv-misp:3
/etc/modalai/voxl-camera-server.conf
:/** * voxl-camera-server Configuration File * * Each camera has configurations for up to 4 HAL3 streams: * - `preview` stream for raw unprocessed images from CV cameras * - `small_video` 720p (ish) h264/h265 compressed for fpv video streaming * - `large_video` 4k (ish) h264/h265 for onboard video recording to disk * - `snapshot` ISP-processed JPG snapshots that get saved to disk * * on QRB5165 platforms (VOXL2 and VOXL2 mini) you can only have 3 of the 4 enabled * * This file is generated from default values by voxl-configure-cameras. * Do not expect arbitrary resolutions to work, the ISP and video compression * pipelines only support very specific resolutions. * * The default video compression mode is cqp or Constant Quantization Parameter * * * */ { "version": 0.1, "fsync_en": false, "fsync_gpio": 109, "cameras": [{ "type": "boson-fpv", "name": "boson320", "enabled": true, "camera_id": 0, "fps": 30, "en_rotate": false, "en_preview": true, "preview_width": 320, "preview_height": 256, "en_raw_preview": true, "en_misp": true, "misp_width": 320, "misp_height": 256, "misp_venc_enable": true, "misp_venc_mode": "h265", "misp_venc_br_ctrl": "cbr", "misp_venc_Qfixed": 38, "misp_venc_Qmin": 15, "misp_venc_Qmax": 50, "misp_venc_nPframes": 29, "misp_venc_mbps": 2, "misp_venc_osd": false, "misp_awb": "auto", "misp_gamma": 1, "misp_zoom": 1, "ae_mode": "lme_msv", "gain_min": 54, "gain_max": 8000, "ae_desired_msv": 60, "exposure_min_us": 20, "exposure_max_us": 33000, "exposure_soft_min_us": 5000, "ae_filter_alpha": 0.600000023841858, "ae_ignore_fraction": 0.20000000298023224, "ae_slope": 0.05000000074505806, "ae_exposure_period": 1, "ae_gain_period": 1 }, { "type": "imx412-fpv-misp", "name": "hires_front", "enabled": true, "camera_id": 1, "fps": 60, "en_preview": true, "preview_width": 1936, "preview_height": 1080, "en_raw_preview": true, "en_misp": true, "misp_width": 1280, "misp_height": 720, "misp_venc_enable": true, "misp_venc_mode": "h265", "misp_venc_br_ctrl": "cbr", "misp_venc_Qfixed": 38, "misp_venc_Qmin": 15, "misp_venc_Qmax": 50, "misp_venc_nPframes": 29, "misp_venc_mbps": 2, "misp_venc_osd": false, "misp_awb": "auto", "misp_gamma": 2.5, "misp_zoom": 1, "misp_channels": [{ "enable": 1, "name": "default_misp", "width": 1280, "height": 720, "fps": 30, "mbps": 2, "nPframes": 2, "codec": "h265", "osd": 0 }, { "enable": 1, "name": "long_range_misp", "width": 960, "height": 540, "fps": 30, "mbps": 0.8, "nPframes": 2, "codec": "h265", "osd": 0 }, { "enable": 1, "name": "low_latency_misp", "width": 960, "height": 540, "fps": 60, "mbps": 1.5, "nPframes": 29, "codec": "h265", "osd": 0 }], "ae_mode": "lme_msv", "gain_min": 54, "gain_max": 30000, "ae_desired_msv": 130, "exposure_min_us": 25, "exposure_max_us": 30000, "exposure_soft_min_us": 2500, "ae_filter_alpha": 0.600000023841858, "ae_ignore_fraction": 0.019999999552965164, "ae_slope": 0.00999999977648258, "ae_exposure_period": 1, "ae_gain_period": 1 }, { "type": "boson-fpv", "name": "boson640", "enabled": true, "camera_id": 2, "fps": 30, "en_rotate": false, "en_preview": true, "preview_width": 640, "preview_height": 512, "en_raw_preview": true, "en_misp": true, "misp_width": 640, "misp_height": 512, "misp_venc_enable": true, "misp_venc_mode": "h265", "misp_venc_br_ctrl": "cbr", "misp_venc_Qfixed": 38, "misp_venc_Qmin": 15, "misp_venc_Qmax": 50, "misp_venc_nPframes": 29, "misp_venc_mbps": 2, "misp_venc_osd": false, "misp_awb": "auto", "misp_gamma": 1, "misp_zoom": 1, "ae_mode": "lme_msv", "gain_min": 54, "gain_max": 8000, "ae_desired_msv": 60, "exposure_min_us": 20, "exposure_max_us": 33000, "exposure_soft_min_us": 5000, "ae_filter_alpha": 0.600000023841858, "ae_ignore_fraction": 0.20000000298023224, "ae_slope": 0.05000000074505806, "ae_exposure_period": 1, "ae_gain_period": 1 }, { "type": "imx412-fpv-misp", "name": "hires_down", "enabled": true, "camera_id": 3, "fps": 60, "en_preview": true, "preview_width": 1936, "preview_height": 1080, "en_raw_preview": true, "en_misp": true, "misp_width": 1280, "misp_height": 720, "misp_venc_enable": true, "misp_venc_mode": "h265", "misp_venc_br_ctrl": "cbr", "misp_venc_Qfixed": 38, "misp_venc_Qmin": 15, "misp_venc_Qmax": 50, "misp_venc_nPframes": 29, "misp_venc_mbps": 2, "misp_venc_osd": false, "misp_awb": "auto", "misp_gamma": 2.5, "misp_zoom": 1, "misp_channels": [{ "enable": 1, "name": "default_misp", "width": 1280, "height": 720, "fps": 30, "mbps": 2, "nPframes": 2, "codec": "h265", "osd": 0 }, { "enable": 1, "name": "long_range_misp", "width": 960, "height": 540, "fps": 30, "mbps": 0.8, "nPframes": 2, "codec": "h265", "osd": 0 }, { "enable": 1, "name": "low_latency_misp", "width": 960, "height": 540, "fps": 60, "mbps": 1.5, "nPframes": 29, "codec": "h265", "osd": 0 }], "ae_mode": "lme_msv", "gain_min": 54, "gain_max": 30000, "ae_desired_msv": 130, "exposure_min_us": 25, "exposure_max_us": 30000, "exposure_soft_min_us": 2500, "ae_filter_alpha": 0.600000023841858, "ae_ignore_fraction": 0.019999999552965164, "ae_slope": 0.00999999977648258, "ae_exposure_period": 1, "ae_gain_period": 1 }] }
Please try it and let me know if you have any issues
-
Thank you so much for your reply.
I'll test it and let you know if I have any other questions.Regards,
Kim -
@Jskim , sounds good!
Just FYI, i noticed that the config file i provided has some outdated settings for IMX412 camera - I have some better suggestions and will follow up soon. You can still test with the above config - the hardware functionality will not be affected.
Alex
-
A Alex Kushleyev referenced this topic
-
A Alex Kushleyev referenced this topic