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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LOAM源码结合论文解析(二)laserOdometry

發(fā)布時間:2023/12/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LOAM源码结合论文解析(二)laserOdometry 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

中文注釋版本。本文大多注釋來自 --- https://github.com/daobilige-su/loam_velodyne

laserOdometry節(jié)點接收scanResgistraion傳過來的點云,進行點云匹配來估計位姿,并發(fā)布里程計以及去畸變的點云給mapping節(jié)點。下面先大體分析下算法原理。

目錄

算法概要分析

laserCloudXXXHandler()

TransformToStart()

TransformToEnd()

核心代碼

點線匹配

點面匹配

最小二乘問題構(gòu)建

遺留問題


算法概要分析

算法流程:

  • 將上一幀( — )的點云補償?shù)?時刻,表示為;
  • 將當(dāng)前幀點云中的特征點(邊緣點和平面點)補償也補償?shù)?時刻;
  • 和特征點完成點線匹配和點面匹配
  • 構(gòu)建最小二乘問題進行優(yōu)化
  • 具體如何操作,在下面結(jié)合相關(guān)代碼進行細致說明。

    laserCloudXXXHandler()

    訂閱句柄的操作都相似,獲取數(shù)據(jù)。

    void laserCloudSharpHandler(const sensor_msgs::PointCloud2ConstPtr& cornerPointsSharp2) {timeCornerPointsSharp = cornerPointsSharp2->header.stamp.toSec();cornerPointsSharp->clear();pcl::fromROSMsg(*cornerPointsSharp2, *cornerPointsSharp);std::vector<int> indices;//去除無效點pcl::removeNaNFromPointCloud(*cornerPointsSharp,*cornerPointsSharp, indices);newCornerPointsSharp = true; }

    TransformToStart()

    功能:當(dāng)前點云中的點相對第一個點去除因勻速運動產(chǎn)生的畸變(加速度畸變在上一個節(jié)點中補償過了),效果相當(dāng)于得到在點云掃描開始位置靜止掃描得到的點云(就是算法流程中的第二步)。

    論文中上述公式對應(yīng)代碼,一個點云周期0.1s,上下同乘10。T用transform[6]來表示,代表上一幀到這一幀的變換,包含旋轉(zhuǎn)向量和三維平移量。

    ?對各個點進行補償,注意要先平移再旋轉(zhuǎn),而且這里是從當(dāng)前幀變換到上一幀,旋轉(zhuǎn)矩陣是求個逆的。具體代碼如下。

    void TransformToStart(PointType const * const pi, PointType * const po) {//插值系數(shù)計算,云中每個點的相對時間/點云周期10float s = 10 * (pi->intensity - int(pi->intensity));//線性插值:根據(jù)每個點在點云中的相對位置關(guān)系,乘以相應(yīng)的旋轉(zhuǎn)平移系數(shù)float rx = s * transform[0];float ry = s * transform[1];float rz = s * transform[2];float tx = s * transform[3];float ty = s * transform[4];float tz = s * transform[5];//變換到start時刻//平移后繞z軸旋轉(zhuǎn)(-rz)float x1 = cos(rz) * (pi->x - tx) + sin(rz) * (pi->y - ty);float y1 = -sin(rz) * (pi->x - tx) + cos(rz) * (pi->y - ty);float z1 = (pi->z - tz);//繞x軸旋轉(zhuǎn)(-rx)float x2 = x1;float y2 = cos(rx) * y1 + sin(rx) * z1;float z2 = -sin(rx) * y1 + cos(rx) * z1;//繞y軸旋轉(zhuǎn)(-ry)po->x = cos(ry) * x2 - sin(ry) * z2;po->y = y2;po->z = sin(ry) * x2 + cos(ry) * z2;po->intensity = pi->intensity; }

    TransformToEnd()

    功能:對點云向后補償(算法流程第一步)。

    思路:先把當(dāng)前各點向前補償,如TransformToStart(),流程一樣的,再用transform整體向后補償(transform正好是從上一幀到當(dāng)前幀的變換)。具體看注釋。

    void TransformToEnd(PointType const * const pi, PointType * const po) {//插值系數(shù)計算float s = 10 * (pi->intensity - int(pi->intensity));float rx = s * transform[0];float ry = s * transform[1];float rz = s * transform[2];float tx = s * transform[3];float ty = s * transform[4];float tz = s * transform[5];//先向前補償//平移后繞z軸旋轉(zhuǎn)(-rz)float x1 = cos(rz) * (pi->x - tx) + sin(rz) * (pi->y - ty);float y1 = -sin(rz) * (pi->x - tx) + cos(rz) * (pi->y - ty);float z1 = (pi->z - tz);//繞x軸旋轉(zhuǎn)(-rx)float x2 = x1;float y2 = cos(rx) * y1 + sin(rx) * z1;float z2 = -sin(rx) * y1 + cos(rx) * z1;//繞y軸旋轉(zhuǎn)(-ry)float x3 = cos(ry) * x2 - sin(ry) * z2;float y3 = y2;float z3 = sin(ry) * x2 + cos(ry) * z2;//求出了相對于起始點校正的坐標(biāo)//整體向后補償rx = transform[0];ry = transform[1];rz = transform[2];tx = transform[3];ty = transform[4];tz = transform[5];//繞y軸旋轉(zhuǎn)(ry)float x4 = cos(ry) * x3 + sin(ry) * z3;float y4 = y3;float z4 = -sin(ry) * x3 + cos(ry) * z3;//繞x軸旋轉(zhuǎn)(rx)float x5 = x4;float y5 = cos(rx) * y4 - sin(rx) * z4;float z5 = sin(rx) * y4 + cos(rx) * z4;//繞z軸旋轉(zhuǎn)(rz),再平移float x6 = cos(rz) * x5 - sin(rz) * y5 + tx;float y6 = sin(rz) * x5 + cos(rz) * y5 + ty;float z6 = z5 + tz;// 我認為到這里其實就已經(jīng)完成了補償(局部坐標(biāo)系下),下面還有兩次變換好像換到了世界坐標(biāo)系了?// 不是很懂了,歡迎各位下方留言為小弟解惑//----------------------------//平移后繞z軸旋轉(zhuǎn)(imuRollStart)float x7 = cos(imuRollStart) * (x6 - imuShiftFromStartX) - sin(imuRollStart) * (y6 - imuShiftFromStartY);float y7 = sin(imuRollStart) * (x6 - imuShiftFromStartX) + cos(imuRollStart) * (y6 - imuShiftFromStartY);float z7 = z6 - imuShiftFromStartZ;//繞x軸旋轉(zhuǎn)(imuPitchStart)float x8 = x7;float y8 = cos(imuPitchStart) * y7 - sin(imuPitchStart) * z7;float z8 = sin(imuPitchStart) * y7 + cos(imuPitchStart) * z7;//繞y軸旋轉(zhuǎn)(imuYawStart)float x9 = cos(imuYawStart) * x8 + sin(imuYawStart) * z8;float y9 = y8;float z9 = -sin(imuYawStart) * x8 + cos(imuYawStart) * z8;//繞y軸旋轉(zhuǎn)(-imuYawLast)float x10 = cos(imuYawLast) * x9 - sin(imuYawLast) * z9;float y10 = y9;float z10 = sin(imuYawLast) * x9 + cos(imuYawLast) * z9;//繞x軸旋轉(zhuǎn)(-imuPitchLast)float x11 = x10;float y11 = cos(imuPitchLast) * y10 + sin(imuPitchLast) * z10;float z11 = -sin(imuPitchLast) * y10 + cos(imuPitchLast) * z10;//繞z軸旋轉(zhuǎn)(-imuRollLast)po->x = cos(imuRollLast) * x11 + sin(imuRollLast) * y11;po->y = -sin(imuRollLast) * x11 + cos(imuRollLast) * y11;po->z = z11;//只保留線號po->intensity = int(pi->intensity); }

    核心代碼

    下面進入主題。

    先看看點線匹配、點面匹配的理論部分,說明一下論文和代碼的對應(yīng)部分。

    點線匹配

    正如之前所說的那樣,我們在點云中找匹配子,特征點表示為i,用kdtree查找第一個距離i最近點,記為點j;在j附近scan中查找另一個距離i最近的點,記為l。保證點j、l不在同一scan中,這樣可以避免出現(xiàn)3點處于同一scan。

    ?根據(jù)上式計算點到線的距離,通化優(yōu)化transform來使d值最小。這個式子分子部分為兩個向量(ij 和 il )叉乘的模,在幾何意義上來說就是以這兩向量為鄰邊圍成平行四邊形的面積,分子為向量jl的模,也就是低,高 = 面積/低。(圖畫得有點丑...)

    ?代碼具體注釋看下方。

    void edgeCor(){//處理當(dāng)前點云中的曲率最大的特征點,從上個點云中曲率比較大的特征點中找兩個最近距離點,一個點使用kd-tree查找,另一個根據(jù)找到的點在其相鄰線找另外一個最近距離的點for (int i = 0; i < cornerPointsSharpNum; i++) {TransformToStart(&cornerPointsSharp->points[i], &pointSel);//每迭代五次,重新查找最近點if (iterCount % 5 == 0) {std::vector<int> indices;pcl::removeNaNFromPointCloud(*laserCloudCornerLast,*laserCloudCornerLast, indices);//kd-tree查找一個最近距離點,邊沿點未經(jīng)過體素柵格濾波,一般邊沿點本來就比較少,不做濾波kdtreeCornerLast->nearestKSearch(pointSel, 1, pointSearchInd, pointSearchSqDis);int closestPointInd = -1, minPointInd2 = -1;//尋找相鄰線距離目標(biāo)點距離最小的點//再次提醒:velodyne是2度一線,scanID相鄰并不代表線號相鄰,相鄰線度數(shù)相差2度,也即線號scanID相差2if (pointSearchSqDis[0] < 25) {//找到的最近點距離的確很近的話closestPointInd = pointSearchInd[0];//提取最近點線號int closestPointScan = int(laserCloudCornerLast->points[closestPointInd].intensity);float pointSqDis, minPointSqDis2 = 25;//初始門檻值5米,可大致過濾掉scanID相鄰,但實際線不相鄰的值//尋找距離目標(biāo)點最近距離的平方和最小的點for (int j = closestPointInd + 1; j < cornerPointsSharpNum; j++) {//向scanID增大的方向查找if (int(laserCloudCornerLast->points[j].intensity) > closestPointScan + 2.5) {//非相鄰線break;}pointSqDis = (laserCloudCornerLast->points[j].x - pointSel.x) * (laserCloudCornerLast->points[j].x - pointSel.x) + (laserCloudCornerLast->points[j].y - pointSel.y) * (laserCloudCornerLast->points[j].y - pointSel.y) + (laserCloudCornerLast->points[j].z - pointSel.z) * (laserCloudCornerLast->points[j].z - pointSel.z);if (int(laserCloudCornerLast->points[j].intensity) > closestPointScan) {//確保兩個點不在同一條scan上(相鄰線查找應(yīng)該可以用scanID == closestPointScan +/- 1 來做)if (pointSqDis < minPointSqDis2) {//距離更近,要小于初始值5米//更新最小距離與點序minPointSqDis2 = pointSqDis;minPointInd2 = j;}}}//同理for (int j = closestPointInd - 1; j >= 0; j--) {//向scanID減小的方向查找if (int(laserCloudCornerLast->points[j].intensity) < closestPointScan - 2.5) {break;}pointSqDis = (laserCloudCornerLast->points[j].x - pointSel.x) * (laserCloudCornerLast->points[j].x - pointSel.x) + (laserCloudCornerLast->points[j].y - pointSel.y) * (laserCloudCornerLast->points[j].y - pointSel.y) + (laserCloudCornerLast->points[j].z - pointSel.z) * (laserCloudCornerLast->points[j].z - pointSel.z);if (int(laserCloudCornerLast->points[j].intensity) < closestPointScan) {if (pointSqDis < minPointSqDis2) {minPointSqDis2 = pointSqDis;minPointInd2 = j;}}}}//記住組成線的點序pointSearchCornerInd1[i] = closestPointInd;//kd-tree最近距離點,-1表示未找到滿足的點pointSearchCornerInd2[i] = minPointInd2;//另一個最近的,-1表示未找到滿足的點}if (pointSearchCornerInd2[i] >= 0) {//大于等于0,不等于-1,說明兩個點都找到了tripod1 = laserCloudCornerLast->points[pointSearchCornerInd1[i]];tripod2 = laserCloudCornerLast->points[pointSearchCornerInd2[i]];//選擇的特征點記為O,kd-tree最近距離點記為A,另一個最近距離點記為Bfloat x0 = pointSel.x;float y0 = pointSel.y;float z0 = pointSel.z;float x1 = tripod1.x;float y1 = tripod1.y;float z1 = tripod1.z;float x2 = tripod2.x;float y2 = tripod2.y;float z2 = tripod2.z;//向量OA = (x0 - x1, y0 - y1, z0 - z1), 向量OB = (x0 - x2, y0 - y2, z0 - z2),向量AB = (x1 - x2, y1 - y2, z1 - z2)//向量OA OB的向量積(即叉乘)為://| i j k |//|x0-x1 y0-y1 z0-z1|//|x0-x2 y0-y2 z0-z2|//模為:float a012 = sqrt(((x0 - x1)*(y0 - y2) - (x0 - x2)*(y0 - y1))* ((x0 - x1)*(y0 - y2) - (x0 - x2)*(y0 - y1)) + ((x0 - x1)*(z0 - z2) - (x0 - x2)*(z0 - z1))* ((x0 - x1)*(z0 - z2) - (x0 - x2)*(z0 - z1)) + ((y0 - y1)*(z0 - z2) - (y0 - y2)*(z0 - z1))* ((y0 - y1)*(z0 - z2) - (y0 - y2)*(z0 - z1)));//兩個最近距離點之間的距離,即向量AB的模float l12 = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2) + (z1 - z2)*(z1 - z2));//AB方向的單位向量與OAB平面的單位法向量的向量積在各軸上的分量(d的方向)//x軸分量ifloat la = ((y1 - y2)*((x0 - x1)*(y0 - y2) - (x0 - x2)*(y0 - y1)) + (z1 - z2)*((x0 - x1)*(z0 - z2) - (x0 - x2)*(z0 - z1))) / a012 / l12;//y軸分量jfloat lb = -((x1 - x2)*((x0 - x1)*(y0 - y2) - (x0 - x2)*(y0 - y1)) - (z1 - z2)*((y0 - y1)*(z0 - z2) - (y0 - y2)*(z0 - z1))) / a012 / l12;//z軸分量kfloat lc = -((x1 - x2)*((x0 - x1)*(z0 - z2) - (x0 - x2)*(z0 - z1)) + (y1 - y2)*((y0 - y1)*(z0 - z2) - (y0 - y2)*(z0 - z1))) / a012 / l12;//點到線的距離,d = |向量OA 叉乘 向量OB|/|AB|float ld2 = a012 / l12;//unusedpointProj = pointSel;pointProj.x -= la * ld2;pointProj.y -= lb * ld2;pointProj.z -= lc * ld2;//權(quán)重計算,距離越大權(quán)重越小,距離越小權(quán)重越大,得到的權(quán)重范圍<=1float s = 1;if (iterCount >= 5) {//5次迭代之后開始增加權(quán)重因素s = 1 - 1.8 * fabs(ld2);}//考慮權(quán)重coeff.x = s * la;coeff.y = s * lb;coeff.z = s * lc;coeff.intensity = s * ld2;if (s > 0.1 && ld2 != 0) {//只保留權(quán)重大的,也即距離比較小的點,同時也舍棄距離為零的laserCloudOri->push_back(cornerPointsSharp->points[i]);coeffSel->push_back(coeff);}}} }

    點面匹配

  • ?找距離i點最近點j;
  • 在j附近scan中找距離 i 最近點m;
  • 在j相同scan中找距離 i 最近點l;
  • 點j、m、l構(gòu)成平面,計算點 i 到平面距離;
  • 優(yōu)化transform使得點到平面距離最小,得到變換矩陣。
  • (這里注意點m、l 兩個點中要有一個同j scan,另一個點不同,為了避免三點共線而導(dǎo)致沒有平面的情況)

    點到平面距離公式如上,分子是 的模,幾何意義為點i j l m四點在空間中所圍立方體的體積,分母還是那個四邊形面積。那么距離 = 體積/面積。

    代碼如下:

    void surfCor(){ //對本次接收到的曲率最小的點,從上次接收到的點云曲率比較小的點中找三點組成平面,一個使用kd-tree查找,另外一個在同一線上查找滿足要求的,第三個在不同線上查找滿足要求的 for (int i = 0; i < surfPointsFlatNum; i++) {TransformToStart(&surfPointsFlat->points[i], &pointSel);if (iterCount % 5 == 0) {//kd-tree最近點查找,在經(jīng)過體素柵格濾波之后的平面點中查找,一般平面點太多,濾波后最近點查找數(shù)據(jù)量小kdtreeSurfLast->nearestKSearch(pointSel, 1, pointSearchInd, pointSearchSqDis);int closestPointInd = -1, minPointInd2 = -1, minPointInd3 = -1;if (pointSearchSqDis[0] < 25) {closestPointInd = pointSearchInd[0];int closestPointScan = int(laserCloudSurfLast->points[closestPointInd].intensity);float pointSqDis, minPointSqDis2 = 25, minPointSqDis3 = 25;for (int j = closestPointInd + 1; j < surfPointsFlatNum; j++) {if (int(laserCloudSurfLast->points[j].intensity) > closestPointScan + 2.5) {break;}pointSqDis = (laserCloudSurfLast->points[j].x - pointSel.x) * (laserCloudSurfLast->points[j].x - pointSel.x) + (laserCloudSurfLast->points[j].y - pointSel.y) * (laserCloudSurfLast->points[j].y - pointSel.y) + (laserCloudSurfLast->points[j].z - pointSel.z) * (laserCloudSurfLast->points[j].z - pointSel.z);if (int(laserCloudSurfLast->points[j].intensity) <= closestPointScan) {//如果點的線號小于等于最近點的線號(應(yīng)該最多取等,也即同一線上的點)if (pointSqDis < minPointSqDis2) {minPointSqDis2 = pointSqDis;minPointInd2 = j;}} else {//如果點處在大于該線上if (pointSqDis < minPointSqDis3) {minPointSqDis3 = pointSqDis;minPointInd3 = j;}}}//同理for (int j = closestPointInd - 1; j >= 0; j--) {if (int(laserCloudSurfLast->points[j].intensity) < closestPointScan - 2.5) {break;}pointSqDis = (laserCloudSurfLast->points[j].x - pointSel.x) * (laserCloudSurfLast->points[j].x - pointSel.x) + (laserCloudSurfLast->points[j].y - pointSel.y) * (laserCloudSurfLast->points[j].y - pointSel.y) + (laserCloudSurfLast->points[j].z - pointSel.z) * (laserCloudSurfLast->points[j].z - pointSel.z);if (int(laserCloudSurfLast->points[j].intensity) >= closestPointScan) {if (pointSqDis < minPointSqDis2) {minPointSqDis2 = pointSqDis;minPointInd2 = j;}} else {if (pointSqDis < minPointSqDis3) {minPointSqDis3 = pointSqDis;minPointInd3 = j;}}}}pointSearchSurfInd1[i] = closestPointInd;//kd-tree最近距離點,-1表示未找到滿足要求的點pointSearchSurfInd2[i] = minPointInd2;//同一線號上的距離最近的點,-1表示未找到滿足要求的點pointSearchSurfInd3[i] = minPointInd3;//不同線號上的距離最近的點,-1表示未找到滿足要求的點}if (pointSearchSurfInd2[i] >= 0 && pointSearchSurfInd3[i] >= 0) {//找到了三個點tripod1 = laserCloudSurfLast->points[pointSearchSurfInd1[i]];//A點tripod2 = laserCloudSurfLast->points[pointSearchSurfInd2[i]];//B點tripod3 = laserCloudSurfLast->points[pointSearchSurfInd3[i]];//C點//向量AB = (tripod2.x - tripod1.x, tripod2.y - tripod1.y, tripod2.z - tripod1.z)//向量AC = (tripod3.x - tripod1.x, tripod3.y - tripod1.y, tripod3.z - tripod1.z)//向量AB AC的向量積(即叉乘),得到的是法向量//x軸方向分向量ifloat pa = (tripod2.y - tripod1.y) * (tripod3.z - tripod1.z) - (tripod3.y - tripod1.y) * (tripod2.z - tripod1.z);//y軸方向分向量jfloat pb = (tripod2.z - tripod1.z) * (tripod3.x - tripod1.x) - (tripod3.z - tripod1.z) * (tripod2.x - tripod1.x);//z軸方向分向量kfloat pc = (tripod2.x - tripod1.x) * (tripod3.y - tripod1.y) - (tripod3.x - tripod1.x) * (tripod2.y - tripod1.y);float pd = -(pa * tripod1.x + pb * tripod1.y + pc * tripod1.z);//法向量的模float ps = sqrt(pa * pa + pb * pb + pc * pc);//pa pb pc為法向量各方向上的單位向量pa /= ps;pb /= ps;pc /= ps;pd /= ps;//點到面的距離:向量OA與與法向量的點積除以法向量的模float pd2 = pa * pointSel.x + pb * pointSel.y + pc * pointSel.z + pd;//unusedpointProj = pointSel;pointProj.x -= pa * pd2;pointProj.y -= pb * pd2;pointProj.z -= pc * pd2;//同理計算權(quán)重float s = 1;if (iterCount >= 5) {s = 1 - 1.8 * fabs(pd2) / sqrt(sqrt(pointSel.x * pointSel.x+ pointSel.y * pointSel.y + pointSel.z * pointSel.z));}//考慮權(quán)重coeff.x = s * pa;coeff.y = s * pb;coeff.z = s * pc;coeff.intensity = s * pd2;if (s > 0.1 && pd2 != 0) {//保存原始點與相應(yīng)的系數(shù)laserCloudOri->push_back(surfPointsFlat->points[i]);coeffSel->push_back(coeff);}} }

    最小二乘問題構(gòu)建

    建立最小二乘問題進行優(yōu)化。

    代碼中MatA表示雅可比矩陣,MatB表示非線性方程。建立方程如下:

    也就是matAtA * matX = matAtB,迭代法求matX。這里還是牛頓法。

    {cv::Mat matA(pointSelNum, 6, CV_32F, cv::Scalar::all(0));cv::Mat matAt(6, pointSelNum, CV_32F, cv::Scalar::all(0));cv::Mat matAtA(6, 6, CV_32F, cv::Scalar::all(0));cv::Mat matB(pointSelNum, 1, CV_32F, cv::Scalar::all(0));cv::Mat matAtB(6, 1, CV_32F, cv::Scalar::all(0));cv::Mat matX(6, 1, CV_32F, cv::Scalar::all(0));//計算matA,matB矩陣for (int i = 0; i < pointSelNum; i++) {pointOri = laserCloudOri->points[i];coeff = coeffSel->points[i];float s = 1;float srx = sin(s * transform[0]);float crx = cos(s * transform[0]);float sry = sin(s * transform[1]);float cry = cos(s * transform[1]);float srz = sin(s * transform[2]);float crz = cos(s * transform[2]);float tx = s * transform[3];float ty = s * transform[4];float tz = s * transform[5];//求解雅可比矩陣//小弟不才,這里已經(jīng)窒息了,雅各比各參數(shù)應(yīng)該f(x)對尋優(yōu)參數(shù)的一階導(dǎo)數(shù)(可以參考視覺slam14講)float arx = (-s*crx*sry*srz*pointOri.x + s*crx*crz*sry*pointOri.y + s*srx*sry*pointOri.z + s*tx*crx*sry*srz - s*ty*crx*crz*sry - s*tz*srx*sry) * coeff.x+ (s*srx*srz*pointOri.x - s*crz*srx*pointOri.y + s*crx*pointOri.z+ s*ty*crz*srx - s*tz*crx - s*tx*srx*srz) * coeff.y+ (s*crx*cry*srz*pointOri.x - s*crx*cry*crz*pointOri.y - s*cry*srx*pointOri.z+ s*tz*cry*srx + s*ty*crx*cry*crz - s*tx*crx*cry*srz) * coeff.z;float ary = ((-s*crz*sry - s*cry*srx*srz)*pointOri.x + (s*cry*crz*srx - s*sry*srz)*pointOri.y - s*crx*cry*pointOri.z + tx*(s*crz*sry + s*cry*srx*srz) + ty*(s*sry*srz - s*cry*crz*srx) + s*tz*crx*cry) * coeff.x+ ((s*cry*crz - s*srx*sry*srz)*pointOri.x + (s*cry*srz + s*crz*srx*sry)*pointOri.y - s*crx*sry*pointOri.z+ s*tz*crx*sry - ty*(s*cry*srz + s*crz*srx*sry) - tx*(s*cry*crz - s*srx*sry*srz)) * coeff.z;float arz = ((-s*cry*srz - s*crz*srx*sry)*pointOri.x + (s*cry*crz - s*srx*sry*srz)*pointOri.y+ tx*(s*cry*srz + s*crz*srx*sry) - ty*(s*cry*crz - s*srx*sry*srz)) * coeff.x+ (-s*crx*crz*pointOri.x - s*crx*srz*pointOri.y+ s*ty*crx*srz + s*tx*crx*crz) * coeff.y+ ((s*cry*crz*srx - s*sry*srz)*pointOri.x + (s*crz*sry + s*cry*srx*srz)*pointOri.y+ tx*(s*sry*srz - s*cry*crz*srx) - ty*(s*crz*sry + s*cry*srx*srz)) * coeff.z;float atx = -s*(cry*crz - srx*sry*srz) * coeff.x + s*crx*srz * coeff.y - s*(crz*sry + cry*srx*srz) * coeff.z;float aty = -s*(cry*srz + crz*srx*sry) * coeff.x - s*crx*crz * coeff.y - s*(sry*srz - cry*crz*srx) * coeff.z;float atz = s*crx*sry * coeff.x - s*srx * coeff.y - s*crx*cry * coeff.z;float d2 = coeff.intensity;matA.at<float>(i, 0) = arx;matA.at<float>(i, 1) = ary;matA.at<float>(i, 2) = arz;matA.at<float>(i, 3) = atx;matA.at<float>(i, 4) = aty;matA.at<float>(i, 5) = atz;matB.at<float>(i, 0) = -0.05 * d2;}cv::transpose(matA, matAt);matAtA = matAt * matA;matAtB = matAt * matB;//求解matAtA * matX = matAtBcv::solve(matAtA, matAtB, matX, cv::DECOMP_QR);if (iterCount == 0) {//特征值1*6矩陣cv::Mat matE(1, 6, CV_32F, cv::Scalar::all(0));//特征向量6*6矩陣cv::Mat matV(6, 6, CV_32F, cv::Scalar::all(0));cv::Mat matV2(6, 6, CV_32F, cv::Scalar::all(0));//求解特征值/特征向量cv::eigen(matAtA, matE, matV);matV.copyTo(matV2);isDegenerate = false;//特征值取值門檻float eignThre[6] = {10, 10, 10, 10, 10, 10};for (int i = 5; i >= 0; i--) {//從小到大查找if (matE.at<float>(0, i) < eignThre[i]) {//特征值太小,則認為處在兼并環(huán)境中,發(fā)生了退化for (int j = 0; j < 6; j++) {//對應(yīng)的特征向量置為0matV2.at<float>(i, j) = 0;}isDegenerate = true;} else {break;}}//計算P矩陣matP = matV.inv() * matV2;}if (isDegenerate) {//如果發(fā)生退化,只使用預(yù)測矩陣P計算cv::Mat matX2(6, 1, CV_32F, cv::Scalar::all(0));matX.copyTo(matX2);matX = matP * matX2;}//累加每次迭代的旋轉(zhuǎn)平移量transform[0] += matX.at<float>(0, 0);transform[1] += matX.at<float>(1, 0);transform[2] += matX.at<float>(2, 0);transform[3] += matX.at<float>(3, 0);transform[4] += matX.at<float>(4, 0);transform[5] += matX.at<float>(5, 0);for(int i=0; i<6; i++){if(isnan(transform[i]))//判斷是否非數(shù)字transform[i]=0;}//計算旋轉(zhuǎn)平移量,如果很小就停止迭代float deltaR = sqrt(pow(rad2deg(matX.at<float>(0, 0)), 2) +pow(rad2deg(matX.at<float>(1, 0)), 2) +pow(rad2deg(matX.at<float>(2, 0)), 2));float deltaT = sqrt(pow(matX.at<float>(3, 0) * 100, 2) +pow(matX.at<float>(4, 0) * 100, 2) +pow(matX.at<float>(5, 0) * 100, 2));if (deltaR < 0.1 && deltaT < 0.1) {//迭代終止條件break;} }

    下面放上完整的代碼注解

    int main(int argc, char** argv) {ros::init(argc, argv, "laserOdometry");ros::NodeHandle nh;ros::Subscriber subCornerPointsSharp = nh.subscribe<sensor_msgs::PointCloud2>("/laser_cloud_sharp", 2, laserCloudSharpHandler);ros::Subscriber subCornerPointsLessSharp = nh.subscribe<sensor_msgs::PointCloud2>("/laser_cloud_less_sharp", 2, laserCloudLessSharpHandler);ros::Subscriber subSurfPointsFlat = nh.subscribe<sensor_msgs::PointCloud2>("/laser_cloud_flat", 2, laserCloudFlatHandler);ros::Subscriber subSurfPointsLessFlat = nh.subscribe<sensor_msgs::PointCloud2>("/laser_cloud_less_flat", 2, laserCloudLessFlatHandler);ros::Subscriber subLaserCloudFullRes = nh.subscribe<sensor_msgs::PointCloud2> ("/velodyne_cloud_2", 2, laserCloudFullResHandler);ros::Subscriber subImuTrans = nh.subscribe<sensor_msgs::PointCloud2> ("/imu_trans", 5, imuTransHandler);ros::Publisher pubLaserCloudCornerLast = nh.advertise<sensor_msgs::PointCloud2>("/laser_cloud_corner_last", 2);ros::Publisher pubLaserCloudSurfLast = nh.advertise<sensor_msgs::PointCloud2>("/laser_cloud_surf_last", 2);ros::Publisher pubLaserCloudFullRes = nh.advertise<sensor_msgs::PointCloud2> ("/velodyne_cloud_3", 2);ros::Publisher pubLaserOdometry = nh.advertise<nav_msgs::Odometry> ("/laser_odom_to_init", 5);nav_msgs::Odometry laserOdometry;laserOdometry.header.frame_id = "/camera_init";laserOdometry.child_frame_id = "/laser_odom";tf::TransformBroadcaster tfBroadcaster;tf::StampedTransform laserOdometryTrans;laserOdometryTrans.frame_id_ = "/camera_init";laserOdometryTrans.child_frame_id_ = "/laser_odom";std::vector<int> pointSearchInd;//搜索到的點序std::vector<float> pointSearchSqDis;//搜索到的點平方距離PointType pointOri, pointSel/*選中的特征點*/, tripod1, tripod2, tripod3/*特征點的對應(yīng)點*/, pointProj/*unused*/, coeff;//退化標(biāo)志bool isDegenerate = false;//P矩陣,預(yù)測矩陣cv::Mat matP(6, 6, CV_32F, cv::Scalar::all(0));int frameCount = skipFrameNum;ros::Rate rate(100);bool status = ros::ok();while (status) {ros::spinOnce();if (newCornerPointsSharp && newCornerPointsLessSharp && newSurfPointsFlat && newSurfPointsLessFlat && newLaserCloudFullRes && newImuTrans &&fabs(timeCornerPointsSharp - timeSurfPointsLessFlat) < 0.005 &&fabs(timeCornerPointsLessSharp - timeSurfPointsLessFlat) < 0.005 &&fabs(timeSurfPointsFlat - timeSurfPointsLessFlat) < 0.005 &&fabs(timeLaserCloudFullRes - timeSurfPointsLessFlat) < 0.005 &&fabs(timeImuTrans - timeSurfPointsLessFlat) < 0.005) { //同步作用,確保同時收到同一個點云的特征點以及IMU信息才進入newCornerPointsSharp = false;newCornerPointsLessSharp = false;newSurfPointsFlat = false;newSurfPointsLessFlat = false;newLaserCloudFullRes = false;newImuTrans = false;//將第一個點云數(shù)據(jù)集發(fā)送給laserMapping,從下一個點云數(shù)據(jù)開始處理,我們需要兩幀數(shù)據(jù)來進行匹配。if (!systemInited) {//將cornerPointsLessSharp與laserCloudCornerLast交換,目的保存cornerPointsLessSharp的值下輪使用pcl::PointCloud<PointType>::Ptr laserCloudTemp = cornerPointsLessSharp;cornerPointsLessSharp = laserCloudCornerLast;laserCloudCornerLast = laserCloudTemp;//將surfPointLessFlat與laserCloudSurfLast交換,目的保存surfPointsLessFlat的值下輪使用laserCloudTemp = surfPointsLessFlat;surfPointsLessFlat = laserCloudSurfLast;laserCloudSurfLast = laserCloudTemp;//使用上一幀的特征點構(gòu)建kd-treekdtreeCornerLast->setInputCloud(laserCloudCornerLast);//所有的邊沿點集合kdtreeSurfLast->setInputCloud(laserCloudSurfLast);//所有的平面點集合//將cornerPointsLessSharp和surfPointLessFlat點也即邊沿點和平面點分別發(fā)送給laserMappingsensor_msgs::PointCloud2 laserCloudCornerLast2;pcl::toROSMsg(*laserCloudCornerLast, laserCloudCornerLast2);laserCloudCornerLast2.header.stamp = ros::Time().fromSec(timeSurfPointsLessFlat);laserCloudCornerLast2.header.frame_id = "/camera";pubLaserCloudCornerLast.publish(laserCloudCornerLast2);sensor_msgs::PointCloud2 laserCloudSurfLast2;pcl::toROSMsg(*laserCloudSurfLast, laserCloudSurfLast2);laserCloudSurfLast2.header.stamp = ros::Time().fromSec(timeSurfPointsLessFlat);laserCloudSurfLast2.header.frame_id = "/camera";pubLaserCloudSurfLast.publish(laserCloudSurfLast2);//記住原點的翻滾角和俯仰角transformSum[0] += imuPitchStart;transformSum[2] += imuRollStart;systemInited = true;continue;}//T平移量的初值賦值為加減速的位移量,為其梯度下降的方向(沿用上次轉(zhuǎn)換的T(一個sweep勻速模型),同時在其基礎(chǔ)上減去勻速運動位移,即只考慮加減速的位移量)transform[3] -= imuVeloFromStartX * scanPeriod;transform[4] -= imuVeloFromStartY * scanPeriod;transform[5] -= imuVeloFromStartZ * scanPeriod;if (laserCloudCornerLastNum > 10 && laserCloudSurfLastNum > 100) {std::vector<int> indices;pcl::removeNaNFromPointCloud(*cornerPointsSharp,*cornerPointsSharp, indices);int cornerPointsSharpNum = cornerPointsSharp->points.size();int surfPointsFlatNum = surfPointsFlat->points.size();//Levenberg-Marquardt算法(L-M method),非線性最小二乘算法,最優(yōu)化算法的一種//最多迭代25次for (int iterCount = 0; iterCount < 25; iterCount++) {laserCloudOri->clear();coeffSel->clear();//處理當(dāng)前點云中的曲率最大的特征點,從上個點云中曲率比較大的特征點中找兩個最近距離點,一個點使用kd-tree查找,另一個根據(jù)找到的點在其相鄰線找另外一個最近距離的點edgeCor();surfCor();cv::Mat matA(pointSelNum, 6, CV_32F, cv::Scalar::all(0));cv::Mat matAt(6, pointSelNum, CV_32F, cv::Scalar::all(0));cv::Mat matAtA(6, 6, CV_32F, cv::Scalar::all(0));cv::Mat matB(pointSelNum, 1, CV_32F, cv::Scalar::all(0));cv::Mat matAtB(6, 1, CV_32F, cv::Scalar::all(0));cv::Mat matX(6, 1, CV_32F, cv::Scalar::all(0));//計算matA,matB矩陣for (int i = 0; i < pointSelNum; i++) {pointOri = laserCloudOri->points[i];coeff = coeffSel->points[i];float s = 1;float srx = sin(s * transform[0]);float crx = cos(s * transform[0]);float sry = sin(s * transform[1]);float cry = cos(s * transform[1]);float srz = sin(s * transform[2]);float crz = cos(s * transform[2]);float tx = s * transform[3];float ty = s * transform[4];float tz = s * transform[5];//求解雅可比矩陣float arx = (-s*crx*sry*srz*pointOri.x + s*crx*crz*sry*pointOri.y + s*srx*sry*pointOri.z + s*tx*crx*sry*srz - s*ty*crx*crz*sry - s*tz*srx*sry) * coeff.x+ (s*srx*srz*pointOri.x - s*crz*srx*pointOri.y + s*crx*pointOri.z+ s*ty*crz*srx - s*tz*crx - s*tx*srx*srz) * coeff.y+ (s*crx*cry*srz*pointOri.x - s*crx*cry*crz*pointOri.y - s*cry*srx*pointOri.z+ s*tz*cry*srx + s*ty*crx*cry*crz - s*tx*crx*cry*srz) * coeff.z;float ary = ((-s*crz*sry - s*cry*srx*srz)*pointOri.x + (s*cry*crz*srx - s*sry*srz)*pointOri.y - s*crx*cry*pointOri.z + tx*(s*crz*sry + s*cry*srx*srz) + ty*(s*sry*srz - s*cry*crz*srx) + s*tz*crx*cry) * coeff.x+ ((s*cry*crz - s*srx*sry*srz)*pointOri.x + (s*cry*srz + s*crz*srx*sry)*pointOri.y - s*crx*sry*pointOri.z+ s*tz*crx*sry - ty*(s*cry*srz + s*crz*srx*sry) - tx*(s*cry*crz - s*srx*sry*srz)) * coeff.z;float arz = ((-s*cry*srz - s*crz*srx*sry)*pointOri.x + (s*cry*crz - s*srx*sry*srz)*pointOri.y+ tx*(s*cry*srz + s*crz*srx*sry) - ty*(s*cry*crz - s*srx*sry*srz)) * coeff.x+ (-s*crx*crz*pointOri.x - s*crx*srz*pointOri.y+ s*ty*crx*srz + s*tx*crx*crz) * coeff.y+ ((s*cry*crz*srx - s*sry*srz)*pointOri.x + (s*crz*sry + s*cry*srx*srz)*pointOri.y+ tx*(s*sry*srz - s*cry*crz*srx) - ty*(s*crz*sry + s*cry*srx*srz)) * coeff.z;float atx = -s*(cry*crz - srx*sry*srz) * coeff.x + s*crx*srz * coeff.y - s*(crz*sry + cry*srx*srz) * coeff.z;float aty = -s*(cry*srz + crz*srx*sry) * coeff.x - s*crx*crz * coeff.y - s*(sry*srz - cry*crz*srx) * coeff.z;float atz = s*crx*sry * coeff.x - s*srx * coeff.y - s*crx*cry * coeff.z;float d2 = coeff.intensity;matA.at<float>(i, 0) = arx;matA.at<float>(i, 1) = ary;matA.at<float>(i, 2) = arz;matA.at<float>(i, 3) = atx;matA.at<float>(i, 4) = aty;matA.at<float>(i, 5) = atz;matB.at<float>(i, 0) = -0.05 * d2;}cv::transpose(matA, matAt);matAtA = matAt * matA;matAtB = matAt * matB;//求解matAtA * matX = matAtBcv::solve(matAtA, matAtB, matX, cv::DECOMP_QR);if (iterCount == 0) {//特征值1*6矩陣cv::Mat matE(1, 6, CV_32F, cv::Scalar::all(0));//特征向量6*6矩陣cv::Mat matV(6, 6, CV_32F, cv::Scalar::all(0));cv::Mat matV2(6, 6, CV_32F, cv::Scalar::all(0));//求解特征值/特征向量cv::eigen(matAtA, matE, matV);matV.copyTo(matV2);isDegenerate = false;//特征值取值門檻float eignThre[6] = {10, 10, 10, 10, 10, 10};for (int i = 5; i >= 0; i--) {//從小到大查找if (matE.at<float>(0, i) < eignThre[i]) {//特征值太小,則認為處在兼并環(huán)境中,發(fā)生了退化for (int j = 0; j < 6; j++) {//對應(yīng)的特征向量置為0matV2.at<float>(i, j) = 0;}isDegenerate = true;} else {break;}}//計算P矩陣matP = matV.inv() * matV2;}if (isDegenerate) {//如果發(fā)生退化,只使用預(yù)測矩陣P計算cv::Mat matX2(6, 1, CV_32F, cv::Scalar::all(0));matX.copyTo(matX2);matX = matP * matX2;}//累加每次迭代的旋轉(zhuǎn)平移量transform[0] += matX.at<float>(0, 0);transform[1] += matX.at<float>(1, 0);transform[2] += matX.at<float>(2, 0);transform[3] += matX.at<float>(3, 0);transform[4] += matX.at<float>(4, 0);transform[5] += matX.at<float>(5, 0);for(int i=0; i<6; i++){if(isnan(transform[i]))//判斷是否非數(shù)字transform[i]=0;}//計算旋轉(zhuǎn)平移量,如果很小就停止迭代float deltaR = sqrt(pow(rad2deg(matX.at<float>(0, 0)), 2) +pow(rad2deg(matX.at<float>(1, 0)), 2) +pow(rad2deg(matX.at<float>(2, 0)), 2));float deltaT = sqrt(pow(matX.at<float>(3, 0) * 100, 2) +pow(matX.at<float>(4, 0) * 100, 2) +pow(matX.at<float>(5, 0) * 100, 2));if (deltaR < 0.1 && deltaT < 0.1) {//迭代終止條件break;}}}float rx, ry, rz, tx, ty, tz;//求相對于原點的旋轉(zhuǎn)量,垂直方向上1.05倍修正?AccumulateRotation(transformSum[0], transformSum[1], transformSum[2], -transform[0], -transform[1] * 1.05, -transform[2], rx, ry, rz);float x1 = cos(rz) * (transform[3] - imuShiftFromStartX) - sin(rz) * (transform[4] - imuShiftFromStartY);float y1 = sin(rz) * (transform[3] - imuShiftFromStartX) + cos(rz) * (transform[4] - imuShiftFromStartY);float z1 = transform[5] * 1.05 - imuShiftFromStartZ;float x2 = x1;float y2 = cos(rx) * y1 - sin(rx) * z1;float z2 = sin(rx) * y1 + cos(rx) * z1;//求相對于原點的平移量tx = transformSum[3] - (cos(ry) * x2 + sin(ry) * z2);ty = transformSum[4] - y2;tz = transformSum[5] - (-sin(ry) * x2 + cos(ry) * z2);//根據(jù)IMU修正旋轉(zhuǎn)量PluginIMURotation(rx, ry, rz, imuPitchStart, imuYawStart, imuRollStart, imuPitchLast, imuYawLast, imuRollLast, rx, ry, rz);//得到世界坐標(biāo)系下的轉(zhuǎn)移矩陣transformSum[0] = rx;transformSum[1] = ry;transformSum[2] = rz;transformSum[3] = tx;transformSum[4] = ty;transformSum[5] = tz;//歐拉角轉(zhuǎn)換成四元數(shù)geometry_msgs::Quaternion geoQuat = tf::createQuaternionMsgFromRollPitchYaw(rz, -rx, -ry);//publish四元數(shù)和平移量laserOdometry.header.stamp = ros::Time().fromSec(timeSurfPointsLessFlat);laserOdometry.pose.pose.orientation.x = -geoQuat.y;laserOdometry.pose.pose.orientation.y = -geoQuat.z;laserOdometry.pose.pose.orientation.z = geoQuat.x;laserOdometry.pose.pose.orientation.w = geoQuat.w;laserOdometry.pose.pose.position.x = tx;laserOdometry.pose.pose.position.y = ty;laserOdometry.pose.pose.position.z = tz;pubLaserOdometry.publish(laserOdometry);//廣播新的平移旋轉(zhuǎn)之后的坐標(biāo)系(rviz)laserOdometryTrans.stamp_ = ros::Time().fromSec(timeSurfPointsLessFlat);laserOdometryTrans.setRotation(tf::Quaternion(-geoQuat.y, -geoQuat.z, geoQuat.x, geoQuat.w));laserOdometryTrans.setOrigin(tf::Vector3(tx, ty, tz));tfBroadcaster.sendTransform(laserOdometryTrans);//對點云的曲率比較大和比較小的點投影到掃描結(jié)束位置int cornerPointsLessSharpNum = cornerPointsLessSharp->points.size();for (int i = 0; i < cornerPointsLessSharpNum; i++) {TransformToEnd(&cornerPointsLessSharp->points[i], &cornerPointsLessSharp->points[i]);}int surfPointsLessFlatNum = surfPointsLessFlat->points.size();for (int i = 0; i < surfPointsLessFlatNum; i++) {TransformToEnd(&surfPointsLessFlat->points[i], &surfPointsLessFlat->points[i]);}frameCount++;//點云全部點,每間隔一個點云數(shù)據(jù)相對點云最后一個點進行畸變校正if (frameCount >= skipFrameNum + 1) {int laserCloudFullResNum = laserCloudFullRes->points.size();for (int i = 0; i < laserCloudFullResNum; i++) {TransformToEnd(&laserCloudFullRes->points[i], &laserCloudFullRes->points[i]);}}//畸變校正之后的點作為last點保存等下個點云進來進行匹配pcl::PointCloud<PointType>::Ptr laserCloudTemp = cornerPointsLessSharp;cornerPointsLessSharp = laserCloudCornerLast;laserCloudCornerLast = laserCloudTemp;laserCloudTemp = surfPointsLessFlat;surfPointsLessFlat = laserCloudSurfLast;laserCloudSurfLast = laserCloudTemp;laserCloudCornerLastNum = laserCloudCornerLast->points.size();laserCloudSurfLastNum = laserCloudSurfLast->points.size();//點足夠多就構(gòu)建kd-tree,否則棄用此幀,沿用上一幀數(shù)據(jù)的kd-treeif (laserCloudCornerLastNum > 10 && laserCloudSurfLastNum > 100) {kdtreeCornerLast->setInputCloud(laserCloudCornerLast);kdtreeSurfLast->setInputCloud(laserCloudSurfLast);}//按照跳幀數(shù)publich邊沿點,平面點以及全部點給laserMapping(每隔一幀發(fā)一次)if (frameCount >= skipFrameNum + 1) {frameCount = 0;sensor_msgs::PointCloud2 laserCloudCornerLast2;pcl::toROSMsg(*laserCloudCornerLast, laserCloudCornerLast2);laserCloudCornerLast2.header.stamp = ros::Time().fromSec(timeSurfPointsLessFlat);laserCloudCornerLast2.header.frame_id = "/camera";pubLaserCloudCornerLast.publish(laserCloudCornerLast2);sensor_msgs::PointCloud2 laserCloudSurfLast2;pcl::toROSMsg(*laserCloudSurfLast, laserCloudSurfLast2);laserCloudSurfLast2.header.stamp = ros::Time().fromSec(timeSurfPointsLessFlat);laserCloudSurfLast2.header.frame_id = "/camera";pubLaserCloudSurfLast.publish(laserCloudSurfLast2);sensor_msgs::PointCloud2 laserCloudFullRes3;pcl::toROSMsg(*laserCloudFullRes, laserCloudFullRes3);laserCloudFullRes3.header.stamp = ros::Time().fromSec(timeSurfPointsLessFlat);laserCloudFullRes3.header.frame_id = "/camera";pubLaserCloudFullRes.publish(laserCloudFullRes3);}}status = ros::ok();rate.sleep();}return 0; }

    遺留問題

    AccumulateRotation()、PluginIMURotation() 這兩個函數(shù),并沒有完全看懂,就不亂說了。

    如有問題,歡迎評論留言交流或私信。

    LOAM源碼解析(一)ScanRegistration

    總結(jié)

    以上是生活随笔為你收集整理的LOAM源码结合论文解析(二)laserOdometry的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    69国产盗摄一区二区三区五区 | 麻豆91网站 | 成年人在线免费视频观看 | 亚洲91精品在线观看 | 久久精品一二三区白丝高潮 | 亚洲高清国产视频 | 国产精品久久久久久久久费观看 | 国产精品私拍 | 日日夜夜精品视频天天综合网 | 国产色视频一区二区三区qq号 | 精品专区| 亚洲精品视频在线观看网站 | 超碰97公开 | 天堂激情网 | 久久精品波多野结衣 | 黄色美女免费网站 | 中文在线8资源库 | 婷婷伊人综合亚洲综合网 | 久草综合在线 | 99久久激情视频 | 亚洲国产美女久久久久 | 日韩超碰| 中午字幕在线观看 | 色视频一区 | 欧美在线视频免费 | 久久精品一级片 | 樱空桃av | 国产 在线 高清 精品 | 黄色网在线免费观看 | 亚洲久草在线视频 | 亚洲第五色综合网 | 久久精品久久久久久久 | 国产福利一区在线观看 | 久久国产亚洲 | 97人人人人 | 天天操天天射天天操 | 婷婷激情五月 | 亚洲九九九 | 99久久99久久精品 | 国模精品在线 | 国产丝袜网站 | 97碰碰视频 | 91成人免费在线视频 | 亚洲欧洲在线视频 | 国产精品久久久久久模特 | 国产精品一区在线 | 欧美91成人网 | 久久9视频 | 爱av在线网 | 精品产品国产在线不卡 | 日韩美女久久 | 在线观看深夜福利 | 男女拍拍免费视频 | 国产在线精品观看 | www.97视频 | 精品国产片 | 亚洲精品美女在线 | 天堂视频一区 | 久久久久久久久久久久亚洲 | 日本韩国欧美在线观看 | 播五月婷婷 | 午夜视频福利 | 在线小视频你懂的 | 一级理论片在线观看 | 国产精品麻豆视频 | 精品一区二区三区久久久 | 97在线观看免费高清 | av超碰在线 | 欧美一级视频在线观看 | 日韩精品一区二区三区不卡 | 天天操天天干天天操天天干 | 日韩综合视频在线观看 | www.久久99| 日日操天天操狠狠操 | www九九热| 五月婷婷久久丁香 | 日本不卡一区二区三区在线观看 | 成人久久影院 | 狠狠干夜夜 | 亚洲三级在线播放 | 五月激情天| 天天操网 | 久久免费观看少妇a级毛片 久久久久成人免费 | 综合国产在线 | 日韩在线视频网 | 天天天天色综合 | 成人av电影网址 | 久久草草影视免费网 | 黄色片免费在线 | 久久艹欧美 | 亚洲精品国产精品国自 | 久久午夜影视 | 色com网 | 日本色小说视频 | 日韩中文字幕免费看 | 亚洲午夜久久久久久久久久久 | 色吊丝在线永久观看最新版本 | 精品嫩模福利一区二区蜜臀 | 久99久视频| 成人午夜精品久久久久久久3d | 草久草久 | 国产精品对白一区二区三区 | 在线观看一| 久久久91精品国产一区二区三区 | 亚洲激情视频 | 2019精品手机国产品在线 | 日韩在线免费视频 | 五月婷婷丁香 | 91天堂影院 | 人人插人人艹 | 中文字幕91在线 | 国产一区二区在线免费 | 国产97色在线 | 国产成人精品久久久久 | 久久精品123| 91在线影视 | 久久免费视频99 | 99久久99久久综合 | av中文字幕在线看 | 国产精品日韩精品 | 人人精久 | 91综合在线| 日韩中文字幕91 | 狠狠色2019综合网 | www.91国产 | 国产日产高清dvd碟片 | 日韩精品在线一区 | 亚洲精品在线观看av | 日本在线中文在线 | 色天堂在线视频 | 99国产精品 | 伊人狠狠 | 亚洲精选在线 | 超碰成人免费电影 | 精品中文字幕在线观看 | 色婷婷综合久久久 | 国产免费作爱视频 | 亚洲激情在线观看 | 蜜桃麻豆www久久囤产精品 | 免费成人黄色av | 日韩三级精品 | 亚洲在线看 | 91精彩视频| 激情视频一区二区 | 久久免费精品视频 | 狠狠干综合 | 国产免费观看久久黄 | 69国产在线观看 | 国产高清网站 | 激情五月开心 | 999成人国产 | 久久精品视频在线观看 | 精品视频在线播放 | 手机在线欧美 | 绯色av一区| 免费久久久久久 | 精品免费国产一区二区三区四区 | 婷婷伊人五月天 | 九九免费在线观看 | 伊人宗合| 午夜av片 | 黄色小视频在线观看免费 | 日韩欧美视频 | 久青草电影 | 日韩av一区二区三区在线观看 | 天天射天天干天天插 | 97超碰在线播放 | 天天干,天天操 | 国产精品久久久久久久7电影 | 欧美与欧洲交xxxx免费观看 | 00av视频| 五月天开心 | 亚洲综合色播 | 婷婷综合伊人 | 久久爱综合 | 亚洲成年人在线播放 | 免费a v观看 | 欧美 高跟鞋交 xxxxhd | 精品极品在线 | 香蕉日日 | 日本精品xxxx | 综合婷婷久久 | 国产专区精品 | 久久精品久久久精品美女 | www婷婷 | 美女网站在线 | 97在线视频免费观看 | 午夜性色| 中文字幕在线日亚洲9 | 成人在线视频论坛 | 欧美国产日韩在线观看 | 超碰999| 国产成人一区二区三区影院在线 | 久久久久97国产 | 日韩高清dvd | 国产精彩视频一区二区 | 狠狠的操| 密桃av在线| 中文字幕人成一区 | 国产精品黄网站在线观看 | 狠狠色丁香久久婷婷综合丁香 | 国产一级在线免费观看 | 日日干天天干 | 日日操日日 | 天天操天天操天天操天天操 | 精品久久久久国产 | 91在线一区二区 | 色综合婷婷久久 | 久久精品—区二区三区 | 美女久久久久久 | 国产在线不卡精品 | 久久国产精品99国产 | 国产一区二区三区免费观看视频 | 九九九国产 | 免费色视频网址 | 欧美日韩视频在线播放 | 国产精品视频 | a在线视频v视频 | 成人 亚洲 欧美 | 国产精品99久久99久久久二8 | 国产成人精品一区二区三区福利 | 成人免费网站视频 | 日韩特级黄色片 | 日韩经典一区二区三区 | 中日韩在线视频 | 国产色在线观看 | 久久a热6 | 日韩视频一 | 亚洲精品视频久久 | 国产一区二区在线播放视频 | 久久好看免费视频 | 免费a级大片 | 色综合久久久久久久 | 九九九九九国产 | 少妇精品久久久一区二区免费 | 国产资源精品在线观看 | 色噜噜日韩精品欧美一区二区 | 麻豆视频免费看 | 九九九在线观看 | 天天做日日爱夜夜爽 | www.综合网.com| 最近高清中文字幕在线国语5 | 婷婷丁香视频 | 久久视频在线观看免费 | 欧美高清视频不卡网 | 伊人色综合久久天天网 | 成人免费视频视频在线观看 免费 | 国产区 在线 | 亚洲va在线va天堂 | 久操视频在线 | 综合精品久久 | 欧美一区二区三区激情视频 | 日韩精品首页 | 国产精品观看在线亚洲人成网 | 久久久久久久久久免费 | 日韩欧美精品在线 | 亚洲涩综合 | 国产中文字幕一区 | 久草视频在线资源站 | 国产中出在线观看 | 欧美在线aa| 91在线看黄 | 日韩免费观看高清 | 免费观看成人网 | 成人黄色电影在线播放 | 射久久| 免费观看性生交大片3 | 国产免费观看久久黄 | 国产精品1区2区在线观看 | 91污在线观看 | 成人福利在线观看 | 国产美女视频免费 | 免费精品久久久 | 久久久久二区 | 色综合色综合色综合 | 国产一区二区精品久久 | www.91av在线 | 色夜视频 | 欧美日韩伦理一区 | 亚洲在线精品视频 | 国产999| 欧美精品久久久久久久久久丰满 | 婷婷在线观看视频 | 操操操人人人 | 欧美日韩免费观看一区二区三区 | 国产精品视频地址 | av九九| 18网站在线观看 | 国产精品久久久久久久妇 | 五月天婷亚洲天综合网鲁鲁鲁 | 缴情综合网五月天 | 韩日精品在线 | 日韩欧美精品在线观看视频 | 美女久久99| 久久午夜视频 | 国产精品久久久久高潮 | 日韩一二三在线 | 天天拍天天操 | 久久综合久久伊人 | 91在线中文 | 激情欧美日韩一区二区 | av天天草| 国产只有精品 | 国产一级电影 | 91av超碰| 国产精美视频 | 成人a免费看 | 欧美日在线 | 五月激情婷婷丁香 | 在线国产不卡 | 少妇bbbb| 国产午夜三级 | 婷婷色中文 | 日本性xxx | 国产123区在线观看 国产精品麻豆91 | 成人av影视观看 | 亚洲久草网 | 开心激情久久 | 一级α片免费看 | 国产视频日韩视频欧美视频 | 久久免费精品国产 | 在线视频一二三 | 日韩草比 | 在线之家免费在线观看电影 | 久久人人爽人人片 | 亚洲精品视频在线观看免费视频 | 日韩最新在线视频 | 在线视频欧美精品 | 少妇精品久久久一区二区免费 | 亚洲高清网站 | 嫩模bbw搡bbbb搡bbbb | 国产最新网站 | 亚洲视频 在线观看 | 不卡中文字幕在线 | 欧美精品免费视频 | 岛国大片免费视频 | 久久99精品国产麻豆婷婷 | 中文在线资源 | 国产色爽| 国产精品麻豆免费版 | 久久国产一区二区三区 | 欧美精品小视频 | 免费在线国产黄色 | 亚州精品在线视频 | 国产视频一区在线免费观看 | 久久久久欠精品国产毛片国产毛生 | 337p日本欧洲亚洲大胆裸体艺术 | 久久久国产一区 | 亚洲日本欧美 | 在线观看一 | 天天干,夜夜操 | 久久婷婷综合激情 | 亚洲电影久久久 | 天天天色综合a | 亚洲国产人午在线一二区 | 九九热免费在线视频 | 精品电影一区二区 | 成人av一二三区 | 精品成人国产 | 99精品国产免费久久久久久下载 | 999在线精品 | 99草视频| 天天干天天看 | 曰韩精品 | 天天天色综合a | 探花视频网站 | 日韩av免费一区 | 日韩精品一区二区在线观看视频 | 成人午夜黄色影院 | 国产精品99久久久久的智能播放 | 欧美国产在线看 | 免费看的视频 | 久久电影日韩 | 免费精品视频在线 | 国产日韩欧美在线影视 | 免费在线激情电影 | 国产亚洲视频在线 | 安徽妇搡bbbb搡bbbb | 伊人六月 | 久久9999久久免费精品国产 | 国产又粗又硬又爽视频 | 亚洲免费观看视频 | 99精品国产成人一区二区 | 免费福利在线 | 久久99操| 91精品国产福利在线观看 | 亚洲国产精品久久久久久 | 色综合久久精品 | 亚洲另类在线视频 | 国内精品免费 | 中国黄色一级大片 | 亚色视频在线观看 | 激情视频网页 | 四虎国产免费 | 日韩精品一区二区免费 | 久久综合久久久 | 日韩剧情 | 视频一区二区三区视频 | 久久在视频 | 欧美a在线看 | 色婷五月 | 欧美性生活一级片 | 久久久久免费精品国产小说色大师 | 国产精品理论片在线观看 | 国产亚洲精品免费 | 色综合天天在线 | 91麻豆精品国产自产在线 | 欧美久久成人 | 91丨九色丨蝌蚪丨老版 | 亚洲精品国产综合99久久夜夜嗨 | 国产日韩欧美综合在线 | 国产精品1024 | 免费在线色电影 | 亚洲欧洲精品视频 | 欧美老女人xx | www.色国产| 精品欧美一区二区精品久久 | 久久国产精品久久精品国产演员表 | 国产日韩欧美在线观看视频 | 亚洲一区精品人人爽人人躁 | 精品国产亚洲日本 | 欧美黄色软件 | 狠狠操欧美 | 国产免费视频在线 | 亚洲综合视频在线 | 手机在线小视频 | 韩国视频一区二区三区 | 美国人与动物xxxx | 在线视频精品播放 | 亚洲每日更新 | 成人国产精品电影 | 日韩精品免费在线观看 | 午夜精品久久久久久久久久久久 | 欧美在线free | 中文字幕在线日亚洲9 | 夜夜婷婷 | 国产一级在线免费观看 | 午夜久久久久久久 | 三三级黄色片之日韩 | 精品久操 | 亚洲欧洲国产日韩精品 | 国产精品男女啪啪 | 91最新在线 | 日韩不卡高清视频 | 精品国产一二三 | 欧美性成人 | 99久久精品免费看国产免费软件 | 色综合久久悠悠 | 99这里只有久久精品视频 | 国产精品理论片在线播放 | 精品色999| 最近中文字幕高清字幕在线视频 | 日韩av不卡在线观看 | 97精品国产手机 | 免费在线播放av电影 | 99中文字幕在线观看 | 国产成人精品在线 | 久黄色| 啪啪动态视频 | 亚洲婷久久 | 五月天精品视频 | 丁香在线观看完整电影视频 | 免费99视频 | 99在线热播精品免费99热 | 国产流白浆高潮在线观看 | 欧美午夜性生活 | 久草网首页 | 美女黄频在线观看 | 正在播放 国产精品 | 亚洲一区网 | 黄污视频网站 | 99精品国产99久久久久久97 | 91传媒在线观看 | 久草久热 | 欧美日韩视频精品 | 亚洲精品高清在线观看 | 免费观看9x视频网站在线观看 | 天天干天天搞天天射 | 久久人人添人人爽添人人88v | 日日日操操 | 午夜视频二区 | 亚洲另类交 | 欧美在线91 | 欧美日韩中字 | 日韩免费高清 | 久久久伊人网 | 日韩av偷拍| 成人av一级片 | 久久精品123 | 亚洲干 | 99久久精品国产亚洲 | 丁香婷婷激情五月 | 久久久99精品免费观看 | 蜜臀一区二区三区精品免费视频 | 久久久亚洲影院 | 91精品国产网站 | 91精品免费 | 国产一区二区影院 | 九九热精品视频在线观看 | 99一区二区三区 | 久久久久欠精品国产毛片国产毛生 | 99久久久国产精品免费观看 | 三级a视频 | 国产一二三四在线观看视频 | 久日精品 | 狠色狠色综合久久 | 欧美一区二区三区四区夜夜大片 | 亚洲精品国产精品国自产 | 人人插人人干 | 天堂中文在线播放 | 五月天堂网 | 日韩精品字幕 | 欧美a级在线播放 | 国产护士av | 欧美成人基地 | 国产五月婷 | 免费看污污视频的网站 | 国产精品一区二区在线观看免费 | 91xav | 免费成人结看片 | 日韩欧美高清一区二区 | 日韩精品一区二区在线观看 | 久久五月网 | 亚洲综合色激情五月 | 欧美日韩精品久久久 | 欧美一区二区在线 | 亚洲精品午夜久久久久久久久久久 | 日韩在线播放av | 亚洲3级| 国产精品激情偷乱一区二区∴ | 九月婷婷色 | 中文字幕黄色av | www.日日操.com | 色视频在线免费观看 | 久久免费福利视频 | 国产99精品 | 特级a毛片| 精品视频区 | 日本精品视频一区 | 日本黄色大片免费看 | 91色亚洲 | 久久午夜精品 | 久久国产精品久久精品国产演员表 | 日韩在线观看免费 | 成人午夜电影久久影院 | 亚洲第一久久久 | 丁香影院在线 | 久久久久久久久久久成人 | 国产91精品看黄网站 | 在线色亚洲 | 久久精品国产亚洲 | 久久久久久久久久久成人 | 欧美日韩一区二区三区免费视频 | 久久久999精品视频 国产美女免费观看 | 在线免费高清视频 | 国产精品一区二 | 99精品欧美一区二区三区 | 久久99国产精品 | 久久精品一区二区三区视频 | 99热精品在线 | 久久免费片 | 国产麻豆精品在线观看 | av网站手机在线观看 | 久久人人爽人人爽人人片av软件 | 亚洲国产成人精品久久 | 中文在线免费一区三区 | 亚洲综合网 | www·22com天天操 | 亚洲精品国产综合久久 | 在线看片视频 | 国产精品av在线免费观看 | www.com久久| 911精品美国片911久久久 | 久久成电影 | 午夜精品久久久久久久99 | 伊人电影在线观看 | 国产精品免费久久久久 | 国产精品ⅴa有声小说 | 91精品国产欧美一区二区 | 色偷偷人人澡久久超碰69 | 亚洲欧美日韩国产一区二区 | 久久精品久久精品久久 | 久久草网站 | 中文字幕乱码一区二区 | 国产精品色 | 四虎在线免费观看 | 午夜精品视频福利 | 亚洲视频h | 四虎小视频 | 日本中文字幕观看 | 亚洲视频在线观看网站 | 91av综合 | 久久精品高清视频 | 99精品久久只有精品 | 69国产精品视频 | 97色综合| 狠狠色狠狠色终合网 | 国产做aⅴ在线视频播放 | 婷婷久久综合九色综合 | 国产成人精品午夜在线播放 | 国产69精品久久久久9999apgf | 黄色日视频| av中文字幕网 | 黄网站免费大全入口 | 国外调教视频网站 | 国产一区二区精品 | 婷婷免费在线视频 | 国产一二三精品 | 免费日韩高清 | 免费高清无人区完整版 | www免费| 亚洲乱亚洲乱亚洲 | 不卡的av片 | 国产高清成人 | 五月天婷亚洲天综合网精品偷 | 亚洲精品黄色片 | 日韩欧美国产激情在线播放 | 成年人在线免费看片 | 欧美精品免费视频 | 久久国产精品久久国产精品 | 国产一区二区视频在线播放 | 日韩mv欧美mv国产精品 | 日韩精品视频在线免费观看 | 国产原创中文在线 | 国产精品一区久久久久 | 中文在线免费观看 | 成人黄色电影在线观看 | 亚洲精品久久久久久久蜜桃 | 久久999精品| 亚洲精品黄色在线观看 | 久久草草影视免费网 | 久久久国产影院 | 黄色天堂在线观看 | 日韩av片免费在线观看 | 视频一区二区在线观看 | 国产精品久久久久影视 | 欧美日韩二三区 | 性日韩欧美在线视频 | 四虎在线免费观看 | 99精品久久久久久久久久综合 | 色黄视频免费观看 | 欧美夫妻性生活电影 | 97超碰在线久草超碰在线观看 | 成年人黄色免费看 | 国产成人精品一区二区三区免费 | 色综合久久久久网 | 亚洲,国产成人av | 久久乐九色婷婷综合色狠狠182 | 久草在线资源视频 | 国产精品中文字幕在线 | 国产亚洲在线视频 | 99电影 | 国产成人在线精品 | 夜色.com| 久久综合久久综合久久 | 最新国产在线视频 | 国产精品一区二区视频 | 亚洲成人av免费 | 91看毛片 | 国产精品午夜久久 | 欧美色综合久久 | 91人人爽人人爽人人精88v | 五月综合激情 | 992tv成人免费看片 | 99热这里是精品 | 日日草视频 | 好看的国产精品视频 | 精品一区二区在线看 | 免费看的黄色网 | 四虎影视成人永久免费观看视频 | 人人爽久久久噜噜噜电影 | 射射射综合网 | 色天天久久 | 人人澡超碰碰 | 操处女逼 | 黄色特级片 | 最新中文在线视频 | 开心激情五月婷婷 | 国产午夜视频在线观看 | 超碰人人草人人 | 久久精品屋 | 欧美不卡视频在线 | 黄免费在线观看 | 久久在线影院 | 一区二区三区中文字幕在线观看 | 国产免费大片 | 午夜久久美女 | 久久精品永久免费 | 国产精品久久久久久久久久尿 | 亚洲精品18日本一区app | 久久久精品国产一区二区三区 | av在线短片 | 国产成人精品一区二区三区在线 | 亚洲精品乱码久久久久久蜜桃动漫 | 色哟哟国产精品 | 亚洲精品动漫久久久久 | 看片黄网站 | 亚洲午夜久久久久久久久久久 | 国产96精品 | 久久久久久久精 | 91麻豆视频网站 | 国产一区二区在线精品 | 最近中文字幕完整高清 | 女人18片| 在线天堂中文在线资源网 | 午夜三级在线 | 国产精品一级视频 | 天天操比 | 日韩电影在线观看一区 | 日韩成人看片 | 狠狠操91| 日韩欧美精品一区 | 人人dvd| 亚洲美女久久 | 国产视频每日更新 | 97在线观看免费观看 | 热久久最新地址 | www亚洲一区 | 波多野结衣一区二区三区中文字幕 | 五月天色网站 | 国产一区二区三区高清播放 | av日韩国产 | 国产不卡在线观看视频 | 久久久久亚洲最大xxxx | 国产精品久久久久久久99 | 美女视频黄是免费的 | 日韩精品一区电影 | 在线观看成人毛片 | 天天干视频在线 | 成人午夜精品久久久久久久3d | 亚洲精品视频中文字幕 | 久久免费久久 | 国产在线91精品 | 中文字幕欧美日韩va免费视频 | 日韩精品五月天 | 亚洲综合色激情五月 | 亚洲成av人影片在线观看 | 色妞久久福利网 | 99久久99久久精品国产片果冰 | 色综合久久综合中文综合网 | 亚洲人成在 | 中文字幕亚洲欧美日韩 | 国产成人精品一区在线 | 久久精品一二三区白丝高潮 | 91最新国产 | 91精品国产一区 | 国产精品久久久视频 | 96精品视频 | 欧美日韩中文另类 | 日韩va亚洲va欧美va久久 | 午夜视频一区二区 | 国产 字幕 制服 中文 在线 | 久久在线视频在线 | 中文字幕国语官网在线视频 | 一区二区影视 | 久久91久久久久麻豆精品 | 超碰999| 婷婷久久久久 | 在线观看日本韩国电影 | 久久久亚洲国产精品麻豆综合天堂 | 亚洲国产福利视频 | 亚洲丁香日韩 | 精品久久国产精品 | 激情偷乱人伦小说视频在线观看 | 国产精品久久久久久久免费大片 | 狠狠狠狠狠狠狠狠 | 亚洲精品视频大全 | 国产美女精品视频 | 国产精品99久久久久久大便 | 色av男人的天堂免费在线 | 久久精品成人欧美大片古装 | 国产精品岛国久久久久久久久红粉 | 一级性视频 | 午夜久久福利视频 | 91cn国产在线 | 888av | 草莓视频在线观看免费观看 | 91成人在线观看喷潮 | 亚州精品成人 | 中文字幕在线一区观看 | 国产香蕉视频在线观看 | 亚洲精品视频在线看 | 免费精品在线观看 | 日韩中文字幕免费在线观看 | 亚洲精品1区2区3区 超碰成人网 | 久草电影免费在线观看 | 在线成人观看 | 97电院网手机版 | 久久久免费毛片 | 日韩av播放在线 | 97超碰人人网 | 国产一区二区不卡视频 | 91污在线 | 国产精品久久久久av福利动漫 | 欧美日韩三级 | 亚洲天堂社区 | 国产区av在线 | 中文字幕在线观看的网站 | 免费在线黄 | 色综合久久88色综合天天6 | 中文字幕麻豆 | 中文字幕精品一区 | 精品国产伦一区二区三区观看体验 | 中文字幕人成一区 | 97香蕉超级碰碰久久免费软件 | 久久久伊人网 | 在线va视频| 91精品国产91久久久久久三级 | 色美女在线 | 中文字幕在线观看第三页 | 精品久久久久久亚洲综合网站 | 国产成人亚洲精品自产在线 | 黄色大片日本 | 美女网站在线免费观看 | 香蕉视频91| 国产丝袜美腿在线 | 成人精品一区二区三区中文字幕 | 国产一在线精品一区在线观看 | 欧美一级在线看 | 国产亚洲aⅴaaaaaa毛片 | 久久国内精品99久久6app | 激情视频综合网 | 国产精品第72页 | 五月综合激情婷婷 | 最新三级在线 | 国产一级二级三级在线观看 | 天天综合成人 | 美国三级黄色大片 | 伊人久久婷婷 | 欧美精品亚洲精品 | 久草免费在线视频 | 天天伊人狠狠 | 色综合天天色 | 二区三区毛片 | 午夜视频在线观看一区二区 | 成人一级免费电影 | 欧美日韩国产精品一区二区三区 | 午夜影院三级 | 婷婷丁香色 | 亚洲国产福利视频 | 日韩婷婷 | 久久福利综合 | 国产视频一二区 | 一区二区视频在线免费观看 | 去干成人网 | 久草青青在线观看 | 丁香九月激情综合 | 天天插狠狠插 | 亚洲一级黄色av | 日本乱码在线 | 2019天天干夜夜操 | 99精品热| 国产精品久久久久久久久免费看 | 国产精品久久久久一区二区三区 | 中文字幕成人一区 | 麻豆成人在线观看 | 9在线观看免费高清完整 | 亚洲电影在线看 | 丁香五月亚洲综合在线 | 99久热 | 91桃色在线观看视频 | 国产自在线观看 | 最近中文字幕完整高清 | 色偷偷av男人天堂 | www五月天| 久久久99精品免费观看乱色 | 人人精久 | 免费福利视频导航 | 狠狠色丁香久久综合网 | 国产午夜三级一区二区三桃花影视 | 一区二区三区在线观看中文字幕 | 91在线播 | 日本久久久亚洲精品 | 波多野结衣在线视频免费观看 | 日本中文字幕在线视频 | 色99久久 | 狠狠操天天干 | 免费在线观看日韩 | 国产青青青 | 日韩av免费一区二区 | 97综合网 | 久久日本视频 | 日韩免费成人 | 综合久久久久久久久 | 最新日韩在线 | 久久人人干 | 国产在线高清视频 | 麻豆91视频 | 一区二区三区免费看 | 成人av av在线 | 国产成人久久久77777 | 奇米影视四色8888 | 国产成人av综合色 | 欧美在线视频精品 | 国产在线小视频 | 国产精品第7页 | 精品国精品自拍自在线 | 亚洲成aⅴ人片久久青草影院 | 91丨九色丨蝌蚪丰满 | 亚洲精品午夜久久久久久久久久久 | 久久久精品福利视频 | 日本午夜在线亚洲.国产 | 久久艹中文字幕 | 国产99久久久国产精品免费看 | 午夜精品久久久久久久久久久久 | av电影在线免费观看 | 亚洲国产成人精品在线 | 综合色综合色 | 欧美大片mv免费 | 国产99久久久久久免费看 | 成人在线视频观看 | 97色狠狠| 国产精品高 | 免费看的黄色录像 | 五月婷婷在线观看视频 | 精品国产欧美一区二区三区不卡 | 日韩视频www| 丁香视频免费观看 | 亚洲精品久久久久久久蜜桃 | 亚洲精品1区2区3区 超碰成人网 | 中文字幕免费观看全部电影 | 日日日视频 | 99综合影院在线 | 日韩欧美视频免费在线观看 | 丁香伊人网 | 成人午夜电影久久影院 | 精品a在线 | 肉色欧美久久久久久久免费看 | 怡红院久久 | 黄色亚洲片 | 精品久久免费看 | 国产精品爽爽爽 | 91传媒视频在线观看 | 激情五月视频 | 成人小视频在线观看免费 | 在线观看91av| 99热这里| 亚洲精品女 | 亚洲专区在线视频 | 亚洲色视频 | 国产黄色美女 | 日韩精品免费一区二区在线观看 | 国产字幕在线看 | 精品1区2区3区 | 热久久99这里有精品 | 四虎在线免费观看视频 | 99精品国产成人一区二区 | 午夜视频在线观看一区二区三区 | 久久一级电影 | 97免费视频在线 | 国产免费黄视频在线观看 | 中文字幕资源网在线观看 | 青青色影院| 日韩电影在线观看一区二区三区 | 日本一区二区不卡高清 | 免费成人av| 日韩精品一区二区在线观看 | av电影免费 | 国产伦理精品一区二区 | 婷婷网址 | 日韩大片在线免费观看 | 久久精品欧美一区二区三区麻豆 | 亚洲专区中文字幕 | 91av资源在线 | 国产大尺度视频 | 亚洲免费av片 | 天天做日日做天天爽视频免费 | japanesexxx乱女另类 | 免费在线观看av不卡 | 国产精品丝袜在线 | 免费日韩 | 国产在线不卡 | 国产亚洲一区二区三区 | 2024av| 菠萝菠萝在线精品视频 | 欧美国产高清 | 国产日韩视频在线观看 | 久久久久国产精品免费免费搜索 | 日韩欧美99 | 亚洲综合在线观看视频 | 国产在线欧美日韩 | 国产黄在线看 | 香蕉久草 | 五月婷婷丁香六月 | 亚洲最新合集 | 天天性天天草 | 特级黄录像视频 | 黄色91在线| 国产精品小视频网站 | 日韩成人在线免费观看 | 在线观看视频你懂的 | av片在线看 | 丁香婷婷综合激情五月色 | 三级黄在线 | 国产精品日韩高清 | 一区二区三区在线电影 | 天天伊人狠狠 | 韩国精品在线观看 |