longer95479@home:~$

Drone Vibration


四旋翼无人机的飞行控制的反馈主要来自于 IMU,也就是加速度计和角速度计,其中角速度测量值对震动不敏感,而加速度测量值对震动十分敏感,若减震不佳,如机架有其他部件未上紧,或是桨叶严重受损,都会对带来高频的振动噪声,对飞行控制还有里程计的估计有“毁灭性的污染”。此时使用数字滤波,只会带来很大的相位延迟,仍然会导致控制的不稳定。因此只有从源头上解决震动,辅以软件数字滤波,才能得到较好的控制效果。 引用自 px4 的教程: A few of simple steps that may reduce vibrations are: Make sure everything is firmly...



[Paper Reading] TextSLAM: Visual SLAM With Semantic Planar Text Features


TPAMI 提供了室内和室外数据集,室内的真值由动捕提供,室外的真值由sfm提供(COLMAP) 几何信息 平面的参数化 如何表示 Text Patch 呢,换言之如何参数化呢? 类似光线投射,平面表示为 $\theta$,归一化平面上的点如果在平面上,使用$\rho = \theta ^T \tilde{m}$ 求得该点的深度,从而获得该点的 3D 坐标 这个 $\theta$ 如何求得呢?考虑空间上的平面方程,使用某一帧相机的相机坐标系:...



ssh a nx orin and make its docker pull work


问题场景:使用个人PC通过 ssh 连接到 orin nx,但由于网络问题,orin的 docker pull 命令无法正常使用。而个人pc已开启代理,端口为127.0.0.1:8889(具体地址端口可在 v2ray 的首选项里查看)。 解决思路则是将 ssh 的 orin 的本地端口8889 关联到个人pc的 127.0.0.1:8889 上,之后在docker的代理配置文件里配置代理地址端口为 127.0.0.1:8889。 使用...



[VINS-Fusion] Feature Manager

double FeatureManager::compensatedParallax2(const FeaturePerId &it_per_id, int frame_count)
{
  //check the second last frame is keyframe or not
  //parallax betwwen seconde last frame and third last frame
  const FeaturePerFrame &frame_i = it_per_id.feature_per_frame[frame_count - 2 - it_per_id.start_frame];
  const FeaturePerFrame &frame_j = it_per_id.feature_per_frame[frame_count - 1 - it_per_id.start_frame];

  double ans = 0;
  Vector3d p_j = frame_j.point;

  double u_j = p_j(0);
  double v_j = p_j(1);

  Vector3d p_i = frame_i.point;
  Vector3d p_i_comp;

  //int r_i = frame_count - 2;
  //int r_j = frame_count - 1;
  //p_i_comp = ric[camera_id_j].transpose() * Rs[r_j].transpose() * Rs[r_i] * ric[camera_id_i] * p_i;
  p_i_comp = p_i;
  double dep_i = p_i(2);
  double u_i = p_i(0) / dep_i;
  double v_i = p_i(1) / dep_i;
  double du = u_i - u_j, dv = v_i - v_j;

  double dep_i_comp = p_i_comp(2);
  double u_i_comp = p_i_comp(0) / dep_i_comp;
  double v_i_comp = p_i_comp(1) / dep_i_comp;
  double du_comp = u_i_comp - u_j, dv_comp = v_i_comp - v_j;

  ans = max(ans, sqrt(min(du * du + dv * dv, du_comp * du_comp + dv_comp * dv_comp)));

  return ans;
}

-->

feature manager 的主要数据结构为: class FeatureManager class FeaturePerId class FeaturePerFrame FeaturePerFrame 包括某帧内某个路标被观测的信息,如归一化平面坐标及速度、像素坐标、是否是双目、时间偏移。 FeaturePerId 则主要包括 vector<FeaturePerFrame> feature_per_frame,以及 frame_id、start_frame 等路标点个体级别的信息。值得注意的是,vins假设特征点是被连续观测到的,因此只记录开始的帧,即可推断出 vector 内其他观测所属的帧。 传入...

double FeatureManager::compensatedParallax2(const FeaturePerId &it_per_id, int frame_count)
{
  //check the second last frame is keyframe or not
  //parallax betwwen seconde last frame and third last frame
  const FeaturePerFrame &frame_i = it_per_id.feature_per_frame[frame_count - 2 - it_per_id.start_frame];
  const FeaturePerFrame &frame_j = it_per_id.feature_per_frame[frame_count - 1 - it_per_id.start_frame];

  double ans = 0;
  Vector3d p_j = frame_j.point;

  double u_j = p_j(0);
  double v_j = p_j(1);

  Vector3d p_i = frame_i.point;
  Vector3d p_i_comp;

  //int r_i = frame_count - 2;
  //int r_j = frame_count - 1;
  //p_i_comp = ric[camera_id_j].transpose() * Rs[r_j].transpose() * Rs[r_i] * ric[camera_id_i] * p_i;
  p_i_comp = p_i;
  double dep_i = p_i(2);
  double u_i = p_i(0) / dep_i;
  double v_i = p_i(1) / dep_i;
  double du = u_i - u_j, dv = v_i - v_j;

  double dep_i_comp = p_i_comp(2);
  double u_i_comp = p_i_comp(0) / dep_i_comp;
  double v_i_comp = p_i_comp(1) / dep_i_comp;
  double du_comp = u_i_comp - u_j, dv_comp = v_i_comp - v_j;

  ans = max(ans, sqrt(min(du * du + dv * dv, du_comp * du_comp + dv_comp * dv_comp)));

  return ans;
}
-->


[VINS-Fusion] Process Measurements


void Estimator::processMeasurements() 这个函数单独在一个线程内运行,无限循环,间隔2ms。 提取出各帧的特征点并收到了一系列的 IMU 数据后,就该开始处理这些数据了。 首先判断 featureBuf 队列是否为空,如果是空的,就什么也不做。若不空,则从 featureBuf 里提取出最早的特征点数据帧: void Estimator::processMeasurements() { while (1) { //printf("process measurments\n"); TicToc...



[VINS-Fusion] Feature Tracker


来自相机的图像被发布,缓存在 img0_buf 和 img1_buf 队列中,新图像放在 back,抽取 front 的图像进行特征追踪。如果是双目,不同步的会被按时间戳先后丢弃,只有双目图像帧的时间戳完全同步才会被使用。 InputImage() 和 InputIMU() 是前端。其实只有 InputImage() 是真正的前端,IMU的预积分其实是放在 processIMU() 里面。 一些重要的变量: // vins-mono class...



[Paper Reading] A Tutorial on Quantitative Trajectory Evaluation for Visual(-Inertial) Odometry


Quantitatively comparing the estimated trajectory with the groundtruth, however, is not an easy task. There are two major difficulties. First,...



Quaternion Conventions


Quaternion type Hamilton $JPL$ 1 Components s order $( q_w$ , $\mathbf{q} _v)$ $\left(\mathbf{q}_v\:,\:\right.$ $q_w)$ 2 $\operatorname{Algebra}$ Handedness $ij=k$ Right-...



px4ctrl understanding and tunning


状态机 Px4ctrl的状态机对象如下: class PX4CtrlFSM { public: // somedata private: State_t state; // Should only be changed in PX4CtrlFSM::process() function! AutoTakeoffLand_t...



[Paper Reading] Balancing the Budget: Feature Selection and Tracking for Multi-Camera Visual-Inertial Odometry using SE2(3) Based Exact IMU Pre-integration


The main contributions of this work are the following: A novel factor graph formulation that tightly fuses tracked features from...



Total views. cowboys. Hits