日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化

發布時間:2023/12/18 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹VINS的閉環檢測重定位與位姿圖優化部分,作為系列文章的最后一節。

回環檢測的關鍵就是如何有效檢測出相機曾經經過同一個地方,這樣可以避免較大的累積誤差,使得當前幀和之前的某一幀迅速建立約束,形成新的較小的累積誤差。由于回環檢測提供了當前數據與所有歷史數據的關聯,在跟蹤算法丟失后,還可以利用重定位。

論文中主要分為兩部分:回環檢測與重定位4-DOF的位姿圖優化

第一部分主要是為了通過回環檢測找到當前幀和候選幀的聯系,并通過簡單的緊耦合重定位將局部滑動窗口移動與過去的位姿對齊。

第二部分是為了保證基于重定位結果對過去的所有位姿進行全局優化。

論文中內容為

0.4 重定位

vins的重定位模塊主要包含回環檢測,回環候選幀之間的特征匹配,緊耦合重定位三個部分

A、回環檢測(只對關鍵幀)

1、采用DBoW2詞袋位置識別方法進行回環檢測。經過時間空間一致性檢驗后,DBoW2返回回環檢測候選幀。

2、除了用于單目VIO的角點特征外,還添加了500個角點并使用BRIEF描述子,描述子用作視覺詞袋在數據庫里進行搜索。這些額外的角點能用來實現更好的回環檢測。

3、VINS只保留所有用于特征檢索的BRIEF描述子,丟棄原始圖像以減小內存。

4、單目VIO可以觀測到滾動和俯仰角,VINS并不需要依賴旋轉不變性。

B、回環候選幀之間的特征匹配

1、檢測到回環時,通過BRIEF描述子匹配找到對應關系。但是直接的描述子匹配會導致很多外點。

2、本文提出兩步幾何剔除法:

1)2D-2D:使用RANSAC進行F矩陣測試,

2)3D-2D:使用RANSAC進行PnP,基于已知的滑動窗特征點的3D位置,和回路閉合候選處圖像的2D觀測(像素坐標)。

當內點超過一定閾值時,我們將該候選幀視為正確的循環檢測并執行重定位。

C、緊耦合重定位

1、重定位過程使單目VIO維持的當前滑動窗口過去的位姿圖對齊

2、將所有回環幀的位姿作為常量,利用所有IMU測量值局部視覺測量和從回環中提取特征對應值,共同優化滑動窗口。

?0.5 全局位姿圖優化

A、位姿圖中添加關鍵幀

B、4自由度位姿圖優化

C、位姿圖管理


?

相關代碼都在pose_graph文件中,主要分為三個程序,分別為:

  • keyframe.cpp/.h 構建關鍵幀類、描述子計算、匹配關鍵幀與回環幀
  • pose_graph.cpp/.h 位姿圖的建立與圖優化、回環檢測與閉環
  • pose_graph_node.cpp ROS 節點函數、回調函數、主線程

1、pose_graph_node.cpp

主要分為7個回調函數以及主線程process()函數。

7個回調函數:包括關鍵幀的位姿(keyframe_pose)、重定位位姿(relo_relative_pose)、相機到IMU的外參估計(extrinsic)、VIO里程計信息PQV(odometry)、關鍵幀中的3D點云(keyframe_point)、IMU傳播值(imu_propagate)。
?

  • ROS初始化,設置句柄

  • 從launch文件讀取參數和參數文件config中的參數

  • 如果需要進行回環檢測則讀取詞典和BRIEF描述子的模板文件,同時讀取config中的其他參數、設置帶回環的結果輸出路徑。

  • 加載先前位姿圖?loadPoseGraph()

  • 訂閱各個topic并執行各自回調函數

  • 發布/pose_graph的topic

  • 設置主線程 process() 和鍵盤控制線程 command()

  • int main(int argc, char **argv) {// 1.ROS初始化,設置句柄ros::init(argc, argv, "pose_graph");ros::NodeHandle n("~");posegraph.registerPub(n);// 2.讀取參數n.getParam("visualization_shift_x", VISUALIZATION_SHIFT_X);n.getParam("visualization_shift_y", VISUALIZATION_SHIFT_Y);n.getParam("skip_cnt", SKIP_CNT);n.getParam("skip_dis", SKIP_DIS);std::string config_file;n.getParam("config_file", config_file);cv::FileStorage fsSettings(config_file, cv::FileStorage::READ);if(!fsSettings.isOpened()){std::cerr << "ERROR: Wrong path to settings" << std::endl;}double camera_visual_size = fsSettings["visualize_camera_size"];cameraposevisual.setScale(camera_visual_size);cameraposevisual.setLineWidth(camera_visual_size / 10.0);LOOP_CLOSURE = fsSettings["loop_closure"];std::string IMAGE_TOPIC;int LOAD_PREVIOUS_POSE_GRAPH;//3.如果需要進行回環檢測則讀取詞典和BRIEF描述子的模板文件,同時讀取config中的其他參數、設置帶回環的結果輸出路徑。if (LOOP_CLOSURE){ROW = fsSettings["image_height"];COL = fsSettings["image_width"];// 3.1讀取字典std::string pkg_path = ros::package::getPath("pose_graph");string vocabulary_file = pkg_path + "/../support_files/brief_k10L6.bin";cout << "vocabulary_file" << vocabulary_file << endl;posegraph.loadVocabulary(vocabulary_file);// 3.2讀取BRIEF描述子的模板文件BRIEF_PATTERN_FILE = pkg_path + "/../support_files/brief_pattern.yml";cout << "BRIEF_PATTERN_FILE" << BRIEF_PATTERN_FILE << endl;m_camera = camodocal::CameraFactory::instance()->generateCameraFromYamlFile(config_file.c_str());fsSettings["image_topic"] >> IMAGE_TOPIC; fsSettings["pose_graph_save_path"] >> POSE_GRAPH_SAVE_PATH;fsSettings["output_path"] >> VINS_RESULT_PATH;fsSettings["save_image"] >> DEBUG_IMAGE;VISUALIZE_IMU_FORWARD = fsSettings["visualize_imu_forward"];LOAD_PREVIOUS_POSE_GRAPH = fsSettings["load_previous_pose_graph"];FAST_RELOCALIZATION = fsSettings["fast_relocalization"];VINS_RESULT_PATH = VINS_RESULT_PATH + "/vins_result_loop.csv";std::ofstream fout(VINS_RESULT_PATH, std::ios::out);fout.close();fsSettings.release();// 3.3加載先前的位姿圖if (LOAD_PREVIOUS_POSE_GRAPH){printf("load pose graph\n");m_process.lock();posegraph.loadPoseGraph();m_process.unlock();printf("load pose graph finish\n");load_flag = 1;}else{printf("no previous pose graph\n");load_flag = 1;}}fsSettings.release();// 4.訂閱話題topic并執行各自回調函數ros::Subscriber sub_imu_forward = n.subscribe("/vins_estimator/imu_propagate", 2000, imu_forward_callback);ros::Subscriber sub_vio = n.subscribe("/vins_estimator/odometry", 2000, vio_callback);ros::Subscriber sub_image = n.subscribe(IMAGE_TOPIC, 2000, image_callback);ros::Subscriber sub_pose = n.subscribe("/vins_estimator/keyframe_pose", 2000, pose_callback);ros::Subscriber sub_extrinsic = n.subscribe("/vins_estimator/extrinsic", 2000, extrinsic_callback);ros::Subscriber sub_point = n.subscribe("/vins_estimator/keyframe_point", 2000, point_callback);ros::Subscriber sub_relo_relative_pose = n.subscribe("/vins_estimator/relo_relative_pose", 2000, relo_relative_pose_callback);// 5.發布的話題topicpub_match_img = n.advertise<sensor_msgs::Image>("match_image", 1000);pub_camera_pose_visual = n.advertise<visualization_msgs::MarkerArray>("camera_pose_visual", 1000);pub_key_odometrys = n.advertise<visualization_msgs::Marker>("key_odometrys", 1000);pub_vio_path = n.advertise<nav_msgs::Path>("no_loop_path", 1000);pub_match_points = n.advertise<sensor_msgs::PointCloud>("match_points", 100);// 6. 創建兩個線程,process 和 commandstd::thread measurement_process;std::thread keyboard_command_process;//pose graph主線程measurement_process = std::thread(process);//鍵盤操作的線程keyboard_command_process = std::thread(command);ros::spin();return 0; }

    2、process()函數

  • 先判斷是否需要回環檢測

  • 得到具有相同時間戳的pose_msg、image_msg、point_msg

  • 構建pose_graph中用到的關鍵幀,然后每隔SKIP_CNT,將將距上一關鍵幀距離(平移向量的模)超過SKIP_DIS的圖像創建為關鍵幀。其中,最核心的函數是KeyFrame類以及addKeyFrame()函數。

  • //主線程 void process() {// 1.先判斷是否需要回環檢測if (!LOOP_CLOSURE)return;while (true)// 不斷循環{// 三個參數圖像、點云、VIO位姿sensor_msgs::ImageConstPtr image_msg = NULL;sensor_msgs::PointCloudConstPtr point_msg = NULL;nav_msgs::Odometry::ConstPtr pose_msg = NULL;// find out the messages with same time stamp// 2.得到具有相同時間戳的pose_msg、image_msg、point_msgm_buf.lock();if(!image_buf.empty() && !point_buf.empty() && !pose_buf.empty())// 首先三個都不為空{if (image_buf.front()->header.stamp.toSec() > pose_buf.front()->header.stamp.toSec()){pose_buf.pop();printf("throw pose at beginning\n");}else if (image_buf.front()->header.stamp.toSec() > point_buf.front()->header.stamp.toSec()){point_buf.pop();printf("throw point at beginning\n");}else if (image_buf.back()->header.stamp.toSec() >= pose_buf.front()->header.stamp.toSec() && point_buf.back()->header.stamp.toSec() >= pose_buf.front()->header.stamp.toSec()){pose_msg = pose_buf.front();pose_buf.pop();while (!pose_buf.empty())pose_buf.pop();while (image_buf.front()->header.stamp.toSec() < pose_msg->header.stamp.toSec())image_buf.pop();image_msg = image_buf.front();image_buf.pop();while (point_buf.front()->header.stamp.toSec() < pose_msg->header.stamp.toSec())point_buf.pop();point_msg = point_buf.front();point_buf.pop();}}m_buf.unlock();// 3.構建pose_graph中用到的關鍵幀,然后每隔SKIP_CNT,將將距上一關鍵幀距離(平移向量的模)超過SKIP_DIS的圖像創建為關鍵幀。if (pose_msg != NULL){//printf(" pose time %f \n", pose_msg->header.stamp.toSec());//printf(" point time %f \n", point_msg->header.stamp.toSec());//printf(" image time %f \n", image_msg->header.stamp.toSec());// skip first few// 3.1 剔除最開始的SKIP_FIRST_CNT幀,if (skip_first_cnt < SKIP_FIRST_CNT){skip_first_cnt++;continue;}// 3.2每隔SKIP_CNT幀進行一次 SKIP_CNT=0if (skip_cnt < SKIP_CNT){skip_cnt++;continue;}else{skip_cnt = 0;}// 3.3ROS圖像轉為Opencv類型cv_bridge::CvImageConstPtr ptr;if (image_msg->encoding == "8UC1"){sensor_msgs::Image img;img.header = image_msg->header;img.height = image_msg->height;img.width = image_msg->width;img.is_bigendian = image_msg->is_bigendian;img.step = image_msg->step;img.data = image_msg->data;img.encoding = "mono8";ptr = cv_bridge::toCvCopy(img, sensor_msgs::image_encodings::MONO8);}elseptr = cv_bridge::toCvCopy(image_msg, sensor_msgs::image_encodings::MONO8);cv::Mat image = ptr->image;// build keyframeVector3d T = Vector3d(pose_msg->pose.pose.position.x,pose_msg->pose.pose.position.y,pose_msg->pose.pose.position.z);Matrix3d R = Quaterniond(pose_msg->pose.pose.orientation.w,pose_msg->pose.pose.orientation.x,pose_msg->pose.pose.orientation.y,pose_msg->pose.pose.orientation.z).toRotationMatrix();// 3.4 將距上一關鍵幀距離(平移向量的模)超過SKIP_DIS的圖像創建為關鍵幀if((T - last_t).norm() > SKIP_DIS){vector<cv::Point3f> point_3d; vector<cv::Point2f> point_2d_uv; vector<cv::Point2f> point_2d_normal;vector<double> point_id;for (unsigned int i = 0; i < point_msg->points.size(); i++){cv::Point3f p_3d;p_3d.x = point_msg->points[i].x;p_3d.y = point_msg->points[i].y;p_3d.z = point_msg->points[i].z;point_3d.push_back(p_3d);cv::Point2f p_2d_uv, p_2d_normal;double p_id;p_2d_normal.x = point_msg->channels[i].values[0];p_2d_normal.y = point_msg->channels[i].values[1];p_2d_uv.x = point_msg->channels[i].values[2];p_2d_uv.y = point_msg->channels[i].values[3];p_id = point_msg->channels[i].values[4];point_2d_normal.push_back(p_2d_normal);point_2d_uv.push_back(p_2d_uv);point_id.push_back(p_id);//printf("u %f, v %f \n", p_2d_uv.x, p_2d_uv.y);}// 3.5 創建為關鍵幀類型并加入到posegraph中KeyFrame* keyframe = new KeyFrame(pose_msg->header.stamp.toSec(), frame_index, T, R, image,point_3d, point_2d_uv, point_2d_normal, point_id, sequence); m_process.lock();start_flag = 1;//在posegraph中添加關鍵幀,flag_detect_loop=1回環檢測posegraph.addKeyFrame(keyframe, 1);m_process.unlock();frame_index++;last_t = T;}}// 4.休眠5msstd::chrono::milliseconds dura(5);std::this_thread::sleep_for(dura);} }

    3、pose_graph.h

    接下來將主要講解兩個函數:addKeyFrame()以及detectLoop()

    4、addKeyFrame()添加關鍵幀,進行回環檢測與閉環

  • 建一個新的圖像序列

  • getVioPose()獲取當前幀的位姿vio_P_cur、vio_R_cur并更新updateVioPose

  • detectLoop()回環檢測,返回回環候選幀的索引loop_index

  • 計算當前幀與回環幀的相對位姿,糾正當前幀位姿w_P_cur、w_R_cur;回環得到的位姿和VIO位姿之間的偏移量shift_r、shift_t;如果存在多個圖像序列,則將所有圖像序列都合并到世界坐標系下

  • 獲取VIO當前幀的位姿P、R,根據偏移量得到實際位姿并更新updatePose當前幀的位姿P、R

  • 發布path[sequence_cnt]

  • 保存閉環軌跡到VINS_RESULT_PATH

  • void PoseGraph::addKeyFrame(KeyFrame* cur_kf, bool flag_detect_loop) {//shift to base frameVector3d vio_P_cur;Matrix3d vio_R_cur;// 1.建一個新的圖像序列if (sequence_cnt != cur_kf->sequence){sequence_cnt++;sequence_loop.push_back(0);w_t_vio = Eigen::Vector3d(0, 0, 0);w_r_vio = Eigen::Matrix3d::Identity();m_drift.lock();t_drift = Eigen::Vector3d(0, 0, 0);r_drift = Eigen::Matrix3d::Identity();m_drift.unlock();}// 2.getVioPose()獲取當前幀的位姿vio_P_cur、vio_R_cur并更新updateVioPosecur_kf->getVioPose(vio_P_cur, vio_R_cur);vio_P_cur = w_r_vio * vio_P_cur + w_t_vio;vio_R_cur = w_r_vio * vio_R_cur;cur_kf->updateVioPose(vio_P_cur, vio_R_cur);cur_kf->index = global_index;global_index++;int loop_index = -1;if (flag_detect_loop){TicToc tmp_t;// 3.detectLoop()回環檢測,返回回環候選幀的索引loop_indexloop_index = detectLoop(cur_kf, cur_kf->index);}else{addKeyFrameIntoVoc(cur_kf);}// 4.存在回環候選幀if (loop_index != -1){//printf(" %d detect loop with %d \n", cur_kf->index, loop_index);// 4.1 獲取回環候選幀 KeyFrame* old_kf = getKeyFrame(loop_index);// 當前幀與回環候選幀進行描述子匹配,如果成功則確定存在回環if (cur_kf->findConnection(old_kf)){//earliest_loop_index為最早的回環候選幀if (earliest_loop_index > loop_index || earliest_loop_index == -1)earliest_loop_index = loop_index;// 4.2 計算當前幀與回環幀的相對位姿,糾正當前幀位姿w_P_cur、w_R_curVector3d w_P_old, w_P_cur, vio_P_cur;Matrix3d w_R_old, w_R_cur, vio_R_cur;old_kf->getVioPose(w_P_old, w_R_old);cur_kf->getVioPose(vio_P_cur, vio_R_cur);//獲取當前幀與回環幀的相對位姿relative_q、relative_tVector3d relative_t;Quaterniond relative_q;relative_t = cur_kf->getLoopRelativeT();relative_q = (cur_kf->getLoopRelativeQ()).toRotationMatrix();//重新計算當前幀位姿w_P_cur、w_R_curw_P_cur = w_R_old * relative_t + w_P_old;w_R_cur = w_R_old * relative_q;//回環得到的位姿和VIO位姿之間的偏移量shift_r、shift_tdouble shift_yaw;Matrix3d shift_r;Vector3d shift_t; shift_yaw = Utility::R2ypr(w_R_cur).x() - Utility::R2ypr(vio_R_cur).x();shift_r = Utility::ypr2R(Vector3d(shift_yaw, 0, 0));shift_t = w_P_cur - w_R_cur * vio_R_cur.transpose() * vio_P_cur; // shift vio pose of whole sequence to the world frame// 4.3如果存在多個圖像序列,則將所有圖像序列都合并到世界坐標系下if (old_kf->sequence != cur_kf->sequence && sequence_loop[cur_kf->sequence] == 0){ w_r_vio = shift_r;w_t_vio = shift_t;vio_P_cur = w_r_vio * vio_P_cur + w_t_vio;vio_R_cur = w_r_vio * vio_R_cur;cur_kf->updateVioPose(vio_P_cur, vio_R_cur);list<KeyFrame*>::iterator it = keyframelist.begin();for (; it != keyframelist.end(); it++) {if((*it)->sequence == cur_kf->sequence){Vector3d vio_P_cur;Matrix3d vio_R_cur;(*it)->getVioPose(vio_P_cur, vio_R_cur);vio_P_cur = w_r_vio * vio_P_cur + w_t_vio;vio_R_cur = w_r_vio * vio_R_cur;(*it)->updateVioPose(vio_P_cur, vio_R_cur);}}sequence_loop[cur_kf->sequence] = 1;}// 4.4 將當前幀放入優化隊列中m_optimize_buf.lock();optimize_buf.push(cur_kf->index);m_optimize_buf.unlock();}}m_keyframelist.lock();Vector3d P;Matrix3d R;// 5.獲取VIO當前幀的位姿P、R,根據偏移量得到實際位姿cur_kf->getVioPose(P, R);P = r_drift * P + t_drift;R = r_drift * R;// 更新當前幀的位姿P、Rcur_kf->updatePose(P, R);// 6.發布path[sequence_cnt]Quaterniond Q{R};geometry_msgs::PoseStamped pose_stamped;pose_stamped.header.stamp = ros::Time(cur_kf->time_stamp);pose_stamped.header.frame_id = "world";pose_stamped.pose.position.x = P.x() + VISUALIZATION_SHIFT_X;pose_stamped.pose.position.y = P.y() + VISUALIZATION_SHIFT_Y;pose_stamped.pose.position.z = P.z();pose_stamped.pose.orientation.x = Q.x();pose_stamped.pose.orientation.y = Q.y();pose_stamped.pose.orientation.z = Q.z();pose_stamped.pose.orientation.w = Q.w();path[sequence_cnt].poses.push_back(pose_stamped);path[sequence_cnt].header = pose_stamped.header;// 7.保存閉環軌跡到VINS_RESULT_PATHif (SAVE_LOOP_PATH){ofstream loop_path_file(VINS_RESULT_PATH, ios::app);loop_path_file.setf(ios::fixed, ios::floatfield);loop_path_file.precision(0);loop_path_file << cur_kf->time_stamp * 1e9 << ",";loop_path_file.precision(5);loop_path_file << P.x() << ","<< P.y() << ","<< P.z() << ","<< Q.w() << ","<< Q.x() << ","<< Q.y() << ","<< Q.z() << ","<< endl;loop_path_file.close();}// 8.draw local connectionif (SHOW_S_EDGE){list<KeyFrame*>::reverse_iterator rit = keyframelist.rbegin();for (int i = 0; i < 4; i++){if (rit == keyframelist.rend())break;Vector3d conncected_P;Matrix3d connected_R;if((*rit)->sequence == cur_kf->sequence){(*rit)->getPose(conncected_P, connected_R);posegraph_visualization->add_edge(P, conncected_P);}rit++;}}//當前幀與其回環幀連線if (SHOW_L_EDGE){if (cur_kf->has_loop){//printf("has loop \n");KeyFrame* connected_KF = getKeyFrame(cur_kf->loop_index);Vector3d connected_P,P0;Matrix3d connected_R,R0;connected_KF->getPose(connected_P, connected_R);//cur_kf->getVioPose(P0, R0);cur_kf->getPose(P0, R0);if(cur_kf->sequence > 0){//printf("add loop into visual \n");posegraph_visualization->add_loopedge(P0, connected_P + Vector3d(VISUALIZATION_SHIFT_X, VISUALIZATION_SHIFT_Y, 0));}}}//posegraph_visualization->add_pose(P + Vector3d(VISUALIZATION_SHIFT_X, VISUALIZATION_SHIFT_Y, 0), Q);keyframelist.push_back(cur_kf);publish();m_keyframelist.unlock(); }

    5、detectLoop()回環檢測返回候選幀索引

  • query()查詢字典數據庫,得到與每一幀的相似度評分ret
  • add()添加當前關鍵幀到字典數據庫中
  • hconcat()通過相似度評分判斷是否存在回環候選幀

  • 對于索引值大于50的關鍵幀才考慮進行回環,即前50幀不回環,返回評分大于0.015的最早的關鍵幀索引min_index

  • //回環檢測返回候選幀索引 int PoseGraph::detectLoop(KeyFrame* keyframe, int frame_index) {// put image into image_pool; for visualizationcv::Mat compressed_image;if (DEBUG_IMAGE){int feature_num = keyframe->keypoints.size();cv::resize(keyframe->image, compressed_image, cv::Size(376, 240));putText(compressed_image, "feature_num:" + to_string(feature_num), cv::Point2f(10, 10), CV_FONT_HERSHEY_SIMPLEX, 0.4, cv::Scalar(255));image_pool[frame_index] = compressed_image;}TicToc tmp_t;QueryResults ret;TicToc t_query;// 1.查詢字典數據庫,得到與每一幀的相似度評分retdb.query(keyframe->brief_descriptors, ret, 4, frame_index - 50);//printf("query time: %f", t_query.toc());//cout << "Searching for Image " << frame_index << ". " << ret << endl;// 2.添加當前關鍵幀到字典數據庫中TicToc t_add;db.add(keyframe->brief_descriptors);//printf("add feature time: %f", t_add.toc());// ret[0] is the nearest neighbour's score. threshold change with neighour score// 3.通過相似度評分判斷是否存在回環候選幀bool find_loop = false;cv::Mat loop_result;if (DEBUG_IMAGE){loop_result = compressed_image.clone();if (ret.size() > 0)putText(loop_result, "neighbour score:" + to_string(ret[0].Score), cv::Point2f(10, 50), CV_FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255));}// visual loop result if (DEBUG_IMAGE){for (unsigned int i = 0; i < ret.size(); i++){int tmp_index = ret[i].Id;auto it = image_pool.find(tmp_index);cv::Mat tmp_image = (it->second).clone();putText(tmp_image, "index: " + to_string(tmp_index) + "loop score:" + to_string(ret[i].Score), cv::Point2f(10, 50), CV_FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255));cv::hconcat(loop_result, tmp_image, loop_result);}}//確保與相鄰幀具有好的相似度評分if (ret.size() >= 1 &&ret[0].Score > 0.05)for (unsigned int i = 1; i < ret.size(); i++){//if (ret[i].Score > ret[0].Score * 0.3)//評分大于0.015則認為是回環候選幀if (ret[i].Score > 0.015){ find_loop = true;int tmp_index = ret[i].Id;if (DEBUG_IMAGE && 0){auto it = image_pool.find(tmp_index);cv::Mat tmp_image = (it->second).clone();putText(tmp_image, "loop score:" + to_string(ret[i].Score), cv::Point2f(10, 50), CV_FONT_HERSHEY_SIMPLEX, 0.4, cv::Scalar(255));cv::hconcat(loop_result, tmp_image, loop_result);}}} /*if (DEBUG_IMAGE){cv::imshow("loop_result", loop_result);cv::waitKey(20);} */// 4.對于索引值大于50的關鍵幀才考慮進行回環,即前50幀不回環//返回評分大于0.015的最早的關鍵幀索引min_indexif (find_loop && frame_index > 50){int min_index = -1;for (unsigned int i = 0; i < ret.size(); i++){if (min_index == -1 || (ret[i].Id < min_index && ret[i].Score > 0.015))min_index = ret[i].Id;}return min_index;}elsereturn -1;}

    6、optimize4DoF()位姿圖優化

    //四自由度位姿圖優化 void PoseGraph::optimize4DoF() {while(true){int cur_index = -1;int first_looped_index = -1;//取出最新一個待優化幀作為當前幀m_optimize_buf.lock();while(!optimize_buf.empty()){cur_index = optimize_buf.front();first_looped_index = earliest_loop_index;optimize_buf.pop();}m_optimize_buf.unlock();if (cur_index != -1){printf("optimize pose graph \n");TicToc tmp_t;m_keyframelist.lock();KeyFrame* cur_kf = getKeyFrame(cur_index);int max_length = cur_index + 1;// w^t_i w^q_idouble t_array[max_length][3];Quaterniond q_array[max_length];double euler_array[max_length][3];double sequence_array[max_length];ceres::Problem problem;ceres::Solver::Options options;options.linear_solver_type = ceres::SPARSE_NORMAL_CHOLESKY;//options.minimizer_progress_to_stdout = true;//options.max_solver_time_in_seconds = SOLVER_TIME * 3;options.max_num_iterations = 5;ceres::Solver::Summary summary;ceres::LossFunction *loss_function;loss_function = new ceres::HuberLoss(0.1);//loss_function = new ceres::CauchyLoss(1.0);ceres::LocalParameterization* angle_local_parameterization =AngleLocalParameterization::Create();list<KeyFrame*>::iterator it;int i = 0;for (it = keyframelist.begin(); it != keyframelist.end(); it++){//找到第一個回環候選幀,//回環檢測到幀以前的都略過if ((*it)->index < first_looped_index)continue;(*it)->local_index = i;Quaterniond tmp_q;Matrix3d tmp_r;Vector3d tmp_t;(*it)->getVioPose(tmp_t, tmp_r);tmp_q = tmp_r;t_array[i][0] = tmp_t(0);t_array[i][1] = tmp_t(1);t_array[i][2] = tmp_t(2);q_array[i] = tmp_q;Vector3d euler_angle = Utility::R2ypr(tmp_q.toRotationMatrix());euler_array[i][0] = euler_angle.x();euler_array[i][1] = euler_angle.y();euler_array[i][2] = euler_angle.z();sequence_array[i] = (*it)->sequence;problem.AddParameterBlock(euler_array[i], 1, angle_local_parameterization);problem.AddParameterBlock(t_array[i], 3);//回環檢測到的幀參數設為固定if ((*it)->index == first_looped_index || (*it)->sequence == 0){ problem.SetParameterBlockConstant(euler_array[i]);problem.SetParameterBlockConstant(t_array[i]);}//add edge//對于每個i, 只計算它之前五個的位置和yaw殘差for (int j = 1; j < 5; j++){if (i - j >= 0 && sequence_array[i] == sequence_array[i-j]){Vector3d euler_conncected = Utility::R2ypr(q_array[i-j].toRotationMatrix());Vector3d relative_t(t_array[i][0] - t_array[i-j][0], t_array[i][1] - t_array[i-j][1], t_array[i][2] - t_array[i-j][2]);relative_t = q_array[i-j].inverse() * relative_t;double relative_yaw = euler_array[i][0] - euler_array[i-j][0];ceres::CostFunction* cost_function = FourDOFError::Create( relative_t.x(), relative_t.y(), relative_t.z(),relative_yaw, euler_conncected.y(), euler_conncected.z());problem.AddResidualBlock(cost_function, NULL, euler_array[i-j], t_array[i-j], euler_array[i], t_array[i]);}}//add loop edgeif((*it)->has_loop)// 如果檢測到回環{//必須回環檢測的幀號大于或者等于當前幀的回環檢測匹配幀號assert((*it)->loop_index >= first_looped_index);int connected_index = getKeyFrame((*it)->loop_index)->local_index;Vector3d euler_conncected = Utility::R2ypr(q_array[connected_index].toRotationMatrix());Vector3d relative_t;relative_t = (*it)->getLoopRelativeT();double relative_yaw = (*it)->getLoopRelativeYaw();ceres::CostFunction* cost_function = FourDOFWeightError::Create( relative_t.x(), relative_t.y(), relative_t.z(),relative_yaw, euler_conncected.y(), euler_conncected.z());problem.AddResidualBlock(cost_function, loss_function, euler_array[connected_index], t_array[connected_index], euler_array[i], t_array[i]);}if ((*it)->index == cur_index)break;i++;}m_keyframelist.unlock();ceres::Solve(options, &problem, &summary);//std::cout << summary.BriefReport() << "\n";//printf("pose optimization time: %f \n", tmp_t.toc());/*for (int j = 0 ; j < i; j++){printf("optimize i: %d p: %f, %f, %f\n", j, t_array[j][0], t_array[j][1], t_array[j][2] );}*/m_keyframelist.lock();i = 0;//根據優化后的參數更新參與優化的關鍵幀的位姿for (it = keyframelist.begin(); it != keyframelist.end(); it++){if ((*it)->index < first_looped_index)continue;Quaterniond tmp_q;tmp_q = Utility::ypr2R(Vector3d(euler_array[i][0], euler_array[i][1], euler_array[i][2]));Vector3d tmp_t = Vector3d(t_array[i][0], t_array[i][1], t_array[i][2]);Matrix3d tmp_r = tmp_q.toRotationMatrix();(*it)-> updatePose(tmp_t, tmp_r);if ((*it)->index == cur_index)break;i++;}//根據當前幀的drift,更新全部關鍵幀位姿Vector3d cur_t, vio_t;Matrix3d cur_r, vio_r;cur_kf->getPose(cur_t, cur_r);cur_kf->getVioPose(vio_t, vio_r);m_drift.lock();yaw_drift = Utility::R2ypr(cur_r).x() - Utility::R2ypr(vio_r).x();r_drift = Utility::ypr2R(Vector3d(yaw_drift, 0, 0));t_drift = cur_t - r_drift * vio_t;m_drift.unlock();//cout << "t_drift " << t_drift.transpose() << endl;//cout << "r_drift " << Utility::R2ypr(r_drift).transpose() << endl;//cout << "yaw drift " << yaw_drift << endl;it++;for (; it != keyframelist.end(); it++){Vector3d P;Matrix3d R;(*it)->getVioPose(P, R);P = r_drift * P + t_drift;R = r_drift * R;(*it)->updatePose(P, R);}m_keyframelist.unlock();updatePath();}std::chrono::milliseconds dura(2000);std::this_thread::sleep_for(dura);} }

    7、keyframe.h

    主要有兩個類:BriefExtractor和KeyFrame

    第一個類BriefExtractor:通過Brief模板文件,對圖像的關鍵點計算Brief描述子

    class BriefExtractor { public:virtual void operator()(const cv::Mat &im, vector<cv::KeyPoint> &keys, vector<BRIEF::bitset> &descriptors) const;BriefExtractor(const std::string &pattern_file);DVision::BRIEF m_brief; };

    第二個類KeyFrame:構建關鍵幀,通過BRIEF描述子匹配關鍵幀和回環候選幀

    ?

    ?

    代碼流程圖的出處:VINS-Mono代碼解讀——回環檢測與重定位 pose graph loop closing by Manii

    總結

    以上是生活随笔為你收集整理的VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    999超碰| 色综合久久久久久久 | 国产精品麻豆一区二区三区 | 麻豆一级视频 | 91亚色视频| 亚洲精品国产电影 | 二区三区在线 | 亚洲视频www | 欧美精品久久久久a | 日日射天天射 | 精品91视频 | 91av视频播放| 在线a视频| 黄色大全在线观看 | 99视频免费播放 | 国产精品手机视频 | 91精品国产99久久久久久红楼 | 国产v在线播放 | 国产成人亚洲精品自产在线 | 欧美日韩国产免费视频 | 久久精品国产v日韩v亚洲 | 免费91麻豆精品国产自产在线观看 | 日本一区二区三区视频在线播放 | 狠狠色狠狠色合久久伊人 | 亚洲欧洲国产视频 | 精品久久久免费视频 | 在线看免费 | av综合 日韩| 久久露脸国产精品 | 永久精品视频 | 亚洲午夜剧场 | 国产无套一区二区三区久久 | 欧洲色综合 | 欧美伊人网 | 日韩在线短视频 | av电影免费观看 | 国产一级大片在线观看 | 婷婷激情小说网 | 亚洲精品国产精品国自产在线 | a一片一级 | 欧美成人手机版 | 欧美成年黄网站色视频 | 亚洲 欧美 国产 va在线影院 | 97人人爽 | 狠狠干网 | 伊人久久一区 | 精品成人在线 | www色网站| 在线之家官网 | 成人黄色在线 | 免费视频国产 | 久久看免费视频 | 国产玖玖精品视频 | 开心丁香婷婷深爱五月 | 国产资源在线观看 | 成年美女黄网站色大片免费看 | 91在线中文字幕 | 欧美精品二区 | 久久久久99精品成人片三人毛片 | 成人av在线电影 | 天天操天天添天天吹 | 免费看污污视频的网站 | 精品国产一区二区三区久久影院 | 久久中文网| 精品伦理一区二区三区 | 五月婷婷在线视频观看 | 五月天激情婷婷 | 亚洲精品综合在线观看 | 久久国产精品免费视频 | 麻豆国产网站 | 欧美精品国产综合久久 | 成人免费色| 成人播放器 | 欧美精品视 | 成人在线免费观看网站 | 久久久999免费视频 日韩网站在线 | 九九涩涩av台湾日本热热 | 日韩电影一区二区三区在线观看 | 亚洲成熟女人毛片在线 | 日韩在线免费电影 | 久久情爱 | 91亚洲精品久久久蜜桃 | 人人澡人人添人人爽一区二区 | 成人超碰97 | 国产精品a成v人在线播放 | 成人理论在线观看 | 精品视频久久 | 欧美在线视频日韩 | 天天av天天 | 在线观看免费色 | 亚洲更新最快 | 一区二区免费不卡在线 | 少妇bbw撒尿| 国内精品久久久久久 | 免费观看国产视频 | 亚洲日本黄色 | 国产首页 | 日韩视频在线观看视频 | 国产日韩视频在线观看 | 日韩精品久久中文字幕 | 天天干中文字幕 | 激情一区二区三区欧美 | 欧美性脚交 | 久爱精品在线 | 日本精品久久久一区二区三区 | 久久激五月天综合精品 | 久久国产乱 | 日韩女同一区二区三区在线观看 | 天天人人综合 | 亚洲欧美日韩国产一区二区三区 | 国产在线久草 | 97超碰中文字幕 | 亚洲视频久久久久 | 日韩中文字幕91 | 99产精品成人啪免费网站 | 国产视频在 | 亚洲午夜精品在线观看 | 国产视频每日更新 | 成人黄性视频 | 国产精品视频久久 | 麻豆91精品 | 日本在线观看中文字幕 | 四虎小视频 | 精品亚洲国产视频 | 天天干天天草 | 夜夜澡人模人人添人人看 | 久草在线精品观看 | 欧美三级免费 | 黄色免费网站下载 | 91高清视频 | 久久久久久久18 | 国产精品美女久久 | 99国产一区二区三精品乱码 | 亚洲精品乱码久久 | 国产精品久久久久久久久久免费 | 午夜精品一区二区国产 | 欧美日韩一区二区三区在线免费观看 | 精品国产一区二区三区在线 | 91在线免费观看网站 | 日韩av成人 | 日韩欧美在线免费观看 | 天堂av在线| 91精品国产99久久久久 | 日韩欧美黄色网址 | 九九九热精品免费视频观看网站 | 奇米网网址 | 国产精品刺激对白麻豆99 | 97超碰色 | 最近日本字幕mv免费观看在线 | 99精品黄色片免费大全 | 久久99精品久久久久久 | 国产福利91精品一区二区三区 | 久久免费久久 | 999成人网 | 最新av免费在线观看 | 字幕网资源站中文字幕 | 精品一区二区三区久久久 | 欧美性极品xxxx做受 | 久久国产高清视频 | 日韩欧美视频在线 | 色综合五月天 | 操老逼免费视频 | 国产玖玖视频 | 午夜免费久久看 | 波多野结衣精品在线 | www一起操 | 免费人成网ww44kk44 | 日韩精品中文字幕在线不卡尤物 | 97在线观看免费观看高清 | 亚洲成人av一区 | 97超碰成人 | 欧美精品做受xxx性少妇 | 久久视频精品 | 91人人射| 日韩69av | 国产精品综合久久久久 | 久在线| 国产亚洲精品久久久久久 | 中文字幕在线观看免费 | 91超碰在线播放 | 免费在线激情电影 | 久免费视频 | 国产一区二区电影在线观看 | 久久神马影院 | 欧美精品乱码久久久久久按摩 | 久久综合九色综合欧美狠狠 | 91在线porny国产在线看 | 国产黄在线 | 欧美色图另类 | 国产原创在线 | 丁香电影小说免费视频观看 | 一区二三国产 | 色在线高清 | 狠狠色丁香婷综合久久 | 99色视频 | 96久久欧美麻豆网站 | av色影院 | 18久久久久| 美女精品 | 久久免费在线观看 | 麻豆视频免费 | 国产五月 | av福利在线导航 | 日韩av高清 | 激情丁香月 | 国产高清小视频 | 激情在线免费视频 | 黄色小说免费在线观看 | 人人爱天天操 | 激情 亚洲| 精品久久一二三区 | 超碰av在线播放 | 国产精品一级在线 | 黄色一级在线免费观看 | 成 人 黄 色 片 在线播放 | 欧美视频在线观看免费网址 | 国内精品久久久久国产 | 国产黄色免费电影 | 亚洲免费国产视频 | 久久视频精品在线观看 | 久99久精品 | 亚洲午夜小视频 | 日韩精品一区二区三区中文字幕 | 人人草在线视频 | 麻豆影视在线免费观看 | 黄色在线成人 | 97综合网 | 韩国三级一区 | 日本精品久久久久影院 | 偷拍精偷拍精品欧洲亚洲网站 | 成人毛片一区二区三区 | 精品字幕在线 | 精品国产伦一区二区三区观看说明 | 欧美a级在线 | 丁香六月天 | 国产视频高清 | 中文字幕在线日 | 成人一区二区三区中文字幕 | www.五月婷| www.av免费 | 在线成人观看 | 美女黄久久 | 黄色成品视频 | 精品国产一区二区三区四区vr | 中文字幕日本电影 | 99精品在线视频播放 | 亚州国产视频 | 国产精品国产三级国产专区53 | 国产精品一区二 | 成人久久影院 | 欧美亚洲免费在线一区 | 国产高清无av久久 | 欧美精品亚洲精品 | 亚洲 欧美 另类人妖 | 蜜桃视频成人在线观看 | 国产黄网在线 | 国产高清一区二区 | 国产黄色片一级 | 亚州精品在线视频 | 日本成人黄色片 | 免费色视频网站 | 天天色天天射天天综合网 | 一区二区三区四区在线免费观看 | www.色综合.com | 国产色一区| 97夜夜澡人人双人人人喊 | 九九九毛片 | 五月天伊人 | 亚洲激情 | 欧美性黑人 | 国产高清第一页 | 亚洲老妇xxxxxx | 丁香六月婷婷综合 | av免费观看高清 | 美女免费网视频 | 亚洲成人软件 | 人人干人人添 | 一区二区三区视频网站 | 激情欧美一区二区三区 | 婷婷丁香六月 | 久久中文字幕在线视频 | 久草久热| 精品欧美在线视频 | 免费在线电影网址大全 | 午夜精品一区二区三区视频免费看 | 99久久国产免费,99久久国产免费大片 | www操操操| 精品999久久久 | 日韩免费小视频 | 丁香综合五月 | 色无五月 | 午夜久久久久 | 国产精品 中文在线 | 日韩精品播放 | 日日摸日日 | 亚洲黄污| 91精品国产成 | 色资源网免费观看视频 | 日韩av伦理片 | 亚洲理论在线观看电影 | 国产精品综合久久久 | 黄色一级大片在线免费看产 | 四虎国产永久在线精品 | 日韩丝袜视频 | 日韩欧美高清不卡 | 国产一级高清视频 | 日韩视频中文字幕在线观看 | 奇米影视8888在线观看大全免费 | 99色人 | 狠狠操操网 | 午夜精品久久久久 | 国产精品成人一区二区 | 免费三级黄 | 在线看黄色的网站 | 一级黄色大片 | 日韩成人黄色 | 久久久久久久久久久久久久免费看 | 久久综合中文字幕 | 一区中文字幕电影 | 欧美一区二区在线看 | 中文字幕第一页在线视频 | 日韩av免费一区二区 | 成人久久 | 色综合天天做天天爱 | 国产在线精品一区二区不卡了 | 欧美成人亚洲成人 | 青春草视频| 日本久久久久 | 一区二区三区高清在线 | 欧美一级性 | 欧美日一级片 | 国产婷婷视频在线 | av网站免费在线 | 国产群p视频 | 国产免费一区二区三区最新 | 日韩av播放在线 | 婷婷丁香激情综合 | 99色在线视频 | 日韩黄色免费电影 | 日韩免费网址 | 日韩欧美精品一区二区 | 在线国产一区二区 | 毛片的网址 | 黄色毛片电影 | 欧美激情精品久久久久久免费 | 成人毛片在线观看视频 | 日韩免费电影在线观看 | 国产一级电影免费观看 | 中文字幕在线观看av | 亚洲一二区精品 | 99视频在线免费 | 美女久久久久久久久久久 | 国产精品一区二区在线播放 | 欧美一二三区在线观看 | av中文字幕在线观看网站 | a级片韩国| 国产精品久久久久久婷婷天堂 | 成人免费91 | 欧美成人h版在线观看 | 久久久久女人精品毛片九一 | 亚洲欧美日韩精品久久久 | av在线等| 亚洲日本一区二区在线 | 国产一在线精品一区在线观看 | 国产成人精品电影久久久 | 色综合久久中文综合久久牛 | 中文字幕日本在线观看 | 国产 一区二区三区 在线 | 在线看av的网址 | 手机av在线网站 | 欧美一级片免费在线观看 | 热久久电影 | 亚洲日本va午夜在线影院 | 久久精品久久综合 | 玖玖在线看 | 91精品视频在线免费观看 | 国产小视频在线观看 | 97在线观看免费高清完整版在线观看 | 久久草在线视频国产 | 日韩在线观看中文字幕 | 久久精品精品电影网 | 伊人va| 2018亚洲男人天堂 | 国产亚洲人成网站在线观看 | 国产小视频国产精品 | 日韩欧三级 | 国产精品毛片久久 | 中文字幕av最新更新 | 男女拍拍免费视频 | av一级片在线观看 | 国产精品一区二区久久久 | 色婷婷久久久综合中文字幕 | 久久在线视频精品 | 成人黄色大片在线观看 | 免费观看av网站 | 久久精品亚洲一区二区三区观看模式 | 91mv.cool在线观看 | 午夜久久久久久久 | 日韩在线中文字幕视频 | 色婷婷综合久久久中文字幕 | 又紧又大又爽精品一区二区 | 久久久精品欧美 | 天天色天天射天天综合网 | 欧美一二区视频 | 亚洲精品视频在线播放 | 成人片在线播放 | 99re久久资源最新地址 | 狠狠狠色狠狠色综合 | 日韩欧美一区二区三区视频 | 久久免费国产精品1 | 在线亚洲成人 | 国产一区av在线 | 一级片黄色片网站 | 欧美成人黄色 | 91豆麻精品91久久久久久 | 免费久久网| 久久综合九色九九 | 国产91aaa | 西西444www| 丁香六月国产 | 天天操天天摸天天干 | 草久久久久 | 亚洲日本在线一区 | 久久av中文字幕片 | 在线观看视频精品 | 最新日本中文字幕 | 免费一级特黄录像 | 日韩精品一区二区三区第95 | 色综合久久中文字幕综合网 | 欧美日韩另类在线 | 97在线观看免费高清完整版在线观看 | 国产亚洲婷婷免费 | 激情深爱 | 国产一级二级av | 成人全视频免费观看在线看 | 日韩在线观看一区二区 | 国产精品爽爽久久久久久蜜臀 | 精品理论片 | 午夜视频在线观看一区二区三区 | 黄色片网站av | 在线观看视频黄色 | 欧美日韩在线播放 | 久久99国产视频 | 欧美日韩在线播放 | 有码中文在线 | 亚洲无吗av| 国产精品igao视频网网址 | www.夜夜操 | 婷婷综合亚洲 | 久久av不卡 | 97操操操 | 黄色网www| 手机在线中文字幕 | 国产视频一区二区在线观看 | 手机av看片| 在线亚洲天堂网 | 色播五月激情综合网 | 欧美日韩国产在线精品 | 国产网站在线免费观看 | 99热精品国产| 成人综合婷婷国产精品久久免费 | 日韩在线一区二区免费 | 亚洲成av人片在线观看无 | 国产自在线 | 久久天天躁夜夜躁狠狠85麻豆 | 亚洲,播放| 天天色天天操综合 | 日韩av高清在线观看 | 天天操天天怕 | 久久免费播放视频 | 日本字幕网| 亚洲一区二区三区在线看 | 精品国产伦一区二区三区 | 最近中文字幕完整高清 | 成人片在线播放 | 亚洲好视频 | 精品在线视频观看 | 超碰人人在线 | 欧美日韩一区二区久久 | 精品国产99国产精品 | 国产精品亚州 | 丁香在线| 中文字幕一区二区三 | 亚洲情感电影大片 | 91久久一区二区 | 国产亚洲在线视频 | 看毛片网站 | 色狠狠综合天天综合综合 | 九九色在线观看 | 黄色午夜 | 四虎影视成人永久免费观看视频 | 三级av网| 91精品一区国产高清在线gif | 久久久www成人免费毛片 | 国产精品国产三级国产aⅴ无密码 | japanesefreesexvideo高潮 | 99国内精品 | 天天曰天天曰 | 免费合欢视频成人app | 最近在线中文字幕 | 亚洲情感电影大片 | 国产视频日本 | 在线观看日韩av | 精品人妖videos欧美人妖 | 视频一区二区精品 | v片在线看 | 91在线免费观看网站 | 婷婷视频在线播放 | 国产精品一区二区你懂的 | 亚洲一二三久久 | 黄色免费观看网址 | 激情综合色综合久久 | 精品国产aⅴ麻豆 | 国产最顶级的黄色片在线免费观看 | 中文字幕第 | 91亚洲激情 | 国产字幕在线看 | 国产亚洲精品电影 | 国产高清专区 | 人人草人人草 | 久久这里只有精品视频首页 | 日韩欧美亚洲 | 久久免费电影 | 免费视频网 | 日韩在线免费视频观看 | 东方av在线免费观看 | 91亚洲精品视频 | 久久久久久国产精品免费 | 国产精品亚洲片在线播放 | 中文字幕高清有码 | 免费视频资源 | 97免费视频在线 | 99久久婷婷国产精品综合 | 特级黄色视频毛片 | 久久中文网 | 久久五月精品 | 日韩精品一区二区在线视频 | 国产精品自拍在线 | 免费网站在线 | 9992tv成人免费看片 | 国产成人免费高清 | 国产裸体视频网站 | 在线电影av | 天天插日日插 | 五月天堂色 | 亚洲天天综合网 | 久久论理 | 欧美日韩一区二区三区视频 | 久久夜色精品国产欧美乱 | 日韩av高清在线观看 | h视频在线看 | 国产精品3区 | 中文在线免费看视频 | 婷婷六月天丁香 | 伊人天天狠天天添日日拍 | 国产精品热视频 | 日韩欧美国产成人 | 婷婷色综合网 | 欧美日韩国产精品一区二区 | 五月天久久婷 | 免费高清无人区完整版 | 96精品视频 | 久爱综合 | 久久久亚洲影院 | 麻豆传媒视频在线播放 | 97理论片| 日韩精品一区二区三区三炮视频 | 在线观看视频中文字幕 | 蜜臀av性久久久久av蜜臀三区 | 96国产在线 | 日韩一二区在线观看 | 人人爽人人乐 | 91人人爱 | 香蕉视频91| 涩av在线 | 国产中文伊人 | 亚洲精品国产第一综合99久久 | 在线电影 你懂得 | 日韩mv欧美mv国产精品 | 色视频在线免费观看 | 在线观看亚洲国产精品 | 日本中文字幕在线播放 | 91福利视频免费观看 | 97在线视| 草久在线视频 | 99re久久资源最新地址 | 亚洲一区二区三区miaa149 | 中文字幕文字幕一区二区 | 免费一级片视频 | 五月婷婷婷婷婷 | 国产专区精品视频 | 中文永久字幕 | 欧美黑人性爽 | 就要色综合 | 久草视频免费观 | ,午夜性刺激免费看视频 | 国产免费激情久久 | 欧美视频网址 | 国产91aaa| 久久se视频 | 四虎在线免费观看 | 日韩中文字幕一区 | 免费看的黄色小视频 | 91av美女| japanesexxxhd奶水| 国产精品久久网 | 天天操狠狠操夜夜操 | 黄色小说在线免费观看 | 久久亚洲私人国产精品 | 久久精品高清视频 | 欧美色噜噜噜 | 国产精品成人免费 | 国产精品久久99综合免费观看尤物 | 亚洲成人第一区 | 黄色大片av | 一区二区三高清 | 久久久久伊人 | 久久久久久电影 | 日日碰狠狠添天天爽超碰97久久 | 国产视频中文字幕在线观看 | 国产偷国产偷亚洲清高 | 亚洲欧美国产日韩在线观看 | 成人在线网站观看 | 天天干天天上 | 国产精品免费观看久久 | 久久综合中文色婷婷 | 黄色小视频在线观看免费 | 91精品在线播放 | 日韩在线免费看 | 日本黄色片一区二区 | 国产黄色av影视 | 精品久久久久久综合 | 一级特黄aaa大片在线观看 | av在线免费播放 | 色噜噜噜噜 | 色视频国产直接看 | 国产精品久久久久久妇 | 天天插综合网 | 91精品视频免费看 | 精品国偷自产在线 | www.夜色321.com | 不卡av电影在线观看 | 手机在线小视频 | 全黄色一级片 | 91av在线免费观看 | 精品亚洲视频在线观看 | 88av网站| 久久久国产精品成人免费 | 69人人 | av免费看在线 | 国产 视频 高清 免费 | www黄| 在线观看中文字幕一区 | 日韩高清一区 | 国产成人精品国内自产拍免费看 | 性色在线视频 | 一区二区精品久久 | 精品国产aⅴ麻豆 | 亚洲伊人网在线观看 | 久久久久久久久久久电影 | 在线性视频日韩欧美 | 欧美日韩伦理一区 | 欧美亚洲国产精品久久高清浪潮 | 久久久久久激情 | 黄色av网站在线观看 | 国产视频中文字幕在线观看 | 日日爱视频 | 国产福利在线免费观看 | 天堂黄色片 | 亚洲午夜精品在线观看 | 国产涩图 | 国产91免费在线 | 超碰97人人在线 | 成人一区在线观看 | www色com| 国产精品视频在线观看 | 日韩欧美一级二级 | 在线中文字母电影观看 | 日韩在线视频一区二区三区 | 九九热视频在线 | 久久免费99精品久久久久久 | 99综合久久 | 中文字幕免费高清 | 高清在线一区 | 97免费在线视频 | 日韩在线观看视频在线 | 特黄特色特刺激视频免费播放 | 日本一区二区三区免费观看 | 国产69精品久久99的直播节目 | 国产日韩欧美在线 | 久草在线视频在线观看 | 操操爽 | 激情综合五月天 | 欧美日韩在线观看一区 | 亚洲精品国产精品国自 | 欧美日韩久久 | 毛片永久新网址首页 | 日韩草比 | 91成人亚洲 | 免费看一级黄色 | 狠狠网站 | 中文字幕乱码亚洲精品一区 | 欧美一级久久久 | 中文字幕一区二区三区四区视频 | 国产视频九色蝌蚪 | 久草视频在 | 久久国产亚洲视频 | 在线电影 一区 | 国产午夜小视频 | 色综合五月天 | 视频国产精品 | 天天看天天干天天操 | 国产色婷婷精品综合在线手机播放 | 一二三区视频在线 | 精品视频在线观看 | 国产精品一区二区久久精品爱微奶 | 国产福利免费在线观看 | 成人久久影院 | 国产精品欧美久久久久天天影视 | 久久人人爽人人片 | av在线不卡观看 | 日韩欧美国产视频 | 亚洲播播 | 在线观看免费av片 | 国产精品美女久久久久久久 | 一区二区精品国产 | 亚洲另类在线视频 | 免费视频91蜜桃 | 亚洲精品18p | 日本精品中文字幕 | 日p视频在线观看 | 丁香婷婷综合色啪 | 麻豆视频国产 | 久草网视频在线观看 | 国产在线无 | 成人在线免费小视频 | 91资源在线播放 | 97超碰人人模人人人爽人人爱 | av九九九 | 欧美一区免费在线观看 | 亚洲日韩中文字幕 | 国产区久久 | 免费日韩 精品中文字幕视频在线 | 成人黄色小说在线观看 | 91免费网| av成人免费在线 | 色欧美视频 | 99热这里只有精品国产首页 | www.天天干| 免费网站在线观看人 | 亚洲精品在线免费看 | 日本在线观看视频一区 | 免费看久久久 | 夜夜爽夜夜操 | 一区二区三区在线影院 | 国产精品一区二区av影院萌芽 | 色av网站 | 人人超碰97 | 91桃色国产在线播放 | 黄色一级大片在线免费看国产一 | 夜夜高潮夜夜爽国产伦精品 | 中文字幕在线播放一区 | 丁香六月婷婷综合 | 成年人在线 | 久久国内免费视频 | 久久久wwww | 亚洲最新视频在线播放 | 爱干视频 | 天天操天天舔天天干 | 精品久久久久久电影 | 懂色av一区二区在线播放 | 欧美日韩精品区 | 中文在线www | 欧美性高跟鞋xxxxhd | 久青草国产在线 | 日韩欧美在线高清 | 92国产精品久久久久首页 | 麻豆小视频在线观看 | 中文理论片 | 亚洲国内精品在线 | av网址最新 | 欧美永久视频 | a资源在线 | 色噜噜狠狠色综合中国 | 国产免费观看高清完整版 | av在线永久免费观看 | 免费日韩在线 | 久久九九影视网 | 999久久久久久久久 69av视频在线观看 | 人人干狠狠操 | 日韩午夜在线播放 | 99国产精品一区二区 | 色视频在线免费观看 | 丁香午夜 | 久久精品网站视频 | 91精品国产一区二区三区 | 日韩在线视频不卡 | 成人av在线亚洲 | 最近中文字幕高清字幕免费mv | 菠萝菠萝在线精品视频 | 超碰在线免费福利 | 久久五月激情 | 四川bbb搡bbb爽爽视频 | 亚洲成人精品在线观看 | 欧美激情综合五月色丁香小说 | 在线观看国产成人av片 | 韩国精品在线 | 爱爱av在线 | 天天干,天天射,天天操,天天摸 | 69国产成人综合久久精品欧美 | 国产高清网站 | 日韩中文免费视频 | 91久久影院 | 五月天视频网站 | 欧美精品在线免费 | 国产最顶级的黄色片在线免费观看 | 91av在线免费看 | 91精品国 | 色网站免费在线观看 | 亚洲高清网站 | 黄色免费看片网站 | 99久久精品免费看国产麻豆 | 激情网站| 国内视频一区二区 | 天天干天天做天天爱 | 久久国产精品免费 | 日韩亚洲国产中文字幕 | 日韩在线中文字幕视频 | 日韩动态视频 | 亚洲精品男人的天堂 | 一区二区三区日韩精品 | 狠狠gao| 97久久久免费福利网址 | 丁香婷婷激情网 | 国产成人一区二区在线观看 | 蜜臀av网站 | 欧美精品久久人人躁人人爽 | 成年人在线免费视频观看 | 国产精品2018 | 五月婷婷激情 | 国产精品短视频 | 国产不卡一二三区 | 中文字幕91视频 | 超碰人人超 | 亚洲伦理一区 | 月下香电影| 狠狠色丁香久久综合网 | 欧美中文字幕第一页 | 久草爱| 黄色一区三区 | 亚洲成人精品 | 亚洲综合国产精品 | 日韩欧美精品在线 | 欧美永久视频 | 久久精品综合网 | 久久久精品视频网站 | 国产精品免费视频网站 | 日韩精品一卡 | 日本精品久久久久中文字幕5 | 国产二区电影 | 久草在线视频中文 | 日韩理论电影网 | 欧美日韩啪啪 | 欧美亚洲国产精品久久高清浪潮 | 日日夜夜狠狠 | 中文字幕在线日本 | 日韩欧美精品在线视频 | 在线免费亚洲 | 麻豆视屏 | 五月激情婷婷丁香 | 欧美一区,二区 | 欧美日韩亚洲第一页 | 久久久精品 | 国产免费a| 婷婷福利影院 | 欧美日韩视频在线观看免费 | 97色在线观看免费视频 | 96久久| 国产精品永久免费在线 | 久久久久成人精品亚洲国产 | 就色干综合| 韩国精品福利一区二区三区 | 99久久婷婷国产综合精品 | 国产精品成人一区二区三区 | 久久久久国产精品视频 | 久久国产成人午夜av影院潦草 | 中文字幕在线视频一区 | 国产精彩在线视频 | 国产成人在线观看免费 | 久久久影院一区二区三区 | 亚洲欧美日韩一二三区 | 一区二区三区在线观看免费视频 | 天堂av网址| 伊人导航 | 精品国产aⅴ麻豆 | 在线观看中文字幕av | 色综合久久综合网 | 日日夜夜艹 | 久久伦理影院 | 国产精品你懂的在线观看 | 四川bbb搡bbb爽爽视频 | 欧美日韩一级在线 | 欧美做受69 | 最新中文字幕在线观看视频 | 天天视频亚洲 | 久久一级电影 | 国产成人亚洲在线观看 | 极品久久久久 | 久久午夜免费视频 | 91精品无人成人www | 亚洲免费视频观看 | 黄色一级大片在线免费看产 | 久久久久人人 | 久久久网站 | 亚洲特级毛片 | 亚洲精品午夜久久久久久久 | 最新日韩视频在线观看 | 天天天插 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 69中文字幕| 天天草综合| 国产自产在线视频 | 国产日产精品一区二区三区四区 | 亚洲女同ⅹxx女同tv | 久久久国产精品亚洲一区 | 亚洲精品1区2区3区 超碰成人网 | 免费看十八岁美女 | 国产精品久久久久久久久久直播 | 99精品免费久久久久久日本 | 欧美欧美| 久久a免费视频 | 黄色天堂在线观看 | 99久久www免费 | 91精品网站| 婷婷六月激情 | 欧亚久久| 黄色大片日本 | 久久伦理 | 精品国产成人在线影院 | 久久国精品 | 色一色在线 | 国产一级在线 | 日韩h在线观看 | 涩涩网站在线播放 | 中文亚洲欧美日韩 | 国产精品视频地址 | 精品一区二区亚洲 | 午夜av色 | 黄色av电影 | 成年人免费看av | 日韩一级黄色大片 | 国产在线永久 | 精品福利视频在线 | 免费一级黄色 | 97在线观视频免费观看 | 亚洲.www| 国产在线观看地址 | 三级av网站 | 亚洲精品午夜国产va久久成人 | 日韩欧美在线综合网 | 国产精品亚州 | av在线日韩 | 国产色网 | 18国产精品白浆在线观看免费 | 久香蕉 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 亚洲精品中文字幕视频 | 国产免费又爽又刺激在线观看 | av免费在线观看网站 | 天堂av在线网址 | 亚洲免费国产视频 | 亚洲成人黄色在线观看 | 日日婷婷夜日日天干 | 国产精品毛片久久久久久久久久99999999 | 人人要人人澡人人爽人人dvd | 不卡精品视频 | 久久久天天操 | 成人av直播 | 色欧美日韩 | 色噜噜在线观看 | 久草免费看 | 亚洲欧洲在线视频 | 久久久网址 | 国产精品久久久久久久久久久久午夜 | 日本久久不卡视频 | 99热精品在线 | 国产91电影在线观看 | 天天操天天射天天爱 | 黄色成年网站 | 在线视频福利 | 在线欧美a | 国产精品嫩草在线 | 午夜久久 | 国产资源网 | 在线观看国产www | 亚洲国产精品成人女人久久 | 毛片基地黄久久久久久天堂 | 在线高清一区 |