Vins-application: بعض المدخلات بخصوص D435i + vins_fusion

تم إنشاؤها على ١٦ سبتمبر ٢٠٢٠  ·  9تعليقات  ·  مصدر: engcang/vins-application

نظرًا لأنك واحد من القلائل الذين تمكنوا من تشغيل VINS-FUSION على وضع VIO ، أعود إليك لتوضيح بعض النقاط وطلب ملاحظاتك.

أحاول تشغيل VINS FUSION باستخدام D435i (مثل العديد من الأشخاص على ما أعتقد). باستخدام الإصدار المتاح realsense_stereo_imu_config.yaml ، لقد اختبرت ما قد أبلغ عنه الناس ، بمجرد لمس الكاميرا ، أصبح الوضع المحسوب مجنونًا.

لذلك استخدمت كاليبر:

  • لمعايرة الكاميرات وحصلت على النتيجة التالية:
cam0:
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [0.3775752250096366, -0.08329757139021714, 0.6504570262599587, -0.4530039925701512]
  distortion_model: equidistant
  intrinsics: [395.5922288679944, 395.5957501002353, 319.88738279106286, 239.07386401539998]
  resolution: [640, 480]
  rostopic: /camera/infra1/image_rect_raw
cam1:
  T_cn_cnm1:
  - [0.9999953397168069, 9.448668958037214e-05, 0.0030514942108417595, -0.04984248508758902]
  - [-9.749429725933605e-05, 0.9999995096576434, 0.0009854843073503579, 6.189814698173665e-05]
  - [-0.0030513995994150846, -0.0009857772179980872, 0.9999948585886561, 0.00015202509092000083]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [0.31220975539351176, 0.48299676137352554, -1.4010717249687126, 2.191483852686]
  distortion_model: equidistant
  intrinsics: [396.5827833428163, 396.75838144377565, 319.1950768721882, 238.53973946284336]
  resolution: [640, 480]
  rostopic: /camera/infra2/image_rect_raw

أعتقد أن المعايرة على ما يرام لأنني عندما أقوم بتشغيل VINS_FUSION باستخدام هذه المعلمات (imu = 0) ، حصلت على سلوك لائق. سأكون أكثر من سعيد لمشاركة تقرير pdf معك إذا لزم الأمر لأنني لست خبيرا في هذا المجال.

  • لم تكن معايرة الكاميرا IMu مستقيمة جدًا لأنني لا أمتلك كثافة الضوضاء وقيم المشي randm. لذلك استخدمت برنامج التباين Allan وبعض الرموز من matlab وحصلت على هذا من أجل التسريع
    allan_acc
accelerometer_noise_density: 0.0011060    #Noise density (continuous-time)
accelerometer_random_walk:   8.6056e-05    #Bias random walk

لكن من الواضح أنني متشكك في الدوران:
allan_gyro

لأن القيم كالتالي:

gyroscope_noise_density:     50.427    #Noise density (continuous-time)
gyroscope_random_walk:       0.3480    #Bias random walk

هنا أود أن آخذ رأيك في هذه القيم؟

ومع ذلك ، تمكنت من إجراء معايرة كاميرا imu:

cam0:
  T_cam_imu:
  - [0.999848715163262, 0.0018345448477758066, 0.017296856118190283, -0.009035083963879727]
  - [-0.001867318311452875, 0.999996491602708, 0.0018788040335944412, 0.002129300542443833]
  - [-0.01729334868368733, -0.0019108185351930207, 0.9998486329759259, -0.005593943362795322]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [0.3775752250096366, -0.08329757139021714, 0.6504570262599587,
    -0.4530039925701512]
  distortion_model: equidistant
  intrinsics: [395.5922288679944, 395.5957501002353, 319.88738279106286, 239.07386401539998]
  resolution: [640, 480]
  rostopic: /camera/infra1/image_rect_raw
  timeshift_cam_imu: -0.028184396371617668
cam1:
  T_cam_imu:
  - [0.9997911085949877, 0.0019231918046627172, 0.020347985347160178, -0.058894395640646836]
  - [-0.0019818392674274344, 0.999993939322739, 0.0028624519050287085, 0.0021865657711008357]
  - [-0.02034235698054308, -0.002902180399802527, 0.9997888606407872, -0.005416418875488448]
  - [0.0, 0.0, 0.0, 1.0]
  T_cn_cnm1:
  - [0.9999953397168102, 9.448668958037212e-05, 0.003051494210841759, -0.04984248508758902]
  - [-9.749429725933604e-05, 0.9999995096576467, 0.0009854843073503574, 6.189814698173665e-05]
  - [-0.003051399599415084, -0.0009857772179980868, 0.9999948585886594, 0.00015202509092000083]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [0.31220975539351176, 0.48299676137352554, -1.4010717249687126,
    2.191483852686]
  distortion_model: equidistant
  intrinsics: [396.5827833428163, 396.75838144377565, 319.1950768721882, 238.53973946284336]
  resolution: [640, 480]
  rostopic: /camera/infra2/image_rect_raw
  timeshift_cam_imu: -0.028184788415138273

أنا هنا أيضًا متفاجئ لأن تغيير الوقت سلبي! هل هو ممكن؟
فيما يتعلق بتحويل الكاميرا ، من مؤشر ترابط متعلق بـ VINS_FUSION ، فهمت أن body_T_cam0 / 1 هو التحول من إطار الكاميرا إلى إطار IMU

p = body_T_cam0 * q
p: point in IMU coordinates
q: point in camera coordinates

ومع Kalibr ، فإن T_cam_imu هي العناصر الخارجية لـ IMU: التحول من IMU إلى إحداثيات الكاميرا (T_c_i) ولكني في حيرة من أمري للحصول على التنسيق الصحيح الذي تستخدمه VINS_FUSION.

ومع ذلك ، على الرغم من كل هذا العمل ، ما زلت غير قادر على تشغيل VINS مع IMU. آسف لكونك طويلاً ولكن هل ترى شيئًا خاطئًا هنا قد يفسر سبب عدم عمله؟

شكرا جزيلا

التعليق الأكثر فائدة

تضمين التغريدة

  • نعم فعلا. أعتقد أن Pixhawk4 mini لديها IMU أفضل من D435i. لأن Pixhawk 4 mini يستخدم جهازي IMU 6DOF ومقياس مغناطيسي واحد ثم يقوم بتصفيةهما لإخراج موضوع ROS واحد (ليس متأكدًا بنسبة 100٪ من التصفية ، لكن لديهم وحدتا IMU).
  • لقد استخدمت 100 هرتز.
  • نعم ، لقد استخدمت PX4 و MAVROS. أتذكر أنه كان بإمكاني الحصول على حوالي 150 هرتز كحد أقصى ، ولكن من مكان ما رأيت أن نسبة 3: 1 لـ IMU والكاميرا FPS هي الأمثل لـ VINS. عادة ما نستخدم كاميرا 30 هرتز ، لذلك اعتقدت أن 100 هرتز مناسبة.

ال 9 كومينتر

FaboNo تمكنت من تشغيلها مع التكوين أدناه ، ولم أكن بحاجة إلى تشغيل

لقد استخدمت اليسار. yaml و right.yaml المقدمين في هذا الريبو

تأكد من إيقاف تشغيل التعريض التلقائي وإيقاف تشغيل باعث الأشعة تحت الحمراء في خيارات realsense ،

%YAML:1.0

#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam; 
imu: 1
num_of_cam: 2

imu_topic: "/camera/imu"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"
output_path: "/home/dji/output/"

cam0_calib: "left.yaml"
cam1_calib: "right.yaml"
image_width: 640
image_height: 480


# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.

body_T_cam0: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [  1,0,0,0.00552,
            0,1,0,-0.0051,
            0,0,1,-0.01174,
            0., 0., 0., 1. ]

body_T_cam1: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ 1,0,0,-0.04464144,
           0,1,0,-0.0051,
           0,0,1,-0.01174,
           0., 0., 0., 1. ]

#Multiple thread support
multiple_thread: 1

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 1           # publish tracking image as topic
flow_back: 1            # perform forward and backward optical flow to improve feature tracking accuracy

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.1          # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 0.01         # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 0.001         # accelerometer bias random work noise standard deviation.  #0.002
gyr_w: 0.0001       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.805         # gravity magnitude

#unsynchronization parameters
estimate_td: 1                      # online estimate time offset between camera and imu
td: -0.072                             # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)

#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "/home/dji/output/pose_graph/" # save and load path
save_image: 0                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

تضمين التغريدة أنا آسف جدا لتأخر الرد. لم أدرك أنني حصلت على مشكلة جديدة.

  1. بادئ ذي بدء ، أوصيك بمعايرة طراز الكاميرا بـ pinhold-radtan ، بدلاً من equidistant ، الذي استخدمته.

  2. بعد معايرة الكاميرا الصحيحة ، يرجى محاولة تشغيل VINS-Fusion بكاميرا 2 و 0 وضع imu.
    يجب أن يعمل جيدًا أولاً (في ظل حركات سهلة ، بدون حركة سريعة أو دوران خالص)

  3. تأكد من أن تعيين body_T_cam هو مصفوفة معكوسة لـ T_cam_imu من نتيجة Kalibr الخاصة بك.
    تحقق أيضًا من body_T_cam0 و 1 قبل تشغيل وضع الكاميراتين فقط (أعلاه).

  4. سالب timeshift_cam_imu هي القيمة العادية لـ d435i ، مما يعني أن الكاميرا أحدث من IMU.

  5. ليس عليك تشغيل كاليبر آلان لـ IMU calibraiton الخاص بك ، والذي لم يكن مناسبًا لـ d435i من أجل تجربتي ،
    بدلاً من ذلك ، وجدت نموذج IMU الخاص بـ d435i ثم استخدمت معلمة هذا النموذج المحدد كما هو الحال هنا

  6. ومع ذلك ، أوصي باستخدام الافتراضي فقط imu parameters كما هو الحال هنا
    يجب أن تكون كافية. (أو قم بزيادتها قليلاً ، مثل 3 أضعاف القيم الافتراضية)

  7. أوصيك بتشغيل IMU calibration من D435i SDK كما أوضحت هنا

تضمين التغريدة
بالمناسبة ، راجعت المعلمة الافتراضية / ملفات yaml من المؤلفين الأصليين لـ D435i تعمل جيدًا من قبل.
حتى مع جميع قيم التشويه 0 والأطوال البؤرية / قيم النقاط الرئيسية والقيم الاسمية body_T_cam .

أعتقد أن نتائج المعايرة الجوهرية للكاميرا equidistant مع قيم تشويه ضخمة هي المشكلة الرئيسية.

engcang شكرًا لك على رسالتك ، في الواقع تم تصحيح الصور بالفعل ، لذا فإن تشغيل Kalibr عليها يكاد يكون عديم الفائدة ، أليس كذلك؟
عند تصحيحها ، يجب أن يكون التشويه مساويًا للصفر أيضًا.

marufino شكرًا جزيلاً على رسالتك ،

تضمين التغريدة
أي أخبار عن هذا الموضوع؟ هل حصلت عليه العمل؟
لقد أتيحت لي مؤخرًا فرصة لاختبار VINS-Fusion (استريو) باستخدام Intel D435i وإليك مقطع النتيجة ، إذا كنت مهتمًا بذلك حتى الآن.

engcang أنا آسف للرد في وقت متأخر جدا. لقد شاهدت الفيديو وهو مثير للإعجاب. لذا لدي بعض الأسئلة لك ، وذلك أساسًا لأنك استخدمت PixHawk4.

  • هل يعني ذلك أن دقة وحدة IMU أفضل من دقة D435i؟
  • في أي تردد تقرأ بيانات IMU 100 هرتز ، 200 هرتز؟
  • هل استخدمت PX4 وإذا كان الأمر كذلك ، فهل استخدمت Mavros لقراءة البيانات؟ أنا شخصياً جربت PixHawk2 ولم يكن مقنعًا ولم أتمكن من زيادة تردد IMU لأكثر من 100 هرتز
    عمل جميل جدا!

تضمين التغريدة

  • نعم فعلا. أعتقد أن Pixhawk4 mini لديها IMU أفضل من D435i. لأن Pixhawk 4 mini يستخدم جهازي IMU 6DOF ومقياس مغناطيسي واحد ثم يقوم بتصفيةهما لإخراج موضوع ROS واحد (ليس متأكدًا بنسبة 100٪ من التصفية ، لكن لديهم وحدتا IMU).
  • لقد استخدمت 100 هرتز.
  • نعم ، لقد استخدمت PX4 و MAVROS. أتذكر أنه كان بإمكاني الحصول على حوالي 150 هرتز كحد أقصى ، ولكن من مكان ما رأيت أن نسبة 3: 1 لـ IMU والكاميرا FPS هي الأمثل لـ VINS. عادة ما نستخدم كاميرا 30 هرتز ، لذلك اعتقدت أن 100 هرتز مناسبة.

engcang أشكركم على ردكم. أتساءل هل قمت بتغيير قيم معلمات imu في realsense_stereo_imu_config.yaml أم احتفظت بها دون تغيير؟
سأحاول الإعداد الخاص بك على أي حال

تضمين التغريدة
أهلا. عادة ، لا أقوم بتغيير معلمات IMU في ملف yaml. حاولت أيضًا ضبط معلمات IMU كما حصلت عليها من Kalibr_allan ،
كيف لم أستطع الحصول على أداء أفضل باستخدامها.

فقط للحالات المجنونة مثل الروبوتات الرباعية التي تلامس الأرض بقوة ، أحاول ضبط المعلمات أكبر بعشر مرات أو أقل ، وهي تعمل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات