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.

  • VOXL2 Mini J10 UART

    Unsolved
    5
    0 Votes
    5 Posts
    1k Views
    Steve TurnerS
    @modaltb Thankyou so much for the quick eyes on this! We owe you some beers!
  • Inconsistent VIO Pose

    Unsolved
    4
    0 Votes
    4 Posts
    831 Views
    ModeratorM
    @SMRazaRizvi of course the VIO pose should be correct when you move the drone. can you screen capture the qvio overlay to demonstrate your issue?
  • Voxl2 crashed

    Unsolved
    11
    0 Votes
    11 Posts
    2k Views
    S
    @Moderator Thanks, I will try it. Although the temperature will reach 80°C, there has been no shutdown at this temperature. The temperature wasn't high when the problem occurred. So if the problem occurs and I want to view the system logs or use DBG_UART12 at J3 PIN-OUT of voxl2 to check. What can I do? Simon
  • Charger for the Starling V2

    Unsolved
    2
    0 Votes
    2 Posts
    668 Views
    ModeratorM
    @Erik-Priest Yes, an adapter should be all you need
  • 1 Votes
    2 Posts
    702 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
    931 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
    978 Views
    Alex KushleyevA
    @lfierz , excellent! I am glad that it worked
  • Unable to retrieve camera information

    Unsolved
    3
    0 Votes
    3 Posts
    770 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
    718 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
    485 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
    453 Views
    No one has replied
  • Is it possible to do a multiple camera streaming in the VOXL m500?

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

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

    Unsolved
    2
    6
    0 Votes
    2 Posts
    631 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
    504 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