Skip to content

General Questions

2.2k Topics 11.3k Posts

Not sure where your question goes? Ask here. ModalAI engineers and the community answer questions about any VOXL product.

  • Charger for the Starling V2

    Unsolved
    2
    0 Votes
    2 Posts
    662 Views
    ModeratorM
    @Erik-Priest Yes, an adapter should be all you need
  • 1 Votes
    2 Posts
    700 Views
    tomT
    @frafrat Try out voxl-configure-cameras 21 which is labeled "old C6" We screwed up the C6 config when moving from SDK 0.9.5 to SDK 1.0.0 21 should be equivalent to the old 6
  • Stereo tag detection: WARNING, apriltag roll/pitch out of bounds

    Unsolved
    14
    0 Votes
    14 Posts
    3k Views
    A
    I did a very quick and dummy workaround to fix the problem, most of the changes are in geometry.c in the following snippet of code: int geometry_calc_R_T_tag_in_local_frame(int64_t frame_timestamp_ns, rc_matrix_t R_tag_to_cam, rc_vector_t T_tag_wrt_cam, rc_matrix_t *R_tag_to_local, rc_vector_t *T_tag_wrt_local, char* input_pipe) { // these "correct" values are from the past aligning to the timestamp static rc_matrix_t correct_R_imu_to_vio = RC_MATRIX_INITIALIZER; static rc_vector_t correct_T_imu_wrt_vio = RC_VECTOR_INITIALIZER; int ret = rc_tf_ringbuf_get_tf_at_time(&vio_ringbuf, frame_timestamp_ns, &correct_R_imu_to_vio, &correct_T_imu_wrt_vio); // fail silently, on catastrophic failure the previous function would have // printed a message. If ret==-2 that's a soft failure meaning we just don't // have enough vio data yet, so also return silently. if (ret < 0) return -1; pthread_mutex_lock(&tf_mutex); // Read extrinsics parameters int n; vcc_extrinsic_t t[VCC_MAX_EXTRINSICS_IN_CONFIG]; vcc_extrinsic_t tmp; // now load in extrinsics if (vcc_read_extrinsic_conf_file(VCC_EXTRINSICS_PATH, t, &n, VCC_MAX_EXTRINSICS_IN_CONFIG)) { return -1; } // Initialize camera matrices rc_matrix_t R_cam_to_imu_tmp = RC_MATRIX_INITIALIZER; rc_matrix_t R_cam_to_body = RC_MATRIX_INITIALIZER; rc_vector_t T_cam_wrt_imu_tmp = RC_VECTOR_INITIALIZER; rc_vector_t T_cam_wrt_body = RC_VECTOR_INITIALIZER; rc_vector_zeros(&T_cam_wrt_body, 3); rc_vector_zeros(&T_cam_wrt_imu_tmp, 3); rc_matrix_identity(&R_cam_to_imu_tmp, 3); rc_matrix_identity(&R_cam_to_body, 3); printf("input_pipe: %s \n", input_pipe); if (strcmp(input_pipe, "stereo_front") == 0) { // Pick out IMU to Body. config.c already set this up for imu1 so just leave it as is if (vcc_find_extrinsic_in_array("body", "stereo_front_l", t, n, &tmp)) { fprintf(stderr, "ERROR: %s missing body to stereo_front_l, sticking with identity for now\n", VCC_EXTRINSICS_PATH); return -1; } rc_rotation_matrix_from_tait_bryan(tmp.RPY_parent_to_child[0] * DEG_TO_RAD, tmp.RPY_parent_to_child[1] * DEG_TO_RAD, tmp.RPY_parent_to_child[2] * DEG_TO_RAD, &R_cam_to_body); rc_vector_from_array(&T_cam_wrt_body, tmp.T_child_wrt_parent, 3); T_cam_wrt_imu_tmp.d[0] = T_cam_wrt_body.d[0] - T_imu_wrt_body.d[0]; T_cam_wrt_imu_tmp.d[1] = T_cam_wrt_body.d[1] - T_imu_wrt_body.d[1]; T_cam_wrt_imu_tmp.d[2] = T_cam_wrt_body.d[2] - T_imu_wrt_body.d[2]; rc_matrix_multiply(R_body_to_imu, R_cam_to_body, &R_cam_to_imu_tmp); printf("RPY: \n%5.2f %5.2f %5.2f\n\n", tmp.RPY_parent_to_child[0], tmp.RPY_parent_to_child[1],tmp.RPY_parent_to_child[2]); printf("R_cam_to_imu_tmp: \n%5.2f %5.2f %5.2f\n %5.2f %5.2f %5.2f\n %5.2f %5.2f %5.2f\n\n", R_cam_to_imu_tmp.d[0][0], R_cam_to_imu_tmp.d[0][1], R_cam_to_imu_tmp.d[0][2], R_cam_to_imu_tmp.d[1][0], R_cam_to_imu_tmp.d[1][1], R_cam_to_imu_tmp.d[1][2], R_cam_to_imu_tmp.d[2][0], R_cam_to_imu_tmp.d[2][1], R_cam_to_imu_tmp.d[2][2]); // calculate position of tag wrt local rc_matrix_times_col_vec(R_cam_to_imu_tmp, T_tag_wrt_cam, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, T_cam_wrt_imu_tmp); rc_matrix_times_col_vec_inplace(correct_R_imu_to_vio, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, correct_T_imu_wrt_vio); rc_matrix_times_col_vec_inplace(R_vio_to_local, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, T_vio_ga_wrt_local); // calculate rotation tag to local rc_matrix_multiply(R_cam_to_imu_tmp, R_tag_to_cam, R_tag_to_local); rc_matrix_left_multiply_inplace(correct_R_imu_to_vio, R_tag_to_local); rc_matrix_left_multiply_inplace(R_vio_to_local, R_tag_to_local); } else if (strcmp(input_pipe, "stereo_rear") == 0) { // Pick out IMU to Body. config.c already set this up for imu1 so just leave it as is if (vcc_find_extrinsic_in_array("body", "stereo_rear_l", t, n, &tmp)) { fprintf(stderr, "ERROR: %s missing body to stereo_rear_l, sticking with identity for now\n", VCC_EXTRINSICS_PATH); return -1; } rc_rotation_matrix_from_tait_bryan(tmp.RPY_parent_to_child[0] * DEG_TO_RAD, tmp.RPY_parent_to_child[1] * DEG_TO_RAD, tmp.RPY_parent_to_child[2] * DEG_TO_RAD, &R_cam_to_body); rc_vector_from_array(&T_cam_wrt_body, tmp.T_child_wrt_parent, 3); T_cam_wrt_imu_tmp.d[0] = T_cam_wrt_body.d[0] - T_imu_wrt_body.d[0]; T_cam_wrt_imu_tmp.d[1] = T_cam_wrt_body.d[1] - T_imu_wrt_body.d[1]; T_cam_wrt_imu_tmp.d[2] = T_cam_wrt_body.d[2] - T_imu_wrt_body.d[2]; rc_matrix_multiply(R_body_to_imu, R_cam_to_body, &R_cam_to_imu_tmp); printf("R_cam_to_imu_tmp: \n%5.2f %5.2f %5.2f\n %5.2f %5.2f %5.2f\n %5.2f %5.2f %5.2f\n\n", R_cam_to_imu_tmp.d[0][0], R_cam_to_imu_tmp.d[0][1], R_cam_to_imu_tmp.d[0][2], R_cam_to_imu_tmp.d[1][0], R_cam_to_imu_tmp.d[1][1], R_cam_to_imu_tmp.d[1][2], R_cam_to_imu_tmp.d[2][0], R_cam_to_imu_tmp.d[2][1], R_cam_to_imu_tmp.d[2][2]); // calculate position of tag wrt local rc_matrix_times_col_vec(R_cam_to_imu_tmp, T_tag_wrt_cam, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, T_cam_wrt_imu_tmp); rc_matrix_times_col_vec_inplace(correct_R_imu_to_vio, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, correct_T_imu_wrt_vio); rc_matrix_times_col_vec_inplace(R_vio_to_local, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, T_vio_ga_wrt_local); // calculate rotation tag to local rc_matrix_multiply(R_cam_to_imu_tmp, R_tag_to_cam, R_tag_to_local); rc_matrix_left_multiply_inplace(correct_R_imu_to_vio, R_tag_to_local); rc_matrix_left_multiply_inplace(R_vio_to_local, R_tag_to_local); } else if (strcmp(input_pipe, "tracking") == 0) { printf("R_cam_to_imu: \n%5.2f %5.2f %5.2f\n %5.2f %5.2f %5.2f\n %5.2f %5.2f %5.2f\n\n", R_cam_to_imu.d[0][0], R_cam_to_imu.d[0][1], R_cam_to_imu.d[0][2], R_cam_to_imu.d[1][0], R_cam_to_imu.d[1][1], R_cam_to_imu.d[1][2], R_cam_to_imu.d[2][0], R_cam_to_imu.d[2][1], R_cam_to_imu.d[2][2]); // calculate position of tag wrt local rc_matrix_times_col_vec(R_cam_to_imu, T_tag_wrt_cam, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, T_cam_wrt_imu); rc_matrix_times_col_vec_inplace(correct_R_imu_to_vio, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, correct_T_imu_wrt_vio); rc_matrix_times_col_vec_inplace(R_vio_to_local, T_tag_wrt_local); rc_vector_sum_inplace(T_tag_wrt_local, T_vio_ga_wrt_local); // calculate rotation tag to local rc_matrix_multiply(R_cam_to_imu, R_tag_to_cam, R_tag_to_local); rc_matrix_left_multiply_inplace(correct_R_imu_to_vio, R_tag_to_local); rc_matrix_left_multiply_inplace(R_vio_to_local, R_tag_to_local); } printf("\n__________________________________________________________________________\n"); pthread_mutex_unlock(&tf_mutex); return 0; }
  • No Odometry in QGC through MAVLink

    Unsolved
    7
    1
    0 Votes
    7 Posts
    1k Views
    Jetson NanoJ
    @SMRazaRizvi You have to setup GPS and make EKF Aid mask use GPS, and I don't think using GPS will give you odometry data, you might get some sort of global position which helps you hold position and navigate
  • VOXL2 Mini Power Requirements

    Unsolved
    10
    0 Votes
    10 Posts
    2k Views
    B
    @Vinny Thanks for this info this is super helpful. I 100% agree about the last thing you said and if I can use the ModalAI power adapter then I definitely will. I got the 7.4V spec by assuming nominal 2S battery voltage to nominal 6S, which was probably a bad assumption. Even so, a 2S battery from dead to full charge is typically 6.4V to 8.4V so I figured 5V input was probably not sufficient for the power module as it was not in the range of 2S to 6S. Seems like this may not be the case though which is excellent
  • VOXL2(mini) Serial Number

    Unsolved
    2
    0 Votes
    2 Posts
    922 Views
    tomT
    @Steve-Turner cat /sys/bus/soc/devices/soc0/serial_number is unique and will be unchanged after a factory flash. That is what we use internally in our prod line as a board UID
  • Ceres c++ error when used in voxl2 project

    Unsolved
    9
    1
    0 Votes
    9 Posts
    948 Views
    Alex KushleyevA
    @lfierz , excellent! I am glad that it worked
  • Unable to retrieve camera information

    Unsolved
    3
    0 Votes
    3 Posts
    759 Views
    Riccardo FranceschiniR
    Hi @Kashish-Garg unfortunately no update on this side
  • Seeker offboard failsafe unexpected behavior and firmware update parameter issues.

    Unsolved
    3
    0 Votes
    3 Posts
    707 Views
    tomT
    @Karrthik-Gk SDK 1.1.1 for voxl 1 includes PX4 v1.14 for flight core. I would recommend starting there
  • Flightcore v2

    Unsolved
    2
    0 Votes
    2 Posts
    482 Views
    ModeratorM
    @Jw0719 hi, we're not familiar with that specific capability. Flight Core v2 is fairly stock PX4 though, so if PX4 supports it Flight Core should support it
  • VOXL MPA to ROS Seeker

    Unsolved
    1
    0 Votes
    1 Posts
    1k Views
    No one has replied
  • Seeker SLAM Setup Help

    Unsolved
    9
    0 Votes
    9 Posts
    3k Views
    U
    @tom Installing the VOXL1 SDK now... Thanks!
  • Voxl 2 Mini Mounting

    Unsolved
    1
    0 Votes
    1 Posts
    448 Views
    No one has replied
  • Is it possible to do a multiple camera streaming in the VOXL m500?

    Unsolved
    1
    0 Votes
    1 Posts
    367 Views
    No one has replied
  • Exploring the Potential of VOXL m500 for Advanced Control Algorithm Testing

    Unsolved
    1
    0 Votes
    1 Posts
    275 Views
    No one has replied
  • Cannot arm Starling in Position mode

    Unsolved
    2
    6
    0 Votes
    2 Posts
    622 Views
    ModeratorM
    @kerct did you remove the GPS? It is showing errors related to GPS You can upload your PX4 log to logs.px4.io and it will likely tell you
  • Are MCBL-00068 cables any different from regular cables?

    Unsolved
    2
    1
    0 Votes
    2 Posts
    501 Views
    ModeratorM
    @황인호 We're not sure how you would define regular cables. You can find the specs for MCBL-00068 here: https://docs.modalai.com/cable-datasheets/#mcbl-00068
  • Get depth from dfs

    Unsolved
    3
    0 Votes
    3 Posts
    859 Views
    ModeratorM
    @cch you can see the code where voxl-vision-hub takes the pointcloud topic from DFS and uses the information, this should be a good reference: https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/src/voa_manager.c?ref_type=heads#L434
  • Integrating Holybro GPS on Sentinel drone

    Unsolved
    2
    0 Votes
    2 Posts
    556 Views
    ModeratorM
    @SMRazaRizvi At first glance, it looks like that GPS uses CAN to communicate. There is not a supported CAN interface on VOXL 2. You will need to use an Arduino or something in the middle to translate CAN protocol to something VOXL 2 can interface with
  • 10Hz GPS?

    Unsolved
    6
    0 Votes
    6 Posts
    795 Views
    S
    @SethG How did you do this? Please mention the steps here.