HCY_Graduation_Project/include/Car.h

120 lines
5.3 KiB
C++

/**
* @file Car.cc
* @author hong chu yuan (924273410@qq.com)
* @brief 车辆的实现文件
* @version 0.1
* @date 2023-03-30
*
* @copyright Copyright (c) 2023
*
*/
#ifndef CAR_H
#define CAR_H
#include <vector>
#include <opencv2/core/core.hpp>
#include "Frame.h"
#include <vector>
#include <random>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
namespace ORB_SLAM2
{
class KeyFrame;
class Map;
class Frame;
class Car
{
public:
Car(Frame &CurrentFrame, vector<double> &bbox);
bool isBad(); // 查询这个车是否长时间未观测
/**
* @brief 更新速度和位置
* @param pose 目标中心的世界坐标
* @param delta_t 间隔时间
* @param vp_c 目标框顶点的像素坐标
* @param Rwc 相机的旋转
* @param twc 相机的平移
*
*/
void updateVelocityAndPose(cv::Mat &pose, double &delta_t, vector<cv::Point> &vp_c, cv::Mat &Rwc, cv::Mat &twc); // 更新车辆速度
bool isTracked();
bool isStatic();
void updateObservations(int CurrentFrameId); // 更新观测
void updateState(vector<double> &bbox, cv::Mat &Rwc, cv::Mat &twc, double &delta_t); // 更新速度及是否持续观测
/**
* @brief bev坐标转世界坐标
* @param vp_c 像素坐标
* @param Rwc 相机的旋转
* @param twc 相机的平移
* @param vmBboxWorldPose 世界坐标,输出值
*
*/
void bev2world(vector<cv::Point> &vp_c, vector<cv::Mat> &vmBboxWorldPose, cv::Mat &Rwc, cv::Mat &twc); // bev的目标框坐标转世界坐标
void bev2world(cv::Point &carBev, cv::Mat &CarWorldPose, cv::Mat &Rwc, cv::Mat &twc); // bev中心转世界坐标
void setTrackedState(bool state); // 设置状态
void update_untracked_Car(); // 更新 没有被当前目标框追踪到的目标位姿
void get_bbx(const vector<double> &label1, std ::vector<cv::Point> &pts); // 获取目标框的四个点坐标
void updateTrackState(int ID); // 更新跟踪状态
void matrix_inv(cv::Mat T, cv::Mat T_inv); // 矩阵求逆
void updatetraj(); // 更新轨迹
void SetColor(); // 轨迹颜色
double get_Vel(double &t);
bool isErro();
void InCreaseFound(cv::Mat Tcw);
void world2bev(vector<cv::Mat> &vm_3d_w, vector<cv::Point> &vp_bev, cv::Mat &Tcw); // 世界坐标转bev像素
bool isInSight();
void kalmanfilter(Eigen::Vector2f &yk, double delta_t);
void Save_car_v();
public:
int mnCar_ID;
cv::Mat mmVelocity; // 车速
vector<cv::Mat> mvmBboxWorldPose; // 目标框
vector<cv::Mat> mvmBboxWorldPosePredict; // 预估的目标框位置
cv::Mat m_bev_K; // bev内参矩阵
cv::Mat m_bev_K_inv; // bev内参矩阵的逆
cv::Mat mRcl, mtcl; // 速度
vector<pair<int, int>> mv_pair_connect; // 观测关系:帧序号-bbox序号
cv::Mat mCarWorldPose; // 目标框世界坐标
int mvLostTrackTimes; // 是否持续丢失
cv::Mat mRbw; // 相机->bev的变换
double mdelta_w; // 角速度
double myaw; // 偏航角
bool mnTracked; // 是否被跟踪
vector<cv::Point3f> mtraj; // 轨迹
double mr; // 色彩
double mg; // 色彩
double mb; // 色彩
double mV; // m/s
int mvStatic;
cv::Mat Tow;
int mnVisual; // 观测次数 TODO 观测次数过少需要删除
bool mbErro; // 是否需要剔除
Eigen::Matrix<float, 2, 4> mkalman_H; // 卡尔曼滤波H矩阵
Eigen::Matrix2f mkalman_R = 0.8 * Eigen::Matrix2f::Identity(); // 卡尔曼滤波R矩阵
Eigen::Vector4f mmk_1;
Eigen::MatrixXf mPK_1 = Eigen::Matrix4f::Zero();
vector<cv::Point2f> mvpose; // 存储车辆每一时刻的位置信息
vector<cv::Point2f> mvvelocity; // 存储车辆每一时刻的位置信息
protected:
int mnLastFrameID; // 最后一次观测该车
int mnFirstFrameID; // 最初观测该车
bool mbBad; // 是否跟踪丢失
bool mbStatic; // 是否静态
int mnInsight; // 是否在视野内
bool mbInsight;
};
}
#endif // CAR_H