自动驾驶中无迹卡尔曼滤波器的应用(Unscented-Kalman-Filter)

2023-10-28

一、无迹卡尔曼滤波器

卡尔曼滤波适用于线性系统,针对于非线性系统很好推广应用。EKF(扩展卡尔曼滤波)利用线性化的方式,让状态和协方差在线性化方程中传播,但是面对强非线性,这种方式误差较大,因为高斯分布的噪声经过非线性系统的分布并不是高斯分布。UKF利用多个采样点(无迹变换)在非线性系统中传播,降低了随机变量经过非线性系统传播的误差,效果强于EKF。
与EKF(扩展卡尔曼滤波)不同,UKF是通过无损变换使非线性系统方程适用于线性假设下的标准Kalman滤波体系,而不是像EKF那样,通过线性化非线性函数实现递推滤波。目标跟踪有两个理论基础,即数据关联和卡尔曼滤波技术. 由于在实际的目标跟踪中,跟踪系统的状态模型和量测模型多是非线性的,因此采用非线性滤波的方法.

二、CTRV模型

在扩展卡尔曼滤波器(EKF)中,我们假设了速度是恒定的,但是这个在现实中显然是不可能的,现实中物体可能会转弯,可能会走弧线,所以EKF的预测精度相对就会较差,因为在EKF中,我们的状态向量是只确定了[Px,Py,vx,vy],没有考虑到转向,于是我们就有了新的模型,就是CTRV(恒定转弯率和速度幅度模型)模型。当然,模型不止一种,还有以下的几种模型:

恒定转动率和加速度(CTRA)
恒定转向角和速度(CSAV)
恒定曲率和加速度(CCA)
恒定转弯率和速度幅度模型(CTRV)

2.1 状态向量

对于CTRV模型,我们的状态向量为[Px,Py,v,ψ,ψ`]T,每一项的含义如下:

  • Px:X轴位置
  • Py:Y轴位置
  • v:速度的大小,是一个标量
  • ψ:偏航角,转向角
  • ψ`:偏航角速度,即转向角速度
    在这里插入图片描述

2.2 状态转移方程计算

2.2.1 确定部分

我们需要从上一个状态量来预测下一个状态,但是显然这个预测的关系我们没有办法直接从图上得出来,但是不着急,我们一步一步的推。
首先,我们可以根据状态算出其变化率(change rate of state):
在这里插入图片描述
所以在经过Δt之后,我们认为新的状态向量为:
在这里插入图片描述
这个看起来计算量很大,但是因为状态向量变化率比较特殊,所以没那么难算,经过变换如下图:
在这里插入图片描述
可以使用在线解积分的网站,例如这里

最终解出来是这样,这个是在ψ’k不为0的时候的解:
在这里插入图片描述

当ψ’k为0的时候,则
Px’的积分为:vkcos(ψk)Δt
Py’的积分为:vkcos(ψk)Δt
在这里插入图片描述

2.2.2 噪声

到此为止转移方程中确定的部分已经讨论完了,接下来就需要讨论不确定的部分,即各种噪声。
在这里插入图片描述
我们用一个二维向量来表示噪声向量:
在这里插入图片描述
这个向量是由两个相互独立的噪声组成,分别如下:
在这里插入图片描述
这个主要取决于物体的纵向加速度,所以每一个计算步骤中其实都是改变的。并且服从正态分布。均值是0,方差是σa2

在这里插入图片描述
这个主要取决于物体的角加速度,也是动态的。并且也服从正态分布。

所以我们把噪声加入状态转移方程;
在这里插入图片描述
在这里我们可以分别求出a,b,c,d,e。

  • a:
  • 在这里插入图片描述
  • b:
    在这里插入图片描述
  • c
    在这里插入图片描述
  • d
    在这里插入图片描述
  • e
    在这里插入图片描述
    因此有:
    在这里插入图片描述
    对于ψ’k不为0的时候:
    在这里插入图片描述
    ψ’k为0的时候:
    在这里插入图片描述

三、无迹卡尔曼滤波器

与EKF(扩展卡尔曼滤波)不同,UKF是通过无损变换使非线性系统方程适用于线性假设下的标准Kalman滤波体系,而不是像EKF那样,通过线性化非线性函数实现递推滤波。

3.1 无迹卡尔曼滤波思路

首先看下图,这是k时刻的状态向量和状态协方差:
在这里插入图片描述
其中椭圆表示协方差矩阵符合正态分布,我们要做的就是预测k+1时刻的状态向量和状态协方差。
在这里插入图片描述
如果是经过一个线性的变换,那么我们的结果,也就是k+1时刻的状态向量和协方差矩阵仍然符合正态分布。
但是如果时经过非线性的变换,那么就可能会像下图的黄线区域,不再符合正态分布。而UKF的目的,就是找到一个正态分布,尽量接近的去拟合这个非正态分布,例如图中的绿色椭圆。
在这里插入图片描述
那么我们的目标就变成了如何寻找这个拟合正态分布。

3.2 sigma点

想要使用非线性变换转换整个协方差分布椭圆非常困难,但是如果我们只转换几个点的话式比较容易的。这就是我们要找的sigma点。
sigma点的主要是通过每个状态向量维度经过一定的公式计算,算出的几个点。
在这里插入图片描述
如上图,在选好sigma点后,将sigma点带入非线性变换中,就可以得到变换后的sigma点分布,然后根据sigma点的分布拟合出新的一个高斯分布,那么这个高斯分布就基本认为与我们预测的新的状态向量和协方差矩阵相似,就可以认为式预测值。
PS:如果是线性变换,那么使用sigma点你和出来的其实就是普通的卡尔曼变换。

3.3 无迹卡尔曼滤波器的实现(预测)

3.3.1 计算sigma点

3.3.1.1计算方法

sigma点的数量取决于状态向量的维度,在这里,我们用的基于CTRV模型的状态向量的维度nx = 5,根据经验,我们认为选取nσ = 2nx+1个sigma点比较合适,所以这里选取的nσ为11。
其中,第一个点是状态向量的均值,然后其他的每个维度上都有两个点,从本维度上扩散
在这里插入图片描述

sigma点的计算公式如下图:
在这里插入图片描述
其中需要注意的是,λ是一个设计参数,可以选择sigma点的扩散方向,一般根据经验,
人们认为:
λ = 3 - nx
是一个比较合适的选择,同时矩阵的开方本来计算比较困难,但是我们可以直接使用函数计算给出。
其中xk∣k永远是第一列,
在这里插入图片描述
为第2列到第nx +1 列,
在这里插入图片描述
为第nx +2 列到第2nx +1 列。

3.3.1.2 关于噪声向量

在卡尔曼滤波器中,说到噪声向量,这个表述有时候不是很明确,有的时候是指下图红框:
在这里插入图片描述
这个噪声向量跟Δt相关,表示了在两个步骤之间每一个状态向量的维度所受的影响。一般在标准卡尔曼滤波器中是指这个。
而有的时候噪声向量是指这个:
在这里插入图片描述
这个向量只是列出了独立的噪声,没有说明这些噪声对于过程的影响。 在无迹卡尔曼滤波器中一般指这个。

我们知道噪声协方差矩阵Q的计算公式为:
在这里插入图片描述
Q的一个对角线上是0 是因为纵向加速度噪声和偏向角加速度噪声是独立的。

3.3.1.3 带噪声的sigma点计算

因此当我们考虑到噪声,我们就需要使用增广矩阵,我们的状态向量就变成了
在这里插入图片描述
所以nx = 7,那么nσ = 2na+1 = 15。
这个时候增广协方差矩阵就是:
在这里插入图片描述

3.3.2 sigma点的预测

对于sigma点的预测,这里比较简单,只需要将其带入到我们之前根据模型得出的非线性变换的公式中,但是值得注意的是,我们输入的状态向量是带有噪声的,但是预测的状态向量是不带噪声的,因此需要做一个维度上的变换。

在这里插入图片描述

  VectorXd a = VectorXd(n_x_);
  VectorXd u = VectorXd(n_x_);
  VectorXd xk = VectorXd(n_x_);
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    double p_x = Xsig_aug(0,i);
    double p_y = Xsig_aug(1,i);
    double v = Xsig_aug(2,i);
    double yaw = Xsig_aug(3,i);
    double yaw_dot = Xsig_aug(4,i);
    double nu_a = Xsig_aug(5,i);
    double nu_yawdd = Xsig_aug(6,i);
    xk = Xsig_aug.col(i).segment(0, n_x_); // 7 => 5
    u[0] = 0.5 * (delta_t * delta_t) * cos(yaw) * nu_a;
    u[1] = 0.5 * (delta_t * delta_t) * sin(yaw) * nu_a;
    u[2] = delta_t * nu_a;
    u[3] = 0.5 * (delta_t * delta_t) * nu_yawdd;
    u[4] = delta_t * nu_yawdd;

    //avoid division by zero
    if (fabs(yaw_dot) > 0.001)
    {
      a(0) = (v / yaw_dot) * (sin(yaw + yaw_dot * delta_t) - sin(yaw));
      a[1] = (v / yaw_dot) * (cos(yaw) - cos(yaw + yaw_dot * delta_t));
      a[2] = 0;
      a[3] = yaw_dot * delta_t;
      a[4] = 0;
    }
    else
    {
      a[0] = v * cos(yaw) * delta_t;
      a[1] = v * sin(yaw) * delta_t;
      a[2] = 0;
      a[3] = yaw_dot * delta_t;
      a[4] = 0;
    }
    //write predicted sigma points into right column
    Xsig_pred_.col(i) = xk + a + u;
  }

3.3.3 均值和方差的预测

我们使用权重来根据sigma点计算预测的均值和协方差矩阵,具体公式如下,其中i是每一列:
在这里插入图片描述
因此,我们就需要计算对于每一列的权重:
在这里插入图片描述
我们看到权重的计算主要是跟λ相关,λ是一个设计参数,可以选择sigma点的扩散方向,所以我们在计算权重的时候也是考虑的这个参数。
因此,X和P的计算公式就是:
在这里插入图片描述

  weights_ = VectorXd(2 * n_aug_ + 1);
  weights_(0) = lambda_ / (lambda_ + n_aug_);
  for (int i = 1; i < 2 * n_aug_ + 1; i++)
  {
    weights_(i) = 1 / (2 * (lambda_ + n_aug_));
  }
  //mean
   x_.fill(0.);   // important 
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    x_ += weights_(i) * Xsig_pred_.col(i);
  }
  //Covariance
  P_.fill(0.); //important
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    VectorXd x_diff = Xsig_pred_.col(i) - x_;

    /*
	这里涉及到了角度,所以需要将角度标准化
    */
    while (x_diff(3) > M_PI)
      x_diff(3) -= 2. * M_PI;
    while (x_diff(3) < -M_PI)
      x_diff(3) += 2. * M_PI;
    P_ += weights_(i) * x_diff * x_diff.transpose();
  }

3.4 无迹卡尔曼滤波器的实现(更新)

3.4.1 预测测量结果

到目前为止,我们已经成功的使用了k时刻的状态预测了k+1时刻的状态,我们需要将状态向量转换到测量向量空间(即将状态向量转化成与测量向量相同的结构)。
这个过程仍然是一个非线性的变换,所以是以下的一个过程:
在这里插入图片描述
因为是一个非线性的变换,其实我们在这里还可以使用相同的方式,即选取sigma点,然后变换,然后拟合。但是这里我们可以偷一下懒,我们可以直接使用现成的我们之前计算过的sigma点,所以可以少计算一步。
所以整体的计算步骤和公式如下图:
在这里插入图片描述

3.4.1.1 雷达数据的处理

对于雷达来说,我们测量到的数据是一个三维的空间,所以我们要将sigma进行一个转换,如下图:
在这里插入图片描述
需要用到的公式有:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//set measurement dimension, radar can measure r, phi, and r_dot
  int n_z = 3;
  // measurement covariance noise matrix R
  MatrixXd R = MatrixXd(n_z, n_z);
  R << std_radr_ * std_radr_, 0, 0,
      0, std_radphi_ * std_radphi_, 0,
      0, 0, std_radrd_ * std_radrd_;

  //create matrix for sigma points in measurement space
  MatrixXd Zsig = MatrixXd(n_z, 2 * n_aug_ + 1);

  //mean predicted measurement
  VectorXd z_pred = VectorXd(n_z);

  //measurement covariance matrix S
  MatrixXd S = MatrixXd(n_z, n_z);

  //transform sigma points into measurement space
  //calculate Zsig
  Zsig.fill(0.);
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    double px = Xsig_pred_(0,i);
    double py = Xsig_pred_(1,i);
    double v = Xsig_pred_(2,i);
    double yawd = Xsig_pred_(3,i);

    double ro = sqrt(px * px + py * py);
    double theta = atan2(py, px);
    double ro_dot = (px * cos(yawd) * v + py * (sin(yawd) * v)) / ro;


    Zsig(0,i) = ro;
    Zsig(1,i) = theta;
    Zsig(2,i) = ro_dot;
  }

  //calculate mean predicted measurement
  z_pred.fill(0.0);
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    z_pred += weights_(i) * Zsig.col(i);
  }
  
  std::cout << "z_pred R:" << z_pred << std::endl;
  //calculate measurement covariance matrix S
  S.fill(0.0);
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    VectorXd z_diff = Zsig.col(i) - z_pred;
    //angle normalization
    while (z_diff(1) > M_PI)
      z_diff(1) -= 2. * M_PI;
    while (z_diff(1) < -M_PI)
      z_diff(1) += 2. * M_PI;
    S += weights_(i) * (z_diff) * (z_diff).transpose();
  }
  S = S + R;

3.4.1.2 激光雷达数据的处理

对于激光雷达,我们测量到的数据是一个二维的空间,所以有:

  //set measurement dimension,px,py
  int n_z = 2;
  // measurement covariance noise matrix R
  MatrixXd R = MatrixXd(n_z, n_z);
  R << std_laspx_ * std_laspx_, 0,
      0, std_laspy_ * std_laspy_;

  //create matrix for sigma points in measurement space
  MatrixXd Zsig = MatrixXd(n_z, 2 * n_aug_ + 1);
  Zsig.fill(0.);

  //mean predicted measurement
  VectorXd z_pred = VectorXd(n_z);

  //measurement covariance matrix S
  MatrixXd S = MatrixXd(n_z, n_z);

  //transform sigma points into measurement space
  //calculate Zsig
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    // VectorXd x = Xsig_pred_.col(i);
    // double px = x(0);
    // double py = x(1);

    // Zsig.col(i)(0) = px;
    // Zsig.col(i)(1) = py;
    Zsig(0, i) = Xsig_pred_(0, i);
    Zsig(1, i) = Xsig_pred_(1, i);
  }

  //calculate mean predicted measurement
  z_pred.fill(0.); // important
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    z_pred += weights_(i) * Zsig.col(i);
  }

  //calculate measurement covariance matrix S
  S.fill(0.); // important
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    VectorXd z_diff = Zsig.col(i) - z_pred;
    S += weights_(i) * (z_diff) * (z_diff).transpose();
  }
  S = S + R;

3.4.2 UKF 更新

在这一步,我们终于要引入测量值,就是比我们实际上从传感器上拉取回来的值,这里需要 计算的是卡尔曼增益K,在计算过程中,我们需要用到一个相关矩阵,用来表示状态空间中的sigma点和测量空间中的sigma点的关系。
在这里插入图片描述
所以卡尔曼增益K就是
在这里插入图片描述
状态向量和协方差矩阵的更新为:
在这里插入图片描述
在这里插入图片描述

3.4.2.1 雷达数据更新

 //create matrix for cross correlation Tc
  MatrixXd Tc = MatrixXd(n_x_, n_z);
  // T
  Tc.fill(0.); //important
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    VectorXd t_x_diff = (Xsig_pred_.col(i) - x_);
    while (t_x_diff(3) > M_PI)
      t_x_diff(3) -= 2. * M_PI;
    while (t_x_diff(3) < -M_PI)
      t_x_diff(3) += 2. * M_PI;
    VectorXd z_diff = Zsig.col(i) - z_pred;
    //angle normalization
    while (z_diff(1) > M_PI)
      z_diff(1) -= 2. * M_PI;
    while (z_diff(1) < -M_PI)
      z_diff(1) += 2. * M_PI;
    Tc += weights_(i) * t_x_diff * ((z_diff).transpose());
  }
  // std::cout << "Tc R:" << Tc << std::endl;
  MatrixXd K = Tc * (S.inverse());
  // std::cout << "K R:" << K << std::endl;

  //measurement of radar data
  VectorXd z = VectorXd(n_z);
  z << meas_package.raw_measurements_(0),
      meas_package.raw_measurements_(1),
      meas_package.raw_measurements_(2);
  // std::cout << "Z measurement:" << z << std::endl;

  VectorXd z_diff = z - z_pred;

  while (z_diff(1) > M_PI)
    z_diff(1) -= 2. * M_PI;
  while (z_diff(1) < -M_PI)
    z_diff(1) += 2. * M_PI;

  //update state mean and covariance matrix
  x_ = x_ + K * z_diff;
  P_ = P_ - K * S * K.transpose();

3.4.2.2 激光雷达数据更新

 //create matrix for cross correlation Tc
  MatrixXd Tc = MatrixXd(n_x_, n_z);
  Tc.fill(0);  // important
  // T
  for (int i = 0; i < 2 * n_aug_ + 1; i++)
  {
    VectorXd t_x_diff = (Xsig_pred_.col(i) - x_);
    VectorXd z_diff = Zsig.col(i) - z_pred;
    Tc += weights_(i) * t_x_diff * ((z_diff).transpose());
  }
  MatrixXd K = Tc * (S.inverse());
  //measurement of lidar data
  VectorXd z = VectorXd(n_z);
  z << meas_package.raw_measurements_(0),
      meas_package.raw_measurements_(1);

  VectorXd z_diff = z - z_pred;

  //update state mean and covariance matrix
  x_ = x_ + K * z_diff;
  P_ = P_ - K * S * K.transpose();

四、关于噪声

对于我们的CTRV模型,我们的噪声有两个:

  • σa2,代表了纵向加速度噪声,也可以理解为线性加速度噪声。
  • σψ’'2,代表了角加速度噪声。

在项目中,这两个值往往是来源于硬件的参数,也需要进行一些调整,通常需要一些预估,可以使用被追踪物体的最大加速度的一半作为参考值,然后进行微调。

通常要重复这个过程多次:

  • 猜一个差不多的参考值
  • 运行UKF
  • 观察结果是否满意
  • 调整参数重试

在这里我们使用卡方分布查表来获取相应的比较合适的噪声值。

五、完整代码

完整代码可以参考我的github

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动驾驶中无迹卡尔曼滤波器的应用(Unscented-Kalman-Filter) 的相关文章

  • 无人驾驶(四)---远程桌面控制工具: NoMachine踩坑记录

    NoMachine for mac是一款免费的远程桌面访问工具 xff0c 这款软件的连接到远程桌面后延迟可以非常低 xff0c NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力 xff0c 打破空间和时间的障碍 xff0c 让您
  • 无人驾驶-激光雷达与相机联合校准(Lidar Camera Calibration)

    1 激光雷达与摄像头性能对比 在无人驾驶环境感知设备中 xff0c 激光雷达和摄像头分别有各自的优缺点 摄像头的优点是成本低廉 xff0c 用摄像头做算法开发的人员也比较多 xff0c 技术相对比较成熟 摄像头的劣势 xff0c 第一 xf
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • 汽车智能座椅系统

    概述 自动驾驶领域日渐成熟 将催生一些新应用场景 如休闲 娱乐 社交和健康等 传统的座椅控制系统无法满足人们新的需求 更安全 更舒适 智能化及健康化体验将成为未来智能座椅的方向 恒润凭借汽车电子技术的积累 能够提供智能汽车座椅的解决方案 为
  • qnx的触摸校准calib_校准工具使用教程

    锋影 email 174176320 qq com 环境配置 Hardware TI OMAPL138 Board OS QNX Neutrino 6 5 0 BSP bsp nto640 ti omap l138 evm trunk 20
  • Kanzi入门学习教程

    锋影 e mail 174176320 qq com 1 安装Kanzi 2 使用Kanzi studio创建工程 Kanzi创建的工程会包含以下目录结构 其中 Tool project文件夹中存放的是设计师设计的工程 包含kanzi UI
  • NVIDIA 不同显卡对应的GPU计算能力

    转自 https blog csdn net dlhlsc article details 85088280 Fermi CUDA 3 2 until CUDA 8 deprecated from CUDA 9 SM20 or SM 20
  • 基于视觉的移动平台运动目标检测

    1 声明 本文为自己的研究总结 主要根据各类文献总结而来 内容上可能有些不全面 不客观 这篇博文主要介绍的是基于视觉的移动平台运动目标检测 写这篇博文的目的主要是对自己一个阶段性总结 也希望能够帮助做这方面研究的同学 2 引言 首先 我们来
  • STM32--CAN ID过滤器分析

    1 前言 在CAN协议里 报文的标识符不代表节点的地址 而是跟报文的内容相关的 因此 发送者以广播的形式把报文发送给所有的接收者 节点在接收报文时 根据标识符 CAN ID 的值决定软件是否需要该报文 如果需要 就拷贝到SRAM里 如果不需
  • QNX网络驱动-设备驱动编写处理方式

    锋影 e mail 174176320 qq com 第一部分 QNX系统的安装与使用 1 QNX的微内核 甚至不包括进程管理 仅提供进程间的通信 Software Bus 但在实际编译的系统中 仍然是进程调度 同步 进程间通信等编译在同一
  • 五大车载操作(VOS)系统优劣对比,车载系统架构分析-QNX系统性能分析

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 导读 车载操作
  • STM32—CAN通信

    文章目录 一 CAN通信简介 1 1 CAN简介 1 2 CAN协议特点 1 3 CAN通信的帧类型 1 4 数据帧结构 1 5 CAN的位时序 1 6 CAN的仲裁功能 二 STM32F1的CAN 2 1 bxCAN简介 2 2 bxCA
  • 漫谈 SLAM 技术(下)

    转自 https zhuanlan zhihu com p 135958593 3 视觉SLAM系统关键问题 结合上述介绍的SLAM系统 我们从以下几个方面分析视觉SLAM系统需要考虑的关键问题 1 图像信息使用 视觉SLAM方法根据使用图
  • 斑马网络和荣威RX5深度研究

    锋影 email 174176320 qq com 佐智汽车就李想的观点访谈了两位业内专家 他们的回答如下 专家A 这个是需求推动 有需求就有人做 特斯拉用Linux一样有地图 Android过于复杂 可靠性问题比Linux大几个数量级 做
  • Bootloader

    Bootloader 一段有下载和引导功能的程序 下载应用程序 引导使MCU运行在应用程序中 只在有更新请求或者APP无效的时候才会激活 APP和Bootloader都存在Flash中 Flash Driver用来擦除APP 下载临时存放在
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • KITTI数据集--参数

    一 kitti数据集 label解析 16个数代表的含义 第1个字符串 代表物体类别 Car Van Truck Pedestrian Person sitting Cyclist Tram Misc or DontCare 注意 Dont
  • 《学习篇》学会这18个常用ROS命令集合就能入门ROS了

    常用ROS命令概述 ROS常用命令可以按照其使用场景分为ROSshell命令 ROS执行命令 ROS信息命令 ROS catkin命令与ROS功能包命令 虽然很难从一开始就很熟练地使用所有的命令 但是随着使用的次数增多 你会发现常用的几个R
  • RTK、PPP与RTK-PPP?一文带您认识高精定位及如何进行高精定位GNSS测试!(一)

    来源 德思特测试测量 德思特干货丨RTK PPP与RTK PPP 一文带您认识高精定位及如何进行高精定位GNSS测试 一 原文链接 https mp weixin qq com s 6Jb3DuJEhRGqFPrH3CX8xQ 欢迎关注虹科

随机推荐

  • 数字电路中几种基本门电路

    一 概述 1 门电路 实现基本运算 复合运算的单元电路 例如与门 与非门 或门等 门电路中以0或者1表示高低电平 2 获得高低电平的基本原理 对于电阻R有一些说明 电阻R的取值不宜太大也不宜太小 输出高电平电阻R充当电压源内阻的作用 为了保
  • 记录好项目D14

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个网上花店商城 一 系统介绍 包括管理员 普通用户两种角色 外加游客 未登录情况 权限 游
  • 栈和队列OJ

    一 括号的匹配 题目介绍 思路 如果 c 是左括号 则入栈 push 否则通过哈希表判断括号对应关系 若 stack 栈顶出栈括号 stack pop 与当前遍历括号 c 不对应 则提前返回 false 栈 stack 为空 此时 stac
  • idc服务器排名戴尔型号,IDC公布2019年全球服务器市场数据:戴尔、HPE和浪潮分列前三...

    日前 IDC发布2019年第四季度及全年全球服务器市场调查数据 2019年全球服务器出货量和销售额分别为1174万台和873亿美元 同比轻微下降0 9 和1 7 其中四季度全球服务器市场增长旺盛 销售额和出货量分别同比增长7 5 和14 0
  • 【每日一题】另类加法

    题目来源 牛客网 链接 另类加法 题目描述 给定两个int A和B 编写一个函数返回A B的值 但不得使用 或其他算数运算符 测试样例 1 2 返回 3 解题思路 本题可以通过位运算实现 具体实现如下 二进制位异或运算相当于对应位相加 不考
  • GUI设计篇

    一 Matlab GUIDE 在MATLAB的命令行窗口中键入guide可以打开GUIDE 这个命令将打开GUIDE Quick Start对话框 它可以看作是一个简单的GUI应用程序的开发向导 利用它可以使用鼠标方便地在窗体上添加各种各样
  • 粒子群优化算法(PSO)及Matlab实现

    粒子群优化算法 Particle Swarm Optimization PSO 于1995年由美国社会心理学家James Kennedy和电气工程师Russell Eberhart受对鸟类群体行为进行建模和仿真研究结果的启发共同提出 通过对
  • 手撸代码-找到环入口

    题目 给一个链表 若其中包含环 请找出该链表的环的入口结点 否则 返回null 思路 1 使用两个指针 快指针与慢指针 慢指针一次走一步 快指针一次走两步 2 两个指针都从A点出发 假设B点是环的入口 如果有环的话 两个指针一定会重合 重合
  • Windows上使用pip安装python opencv

    Windows上使用pip安装python opencv opencv python 只包含opencv库的主要模块 opencv contrib python 包含主要模块和contrib模块 建议您安装的库 因为它包含所有OpenCV功
  • 计算机网络原理-应用层

    应用层 应用层 位于OSI参考模型的第7层 提供了人们所有的应用程序与下层网络的接口 通过下层网络传递信息 现在有很多应用层的协议 一般情况只要和用户相关的程序基本都属于应用层的范畴 早期的OSI参考模型高3层 会话层 表示层与应用层 与T
  • C++中的虚函数表介绍

    在C 语言中 当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定 因为我们直到运行时才能知道到底调用了哪个版本的虚函数 所以所有虚函数都必须有定义 通常情况下 如果我们不使用某个函数 则无须为该函数提供定义 但是我们必须为每一个虚
  • 几种不同的推荐引擎比较

    以前也用了一些推荐算法写过一些应用 最近用上了网易云音乐 于是便想写篇推荐引擎的文章 一 推荐引擎 主动发现用户当前或潜在需求 并主动推送信息给用户的信息网络 挖掘用户的喜好和需求 主动向用户推荐其感兴趣或者需要的对象 二 推荐引擎的分类
  • Allegro学习笔记---2.新建PCB+导入网表+元器件快速导入PCB

    一 前期准备 1 将需要用到的PCB封装库和焊盘库准备好 如下图 一般是将 dra psm pad文件都放到同一个文件夹A下面 dra 可编辑的pcb封装文件 psm 被调用的pcb封装文件 不可编辑 pad 焊盘文件 2 先用orcad
  • 如何修改AD中PCB背景黑色域的大小

    方法 1 先将pcb选在keep out layer层 2 用线命令画出一个封闭的区域 得封闭 线命令就是line 选择多条封闭区域可用shift键 3 选中如图上个命令就可以 操作过程可能遇到的问题 遇到这个问题是因为 封闭区域没有全选中
  • Tecplot绘制流体后处理图的问题

    使用的软件为Tecplot Chorus 2017 R3 来处理Fluent17 0的流体仿真数据 看了点击打开链接的官方文档 一直没有搞清楚什么样的格式可以像他给出的一样做多组数据的对比 一开始导入fluent计算产生的data文件 发现
  • 全国计算机等级考试C语言(未来教育平台)

    未来教育 全国计算机等级考试 qq com https mp weixin qq com s biz MzkyNjQwODc2MA mid 2247483676 idx 1 sn 96daf350e5cb0542bbab621cbc8434
  • 步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)...

    Move Method 概述 程序中 有个函数与其所驻class之外的另一个class进行更多交流 调用后者或被后者调用 动机 Motivation 如果一个class有太多行为 或如果一个class与另一个class有太多合作而形成高度耦
  • 时间全局过滤器 vue 用法

    min js 定义一个全局过滤器 Vue filter dataFormat function input pattern var dt new Date input 获取年月日 var y dt getFullYear var m dt
  • 将python项目用docker 部署到服务器上的全过程

    任务描述 由于笔记本算力有限 要将python项目部署到服务器上 在查阅了大量资料后 踩了无数坑后 今天记录一下全过程 希望对大家有帮助 配置要求 需要部署的python项目 虚拟机 linus docker安装 服务器端口 大致流程 1
  • 自动驾驶中无迹卡尔曼滤波器的应用(Unscented-Kalman-Filter)

    无迹卡尔曼滤波 一 无迹卡尔曼滤波器 二 CTRV模型 2 1 状态向量 2 2 状态转移方程计算 2 2 1 确定部分 2 2 2 噪声 三 无迹卡尔曼滤波器 3 1 无迹卡尔曼滤波思路 3 2 sigma点 3 3 无迹卡尔曼滤波器的实