ModalAI Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Connecting 2 Boson Cameras and 2 MIPI Cameras (4 Cameras Total)

    Image Sensors
    3
    9
    343
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      Jskim
      last edited by

      1. 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?

      1. The Boson camera resolution is only 640x512, but I need 320x240. Is it possible to connect the 320x240 camera sold by FLIR?

      Thanks,

      VinnyV 1 Reply Last reply Reply Quote 0
      • VinnyV
        Vinny ModalAI Team @Jskim
        last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • J
          Jskim
          last edited by

          Thank you for your quick response.

          We will proceed with the review using the VOXL 2 M0154.
          [Questions]

          1. Please tell me how to configure the SW (2 EOs, 2 Bosons, 4 cameras total).
          2. Please also check if the Boson320 can be used.

          Thanks

          Alex KushleyevA 1 Reply Last reply Reply Quote 0
          • Alex KushleyevA
            Alex Kushleyev ModalAI Team @Jskim
            last edited by

            @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

            Alex KushleyevA 1 Reply Last reply Reply Quote 0
            • Alex KushleyevA
              Alex Kushleyev ModalAI Team @Alex Kushleyev
              last edited by

              @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:
              62435a4d-94c8-4b25-942e-8bb7cdc9013a-image.png

              • 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:
              2c155d58-61d7-4aef-88e4-d43ee4e5c438-image.png

              • 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)
              0c851ab6-2004-42d8-8c7b-b39439e226ed-image.png

              • identical to Option 2 (connection-wise)
              • no mounting hole alignment, overhang
              • M0194 is designed mainly for VOXL2 Mini (M0104)

              M0181 Connection detail:
              eb02190d-24eb-42bd-b088-7c7c40d50cfe-image.png

              I will follow up tomorrow with software setup details.

              Alex

              J 1 Reply Last reply Reply Quote 1
              • J
                Jskim @Alex Kushleyev
                last edited by

                @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

                Alex KushleyevA 1 Reply Last reply Reply Quote 0
                • Alex KushleyevA
                  Alex Kushleyev ModalAI Team @Jskim
                  last edited by Alex Kushleyev

                  @Jskim

                  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 to camera-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 corresponding misp_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 via voxl-portal -- you could change it to h264. 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.

                  16276e67-9fe7-4ac5-ae6e-efdac943c25b-image.png

                  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

                  1 Reply Last reply Reply Quote 0
                  • J
                    Jskim
                    last edited by

                    Thank you so much for your reply.
                    I'll test it and let you know if I have any other questions.

                    Regards,
                    Kim

                    Alex KushleyevA 1 Reply Last reply Reply Quote 0
                    • Alex KushleyevA
                      Alex Kushleyev ModalAI Team @Jskim
                      last edited by

                      @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

                      1 Reply Last reply Reply Quote 0
                      • Alex KushleyevA Alex Kushleyev referenced this topic
                      • Alex KushleyevA Alex Kushleyev referenced this topic
                      • First post
                        Last post
                      Powered by NodeBB | Contributors