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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基于采样的方法(一) RRT

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于采样的方法(一) RRT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

專欄首頁:寫在前面的話


文章目錄

  • 簡介
  • 偽代碼分析
  • 功能實現
    • 地圖
    • RRT基礎表示
    • 采樣隨機點
    • Near()
    • Steer()
    • CollisionFree()
  • 工程構建
    • 算法啟動文件 rrt_group_search.cpp :
    • RRT基類 RRTGroupSearch.hpp
    • 算法實現文件 RRTSearch.hpp
    • launch文件
  • 參考


簡介

基本的簡介這里就不做說明了,如果不了解的同學推薦查看文章后面的鏈接。

簡單而言,基于快速擴展隨機樹(RRT / rapidly exploring random tree)的路徑規劃算法,是一種基于采樣的路徑規劃算法,常用于移動機器人路徑規劃,適合解決高維空間和復雜約束下的路徑規劃問題。

偽代碼分析

其偽代碼如下:

分析偽代碼可知,rrt算法的主要步驟包括

  • Sample rand point(在地圖上隨機采樣一個點 prandp_{rand}prand?,如下圖a );
  • Near(計算rrt_tree上離隨機點最近的點 pnearestp_{nearest}pnearest?, 如下圖b);
  • Steer(以 pnearestp_{nearest}pnearest?為起點,以 pnearestp_{nearest}pnearest?->prandp_{rand}prand?射線為方向,前進StepSize的距離,如下圖c);
  • CollisionFree(檢查步驟3中生成路徑的碰撞狀態)
    • 該代碼還有一個簡單的改進

    例如在 Sample rand point 步驟中可以加入概率P, 由概率P決定是隨機點PrandP_{rand}Prand?是在地圖上隨機采樣還是目標點PgoalP_{goal}Pgoal?

    功能實現

    這里我們只進行基礎rrt的實現

    地圖

    進行路徑規劃首先要建立地圖,導航地圖有很多種,常見的有二維珊格地圖、三維八叉樹地圖、三維點云地圖等。這里我們使用了簡單的二維珊格地圖(即ros中的nav_msgs::OccupancyGrid),同時我們假設忽略機器人的尺寸,即認為該二維珊格地圖表征的是機器人的C-Space(何為C-space?)

    這里我們直接貼上地圖生成的代碼

    2d_map_creater.cpp

    二維地圖生成,該程序發布一個名為 “/gridMap” 的二維珊格地圖(分辨率0.05, 長寬為10), 可以通過參數 obstacle_num 和 obstacle_len 來修改地圖中障礙物的數量與長度

    #include "ros/ros.h" #include "nav_msgs/OccupancyGrid.h" #include <iostream>using namespace std;int main(int argc, char * argv[]) {ros::init(argc, argv, "gridMap");ros::NodeHandle nh;ros::NodeHandle nh_private("~");ros::Publisher pub = nh_private.advertise<nav_msgs::OccupancyGrid>("/gridMap", 1);int obstacle_num, obstacle_len;nh_private.param<int>("obstacle_num", obstacle_num, 50);nh_private.param<int>("obstacle_len", obstacle_len, 30);nav_msgs::OccupancyGrid map;// 向Rviz發送的數據中一定要包含frame_idmap.header.frame_id="map";map.header.stamp = ros::Time::now(); map.info.resolution = 0.05; // float32// 柵格地圖分辨率對應柵格地圖中一小格的長和寬map.info.width = 10/map.info.resolution; // uint32map.info.height = 10/map.info.resolution; // uint32// 設置地圖起始坐標 默認為0map.info.origin.position.x = -(map.info.width*map.info.resolution)/2;map.info.origin.position.y = -(map.info.height*map.info.resolution)/2;int p[map.info.width*map.info.height] = {-1}; // [0,100] 只初始化了第一個元素p[21] = 100; //(1, 1) map坐標p[20] = 100; //(1, 0)p[30] = 100;p[31] = -1;p[32] = -1;// rid_map [y*map.info.width+x]生成隨機障礙for(int n=0; n<obstacle_num;n++){int y = obstacle_len + rand()%(map.info.height-obstacle_len*2+1);int x = obstacle_len + rand()%(map.info.width-obstacle_len*2+1);int xy = rand()%(2);if(xy == 0){for(int i=0; i<obstacle_len; i++){p[(y+i)*map.info.width+x] = 100;p[(y+i)*map.info.width+x+1] = 100;}}else{for(int i=0; i<obstacle_len; i++){p[y*map.info.width+x+i] = 100;p[(y+1)*map.info.width+x+i] = 100;}}}// p[int(floor((x-map.info.origin.position.x)/map.info.resolution) + floor((y-map.info.origin.position.y)/map.info.resolution))] = 100;std::vector<signed char> a(p, p+map.info.width*map.info.height);map.data = a;while (ros::ok()){pub.publish(map);cout << "origin: " << map.info.origin.position.x << " " << map.info.origin.position.y << endl;}// ros::shutdown();return 0; }

    RRT基礎表示

  • 使用 ros中的 geometry_msgs::Point 來表征點;

  • 使用C++ 中的 unordered_map 表征 RRT樹 (即RRT擴展出來的集合);

    RRT樹中儲存 子節點,父節點對, 方便后續的回溯;

    //為geometry_msgs::Point定義一個比較函數與相等函數 struct HashFunc {std::size_t operator()(const geometry_msgs::Point &p) const {using std::size_t;using std::hash;return ((hash<int>()(p.x)^ (hash<int>()(p.y) << 1)) >> 1)^ (hash<int>()(p.z) << 1);} };struct EqualKey {bool operator () (const geometry_msgs::Point &p1, const geometry_msgs::Point &p2) const{return p1.x == p2.x&& p1.y == p2.y&& p1.z == p2.z;} };// 子節點, 父節點 typedef unordered_map<geometry_msgs::Point, geometry_msgs::Point, HashFunc, EqualKey> PointPair;// 定義空rrt樹 PointPair rrt_tree_set_;
  • 使用 visualization_msgs::Marker 中的 POINTS 來可視化采樣出來的點;

    visualization_msgs::Marker points_; points_.header.frame_id = mapData_.header.frame_id; points_.header.stamp=ros::Time(0); points_.ns = "points"; points_.id = 0; points_.type=points_.POINTS; points_.action=points_.ADD; points_.pose.orientation.w = 1.0; points_.scale.x=mapData_.info.resolution; points_.scale.y=mapData_.info.resolution; points_.color.r = 0.0/255.0; points_.color.g = 0.0/255.0; points_.color.b = 255.0/255.0; points_.color.a=1.0; points_.lifetime = ros::Duration();
  • 使用visualization_msgs::Marker中的 LINE_LIST 來可視化rrt樹;

    visualization_msgs::Marker line_, final_line_; // 灰色線段表示rrt line_.header.frame_id=mapData_.header.frame_id; line_.header.stamp=ros::Time(0); line_.ns = "lines"; line_.id = 1; line_.type=line_.LINE_LIST; line_.action=line_.ADD; line_.pose.orientation.w = 1.0; line_.scale.x = 0.03; line_.scale.y= 0.03; line_.color.r =155.0/255.0; line_.color.g= 155.0/255.0; line_.color.b =155.0/255.0; line_.color.a = 1.0; line_.lifetime = ros::Duration();//紅色線段表示最終搜索出來的路徑 final_line_.header.frame_id=mapData_.header.frame_id; final_line_.header.stamp=ros::Time(0); final_line_.ns = "line_back"; final_line_.id = 1; final_line_.type=final_line_.LINE_LIST; final_line_.action=final_line_.ADD; final_line_.pose.orientation.w = 1.0; final_line_.scale.x = 0.04; final_line_.scale.y = 0.04; final_line_.color.r =255.0/255.0; final_line_.color.g= 0.0/255.0; final_line_.color.b =0.0/255.0; final_line_.color.a = 1.0; final_line_.lifetime = ros::Duration();
  • 采樣隨機點

    // 返回 min max之間的隨機數 double getRandData(int min,int max){double m1=(double)(rand()%101)/101; // 計算 0,1之間的隨機小數,得到的值域近似為(0,1)min++; //將 區間變為(min+1,max),double m2=(double)((rand()%(max-min+1))+min); //計算 min+1,max 之間的隨機整數,得到的值域為[min+1,max]m2=m2-1; //令值域為[min,max-1]return m1+m2; //返回值域為(min,max),為所求隨機浮點數 }

    Near()

    // 計算并返回rrt_tree上離隨機點最近的點 geometry_msgs::Point Near(PointPair tree, geometry_msgs::Point p){geometry_msgs::Point nearst_point;float temp;float min = 100000;for (auto pt : tree){temp = Norm(pt.first, p); //返回兩點之前的歐式距離if (temp < min){min = temp;nearst_point = pt.first;}}return nearst_point; }

    Steer()

    // 以nearest_point為起點,以nearest_point->rand_point射線為方向,前進eta的距離 geometry_msgs::Point Steer(geometry_msgs::Point nearest_point, geometry_msgs::Point rand_point, float eta){geometry_msgs::Point new_point;float dis = Norm(nearest_point, rand_point);if (dis <= eta){new_point = rand_point;}else{new_point.x = nearest_point.x + eta * (rand_point.x - nearest_point.x) / dis;new_point.y = nearest_point.y + eta * (rand_point.y - nearest_point.y) / dis; }return new_point; }

    根據相似三角形:

    etadis=pnew?pnearestprand?pnearest\frac{eta}{dis} = \frac{p_{new} - p_{nearest}}{p_{rand} - p_{nearest}} diseta?=prand??pnearest?pnew??pnearest??

    CollisionFree()

    關于碰撞檢測有兩種方法增量法(圖左)或者等分法(圖右)

    這里采用增量法, 每步的增量為地圖分辨率的一半,針對連線上采樣到的節點,檢查其在地圖上占據狀態

    // 占據狀態 1:占據 0:未占據 -1:未知 int CollisionFree(geometry_msgs::Point nearest_point, geometry_msgs::Point new_point, nav_msgs::OccupancyGrid map){std::vector<signed char> Data = map.data;float re = map.info.resolution;float Pstartx = map.info.origin.position.x;float Pstarty = map.info.origin.position.y;float width = map.info.width;float step_length = map.info.resolution * 0.5;// //ceil(x)返回的是大于x的最小整數int step_number = ceil(Norm(nearest_point, new_point)/step_length);geometry_msgs::Point step_point = nearest_point;int state, out;for (int i = 0; i < step_number; i++){step_point = Steer(step_point, new_point, step_length);// floor(x)返回的是小于或等于x的最大整數float index = floor((step_point.y - Pstarty)/re)*width + floor((step_point.x - Pstartx)/re);out = Data[int(index)];if (out == 100) // 被占據{state = 1;break;}if (out == -1) //未知{state = -1;break;}if (out == 0){state = 0;continue;}}return state;}

    工程構建

    前面講解了rrt算法的基礎函數實現,現在來看看如何在ros中構建工程,

    這里我們需要寫三個源文件和一個luanch文件

    算法啟動文件 rrt_group_search.cpp :

    負責選取rrt算法類型、 支持算法可視化(rviz)、與rviz交互,包括獲取地圖信息與起始點信息(使用的是rviz中的 /clicked_point);

    該程序有兩個線程:一個線程負責執行rrt搜索, 另一個線程負責實時可視化搜索結果

    這樣做有利于把冗雜的可視化代碼從算法的主體代碼中剝離出來

    /*************************************************************************** rrt_group_search.cpp* * @Author: bornchow* * @Description:* 本程序為rrt系列路徑搜索算法的啟動文件,提供以下功能:* 1. 選取rrt算法類型* 2. 支持算法可視化(rviz)* 3. 與rviz交互,包括獲取地圖信息與起始點信息* * ****************************************************/ #include "ros/ros.h" #include "nav_msgs/OccupancyGrid.h" #include "geometry_msgs/Point.h" #include "geometry_msgs/PointStamped.h" #include "visualization_msgs/Marker.h" #include <iostream> #include <vector> #include <thread> #include "RRTSearch.hpp"class RRTStart { private:ros::NodeHandle n;ros::NodeHandle n_;ros::Subscriber global_map_sub_;ros::Subscriber goal_sub_;ros::Publisher rrt_node_pub_;ros::Publisher rrt_tree_pub_;ros::Publisher rrt_final_tree_pub_;// ros parmint rrt_algorithm_;float eta_;int iter_step_;int iter_max_;float search_radius_;nav_msgs::OccupancyGrid mapData_;visualization_msgs::Marker points_goal_, points_, line_, final_line_;// rrt algorithmshared_ptr<RRTGroupSearch> rrt_group_search_;private:void mapCallBack(const nav_msgs::OccupancyGrid::ConstPtr& msg);void goalCallBack(const geometry_msgs::PointStamped::ConstPtr& msg);public:RRTStart(ros::NodeHandle nh, ros::NodeHandle nh_);void visRRTProcessThread();void run();~RRTStart(); };RRTStart::RRTStart(ros::NodeHandle nh, ros::NodeHandle nh_) : n(nh), n_(nh_) {//ros 參數nh_.param<int>("rrt_algorithm", rrt_algorithm_, 0); // 選擇rrt算法nh_.param<float>("eta", eta_, 0.3); //rrt每次擴展時,延伸的長度nh_.param<int>("iter_step", iter_step_, 3100); // 為了更好的顯示,每隔iter_step步,需要鍵入值以繼續// ros訂閱與發布global_map_sub_ = n.subscribe("/gridMap", 100, &RRTStart::mapCallBack, this);goal_sub_ = n.subscribe("/clicked_point", 100, &RRTStart::goalCallBack, this);rrt_node_pub_ = nh.advertise<visualization_msgs::Marker>("rrt_node", 10);rrt_tree_pub_ = nh.advertise<visualization_msgs::Marker>("rrt_tree", 10);rrt_final_tree_pub_ = nh.advertise<visualization_msgs::Marker>("rrt_final_tree", 100);// wait until map is received, when a map is received, mapData.header.seq will not be < 1 while (mapData_.header.seq<1 or mapData_.data.size()<1){ROS_INFO("waiting for map !");ros::spinOnce(); ros::Duration(0.1).sleep();}//定義可視化參數// 起始點可視化points_goal_.header.frame_id = mapData_.header.frame_id;points_goal_.header.stamp=ros::Time(0);points_goal_.ns = "points_goal";points_goal_.id = 0;points_goal_.type=points_goal_.POINTS;points_goal_.action=points_goal_.ADD;points_goal_.pose.orientation.w = 1.0;points_goal_.scale.x=mapData_.info.resolution; points_goal_.scale.y=mapData_.info.resolution;points_goal_.color.r = 0.0/255.0;points_goal_.color.g = 255.0/255.0;points_goal_.color.b = 255.0/255.0;points_goal_.color.a=1.0;points_goal_.lifetime = ros::Duration();points_.header.frame_id = mapData_.header.frame_id;points_.header.stamp=ros::Time(0);points_.ns = "points";points_.id = 0;points_.type=points_.POINTS;points_.action=points_.ADD;points_.pose.orientation.w = 1.0;points_.scale.x=mapData_.info.resolution; points_.scale.y=mapData_.info.resolution;points_.color.r = 0.0/255.0;points_.color.g = 0.0/255.0;points_.color.b = 255.0/255.0;points_.color.a=1.0;points_.lifetime = ros::Duration();line_.header.frame_id=mapData_.header.frame_id;line_.header.stamp=ros::Time(0);line_.ns = "lines";line_.id = 1;line_.type=line_.LINE_LIST;line_.action=line_.ADD;line_.pose.orientation.w = 1.0;line_.scale.x = 0.03;line_.scale.y= 0.03;line_.color.r =155.0/255.0;line_.color.g= 155.0/255.0;line_.color.b =155.0/255.0;line_.color.a = 1.0;line_.lifetime = ros::Duration();final_line_.header.frame_id=mapData_.header.frame_id;final_line_.header.stamp=ros::Time(0);final_line_.ns = "line_back";final_line_.id = 1;final_line_.type=final_line_.LINE_LIST;final_line_.action=final_line_.ADD;final_line_.pose.orientation.w = 1.0;final_line_.scale.x = 0.04;final_line_.scale.y = 0.04;final_line_.color.r =255.0/255.0;final_line_.color.g= 0.0/255.0;final_line_.color.b =0.0/255.0;final_line_.color.a = 1.0;final_line_.lifetime = ros::Duration();switch (rrt_algorithm_){case 0:{rrt_group_search_ = make_shared<RRTSearch>(eta_, iter_step_);break;}default:break;}}RRTStart::~RRTStart() { }void RRTStart::visRRTProcessThread(){ros::Rate rate(10); geometry_msgs::Point p_temp;std::map<int, std::queue<geometry_msgs::Point> > iter_vis_info;std::queue<geometry_msgs::Point> p_final_que;int count;while (ros::ok()){rrt_group_search_->getVisInfo(iter_vis_info, p_final_que, count);if (count == 0) //迭代未開始{continue;}else{for (auto it : iter_vis_info){points_.points.push_back(it.second.front());it.second.pop();rrt_node_pub_.publish(points_);while (!it.second.empty()){line_.points.push_back(it.second.front());it.second.pop();line_.points.push_back(it.second.front());it.second.pop();rrt_tree_pub_.publish(line_);}}if (rrt_group_search_->getSearchState()){// 發布最后的rrt if (!p_final_que.empty()){std::cout << "final line size: " << final_line_.points.size() << std::endl;final_line_.points.clear();std::cout << "final line size after: " << final_line_.points.size() << std::endl;rrt_final_tree_pub_.publish(final_line_);final_line_.header.frame_id=mapData_.header.frame_id;final_line_.header.stamp=ros::Time(0);final_line_.ns = "line_back";final_line_.id = count;final_line_.type=final_line_.LINE_LIST;final_line_.action=final_line_.ADD;final_line_.pose.orientation.w = 1.0;final_line_.scale.x = 0.04;final_line_.scale.y = 0.04;final_line_.color.r =255.0/255.0;final_line_.color.g= 0.0/255.0;final_line_.color.b =0.0/255.0;final_line_.color.a = 1.0;final_line_.lifetime = ros::Duration();std::cout << " --------- " << p_final_que.size() << std::endl;p_temp = p_final_que.front();p_final_que.pop();while (!p_final_que.empty()){final_line_.points.push_back(p_temp);p_temp = p_final_que.front();final_line_.points.push_back(p_temp);p_final_que.pop();rrt_final_tree_pub_.publish(final_line_);sleep(0.1);}std::cout << "final line size add: " << final_line_.points.size() << std::endl;}else{continue;}//break;}}rate.sleep();}}void RRTStart::run(){// 獲取起始點double last_command = ros::Time::now().toSec();while (points_goal_.points.size()<3){double now = ros::Time::now().toSec();if (points_goal_.points.size()<1 && now - last_command > 2){ROS_INFO("set {start point} in rviz");last_command = ros::Time::now().toSec();}else if (points_goal_.points.size()<2 && now - last_command > 2){ROS_INFO("set {goal point} in rviz");last_command = ros::Time::now().toSec();}else if (points_goal_.points.size()<3 && now - last_command > 2){ROS_INFO("clicked point to start!!!");last_command = ros::Time::now().toSec();}rrt_node_pub_.publish(points_goal_);ros::spinOnce();}//加載地圖rrt_group_search_->updateMap(mapData_);ROS_INFO("map info origin [%f, %f] -- size [%d, %d]", mapData_.info.origin.position.x, mapData_.info.origin.position.y, mapData_.info.width, mapData_.info.height);geometry_msgs::Point p_start, p_end;p_start.x = points_goal_.points[0].x; p_start.y = points_goal_.points[0].y;p_end.x = points_goal_.points[1].x; p_end.y = points_goal_.points[1].y;rrt_group_search_->search(p_start, p_end);}void RRTStart::mapCallBack(const nav_msgs::OccupancyGrid::ConstPtr& msg){mapData_ = *msg; }void RRTStart::goalCallBack(const geometry_msgs::PointStamped::ConstPtr& msg){points_goal_.points.push_back(msg->point); } class end; int main(int argc, char** argv){ros::init(argc, argv, "rrt_group_search");ros::NodeHandle nh;ros::NodeHandle nh_("~");ros::Rate rate(10);RRTStart rrt_start(nh, nh_);std::thread visRRTThread(&RRTStart::visRRTProcessThread, &rrt_start);rrt_start.run();visRRTThread.join();}

    RRT基類 RRTGroupSearch.hpp

    為啥要搞個RRT基類尼,直接寫個RRT類不就好了嗎?

    當然直接寫也可以,但是RRT系列中還有后面的RRT- Connect 、 RRT-Star等等,里面有很多功能都是重復的;前面提到的四個基礎的功能實現相差不大。所以為了方便,先寫個基類,把這些基礎的定義與公用的功能實現,然后具體的RRT算法都繼承于此。

    #pragma once #include "nav_msgs/OccupancyGrid.h" #include "geometry_msgs/Point.h" #include "geometry_msgs/PointStamped.h" #include "visualization_msgs/Marker.h" #include "ros/ros.h" #include <iostream> #include <vector> #include <unordered_map> #include <map> #include <queue>using namespace std;//為geometry_msgs::Point定義一個比較函數與相等函數 struct HashFunc {std::size_t operator()(const geometry_msgs::Point &p) const {using std::size_t;using std::hash;return ((hash<int>()(p.x)^ (hash<int>()(p.y) << 1)) >> 1)^ (hash<int>()(p.z) << 1);} };struct EqualKey {bool operator () (const geometry_msgs::Point &p1, const geometry_msgs::Point &p2) const{return p1.x == p2.x&& p1.y == p2.y&& p1.z == p2.z;} };struct NodeCost{geometry_msgs::Point this_node;geometry_msgs::Point father_node;float cost; };// 子節點, 父節點 typedef unordered_map<geometry_msgs::Point, geometry_msgs::Point, HashFunc, EqualKey> PointPair;// 基類定義class RRTGroupSearch { private:/* data */ public:RRTGroupSearch(/* args */);virtual void updateMap(nav_msgs::OccupancyGrid map_data){std::cout << " this is updateMap function in base " << std::endl;}virtual void search(geometry_msgs::Point p_start, geometry_msgs::Point p_end){std::cout << " this is search function in base " << std::endl;}virtual bool getSearchState(){;}virtual void getVisInfo(std::map<int, std::queue<geometry_msgs::Point> >& iter_vis_info,std::queue<geometry_msgs::Point> &p_final_q,int &iter){std::cout << " this is getVisInfo function in base " << std::endl;}~RRTGroupSearch();public:geometry_msgs::Point Steer(geometry_msgs::Point nearest_point, geometry_msgs::Point rand_point, float eta);geometry_msgs::Point Near(PointPair tree, geometry_msgs::Point p);float Norm(geometry_msgs::Point p1, geometry_msgs::Point p2);double getRandData(int min,int max);bool nearGoal(geometry_msgs::Point new_point, geometry_msgs::Point end_point);int CollisionFree(geometry_msgs::Point nearest_point, geometry_msgs::Point new_point, nav_msgs::OccupancyGrid map);};RRTGroupSearch::RRTGroupSearch(/* args */) {std::cout << "this is rrt group method " << std::endl; }RRTGroupSearch::~RRTGroupSearch() { }// 返回 min max之間的隨機數 double RRTGroupSearch::getRandData(int min,int max){double m1=(double)(rand()%101)/101; // 計算 0,1之間的隨機小數,得到的值域近似為(0,1)min++; //將 區間變為(min+1,max),double m2=(double)((rand()%(max-min+1))+min); //計算 min+1,max 之間的隨機整數,得到的值域為[min+1,max]m2=m2-1; //令值域為[min,max-1]return m1+m2; //返回值域為(min,max),為所求隨機浮點數 }// 計算rrt_tree上離隨機點最近的點 geometry_msgs::Point RRTGroupSearch::Near(PointPair tree, geometry_msgs::Point p){geometry_msgs::Point nearst_point;float temp;float min = 100000;for (auto pt : tree){temp = Norm(pt.first, p);if (temp < min){min = temp;nearst_point = pt.first;}}return nearst_point; }// 返回兩點的歐式距離 float RRTGroupSearch::Norm(geometry_msgs::Point p1, geometry_msgs::Point p2){return pow( pow(p1.x-p2.x, 2) + pow(p1.y-p2.y,2), 0.5); }// 以nearest_point為起點,以nearest_point->rand_point射線為方向,前進eta的距離 geometry_msgs::Point RRTGroupSearch::Steer(geometry_msgs::Point nearest_point, geometry_msgs::Point rand_point, float eta){geometry_msgs::Point new_point;float dis = Norm(nearest_point, rand_point);if (dis <= eta){new_point = rand_point;}else{new_point.x = nearest_point.x + eta * (rand_point.x - nearest_point.x) / dis;new_point.y = nearest_point.y + eta * (rand_point.y - nearest_point.y) / dis; }return new_point; }bool RRTGroupSearch::nearGoal(geometry_msgs::Point new_point, geometry_msgs::Point end_point){if(Norm(new_point, end_point) < 0.5){return true;}else{return false;} }// 占據狀態 1:占據 0:未占據 -1:未知 int RRTGroupSearch::CollisionFree(geometry_msgs::Point nearest_point, geometry_msgs::Point new_point, nav_msgs::OccupancyGrid map){std::vector<signed char> Data = map.data;float re = map.info.resolution;float Pstartx = map.info.origin.position.x;float Pstarty = map.info.origin.position.y;float width = map.info.width;float step_length = map.info.resolution * 0.5;// //ceil(x)返回的是大于x的最小整數int step_number = ceil(Norm(nearest_point, new_point)/step_length);geometry_msgs::Point step_point = nearest_point;int state, out;for (int i = 0; i < step_number; i++){step_point = Steer(step_point, new_point, step_length);// floor(x)返回的是小于或等于x的最大整數float index = floor((step_point.y - Pstarty)/re)*width + floor((step_point.x - Pstartx)/re);out = Data[int(index)];if (out == 100) // 被占據{state = 1;break;}if (out == -1) //未知{state = -1;break;}if (out == 0){state = 0;continue;}}return state;}

    算法實現文件 RRTSearch.hpp

    好了,千呼萬喚始出來,終于寫主體文件了。由于前面已經把基礎的功能函數都在基類中實現了一遍,

    所以主體文件只需要實現算法的流程search()函數,然后把需要可視化的東西反饋給啟動文件就可以了getVisInfo()函數。

    /*************************************************************************** RRTSearch.hpp* * @Author: bornchow* * @Description:* 本程序為rrt系列路徑搜索算法中原始rrt的實現* 1. 實現原始選取rrt算法* 2. 將需要顯示的信息反饋* * ****************************************************/ #include "RRTGroupSearch.hpp" #include "tic_toc.h" #include <mutex>// class RRTSearchclass RRTSearch : public RRTGroupSearch { private:PointPair rrt_tree_set_; nav_msgs::OccupancyGrid map_;bool map_updated_;bool search_finished_;int iter_; // 計數迭代次數geometry_msgs::Point p_new_, p_rand_, p_nearest_;geometry_msgs::Point p_start_, p_end_;std::map<int, std::queue<geometry_msgs::Point> > iter_vis_set_;std::queue<geometry_msgs::Point> p_final_que_;std::mutex vis_mut_;// 參數float eta_;int iter_step_;public:RRTSearch(float eta, int iter_step); virtual void updateMap(nav_msgs::OccupancyGrid map_data);virtual void search(geometry_msgs::Point p_start, geometry_msgs::Point p_end);virtual bool getSearchState();virtual void getVisInfo(std::map<int, std::queue<geometry_msgs::Point> >& iter_vis_info,std::queue<geometry_msgs::Point> &p_final_q,int &iter);~RRTSearch(); };//****************************************************** // 【輸入】 - eta : 每隔迭代中rrt樹擴展的距離 // 【輸入】 - iter_step : 每隔多少步,需要鍵入以繼續 RRTSearch::RRTSearch(float eta, int iter_step) : eta_(eta), iter_step_(iter_step) {iter_ = 0;map_updated_ = false;search_finished_ = false;ROS_INFO("\033[1;32m----> this is a [2D] [rrt] search method!! .\033[0m"); }RRTSearch::~RRTSearch() { }void RRTSearch::updateMap(nav_msgs::OccupancyGrid map_data){map_ = map_data;map_updated_ = true; }void RRTSearch::search(geometry_msgs::Point p_start, geometry_msgs::Point p_end){int a, checking;p_start_ = p_start;p_end_ = p_end;rrt_tree_set_.insert(make_pair(p_start_,p_start_));std::queue<geometry_msgs::Point> vis_point_que;// std::cout << " ------ " << std::endl;// for(auto &p : rrt_tree_set_){// std::cout << "{--- " << p.first << " : " << p.second << "---} " << std::endl;// }// std::cout << " ------ " << std::endl;while (!search_finished_){if (iter_ != 0) // 每次迭代結束處理{vis_mut_.lock();iter_vis_set_.insert(make_pair(iter_, vis_point_que));vis_mut_.unlock();}iter_++;while (!vis_point_que.empty()){vis_point_que.pop();}TicToc search_time;if (!map_updated_){ROS_INFO("no map info !! use updateMap function first");break;}if(iter_ % iter_step_ == 0){std::cout << "input any to go on!!" << std::endl;a = cin.get();}// step 1: 隨機采樣一個點p_rand_.x = getRandData(map_.info.origin.position.x, map_.info.origin.position.x + map_.info.width*map_.info.resolution);p_rand_.y = getRandData(map_.info.origin.position.y, map_.info.origin.position.y + map_.info.height*map_.info.resolution);vis_point_que.push(p_rand_); // 儲存p_rand用于顯示ROS_INFO("rand sample a point [ %d ] -- (x %f , y %f)", iter_, p_rand_.x, p_rand_.y);// setp 2: 計算rrt_tree上離隨機點(p_rand_)最近的點p_nearest_p_nearest_ = Near(rrt_tree_set_, p_rand_);ROS_INFO("nearest point [ %d ]-- (x %f , y %f)", iter_, p_nearest_.x, p_nearest_.y);// step 3: 沿著p_nearest_ --> p_rand_方向, 以eta為步長,生成新的樹節點 p_new_p_new_ = Steer(p_nearest_, p_rand_, eta_);ROS_INFO("new point [ %d ]-- (x %f , y %f)", iter_, p_new_.x, p_new_.y);// step 4: 碰撞檢測 1:占據 0:未占據 -1:未知checking = CollisionFree(p_nearest_, p_new_, map_);ROS_INFO("the CollisionFree is : %d", checking);if (checking == 1){ROS_INFO("collision");continue;}if (checking == -1){ROS_INFO("get a unknown area!");continue;}if (checking == 0){ROS_INFO("get a new point!");//將p_new_加入rrt treerrt_tree_set_.insert(make_pair(p_new_, p_nearest_));// 將 p_new_, p_nearest_ 儲存用于顯示vis_point_que.push(p_new_);vis_point_que.push(p_nearest_);//判斷p_new_是否與終點接近if (nearGoal(p_new_, p_end_)){//將p_end_加入rrt treerrt_tree_set_.insert(make_pair(p_end_, p_new_));ROS_INFO("you have got the goal!----");// 回溯一條rrt路徑vis_mut_.lock();p_final_que_.push(p_end_);while (Norm(p_start_, p_final_que_.back()) > 0.05){auto find_it = rrt_tree_set_.find(p_final_que_.back());if ( find_it != rrt_tree_set_.end()){p_final_que_.push(find_it->second);}else{ROS_INFO("point not in rrt_tree");break;}std::cout << " dis form start: " << Norm(p_start_, p_final_que_.back()) << std::endl;}if (Norm(p_start_, p_final_que_.back()) < 0.05){ROS_INFO("back tree sucess!");}vis_mut_.unlock();search_finished_ = true;ROS_INFO("Time : %f", search_time.toc());}}}}//**************************************** // 【返回】 std::map<int, std::queue<geometry_msgs::Point> >& iter_vis_info // iter_vis_info.first 為 算法迭代次數 // iter_vis_info.second 為 需要顯示的點, 存儲順序為 p_rand, p_new, p_nearest, p_new_2, p_nearest_2, ... // 【返回】std::queue<geometry_msgs::Point> &p_final_q 最終的路徑 void RRTSearch::getVisInfo(std::map<int, std::queue<geometry_msgs::Point> >& iter_vis_info,std::queue<geometry_msgs::Point> &p_final_q,int &iter){vis_mut_.lock();if (!iter_vis_set_.empty()){copy(iter_vis_set_.begin(), iter_vis_set_.end(), inserter(iter_vis_info, iter_vis_info.begin()));iter_vis_set_.clear();}if (search_finished_){while (!p_final_que_.empty()){p_final_q.push(p_final_que_.front());p_final_que_.pop();}}vis_mut_.unlock();iter = iter_; }bool RRTSearch::getSearchState(){return search_finished_; }

    launch文件

    這里的navi_algorithm 是我的ROS工作空間

    <launch><!-- 啟動二維地圖 --><node pkg="navi_algorithm" type="2d_map_creater" name="map_creater_node" ><param name="obstacle_num" value="60" /><param name="obstacle_len" value="20" /></node><!--rrt 算法--><!-- 0- rrt --><node pkg="navi_algorithm" type="rrt_group_search" name="rrt_search" output="screen"><param name="rrt_algorithm" value="0" /> <!--選擇rrt算法--><param name="eta" value="0.3" /> <!--rrt每次擴展時,延伸的長度 --><param name="iter_step" value="3100" /> <!-- 為了更好的顯示,每隔iter_step步,需要鍵入值以繼續 --></node><!-- RViz --><node pkg="rviz" type="rviz" name="$(anon rviz)" respawn="false" output="screen" args="-d $(find navi_algorithm)/rviz/2d_map.rviz"/></launch>

    最后貼一張結果:

    參考

    RRT路徑規劃算法

    【機器人路徑規劃】快速擴展隨機樹(RRT)算法

    RRT算法__yuan_的博客-CSDN博客_rrt算法

    RRT路徑規劃算法_unique_jie的博客-CSDN博客_rrt路徑規劃算法

    有哪些應用于移動機器人路徑規劃的算法?

    總結

    以上是生活随笔為你收集整理的基于采样的方法(一) RRT的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲九九| 亚洲乱码精品久久久久 | 亚洲精品久久久久999中文字幕 | 亚洲高清色综合 | 成年人免费电影在线观看 | 天天摸天天操天天爽 | 色在线网站 | 麻花豆传媒mv在线观看网站 | 欧美嫩草影院 | 国产在线理论片 | 美女久久一区 | 黄色小说在线免费观看 | 免费看国产精品 | 在线视频精品 | 天天躁天天狠天天透 | 韩国一区二区三区在线观看 | 婷婷四房综合激情五月 | 美女激情影院 | 国产黄色特级片 | 天堂av在线免费观看 | 久久激五月天综合精品 | 在线观看免费版高清版 | 日韩视频一区二区 | 欧美极度另类性三渗透 | 夜夜操网 | 99视频一区 | 五月天堂网 | 精品国产一区二区三区久久久蜜月 | 五月天丁香 | 中文字幕亚洲精品在线观看 | 精品视频999 | 岛国av在线免费 | 国产精品v欧美精品 | av综合站| 国产视频久 | 99久久久国产精品 | 日韩视频在线播放 | 欧美午夜视频在线 | 国产91精品一区二区绿帽 | 婷婷激情五月 | 玖玖视频国产 | 麻花豆传媒mv在线观看 | 天天操天天干天天综合网 | 99一区二区三区 | 九九九视频在线 | 麻豆视频网址 | 极品美女被弄高潮视频网站 | a在线免费观看视频 | 成人免费一级片 | www.伊人网| 99色精品视频 | 亚洲精品久久久久中文字幕m男 | 国产免费成人av | 中文字幕在线观看第三页 | 天天干天天操天天 | 国产精品热 | 色五月激情五月 | 尤物一区二区三区 | 午夜久久久久 | 丁香影院在线 | 成x99人av在线www | 中文字幕一区二区三区四区 | 一区二区三区在线观看免费视频 | 日韩一级电影在线观看 | 日韩高清片 | 青青河边草观看完整版高清 | 亚洲天堂视频在线 | 日韩一级黄色片 | 日韩精品网址 | 天天综合网久久 | av免费在线免费观看 | 91免费观看视频网站 | 色综合咪咪久久网 | 91成人精品| 中文字幕日韩免费视频 | 国产日韩在线播放 | 国产高清永久免费 | 久久不射网站 | 日韩在线高清视频 | 午夜资源站 | 国产一区免费视频 | 日韩乱码在线 | 狠狠天天| 精精国产xxxx视频在线播放 | 韩国在线一区 | 久草在线资源观看 | 超碰个人在线 | 中文字幕一区二区三区四区在线视频 | 人人看人人草 | 久草在线 | 免费在线观看91 | 亚洲精品婷婷 | 日韩二区在线播放 | 最近中文字幕 | 色吊丝在线永久观看最新版本 | 久久成人人人人精品欧 | 亚洲va欧美va人人爽春色影视 | 国产精品国产三级国产aⅴ无密码 | 97视频资源| 天天综合操 | 成人免费视频网站在线观看 | av免费试看| 久久国语| 丰满少妇在线观看网站 | 四虎国产精品永久在线国在线 | 综合伊人久久 | 成人av在线网址 | 啪啪资源 | 欧美日韩在线观看一区二区三区 | 五月天激情综合 | 手机av在线免费观看 | 在线色吧| 亚洲六月丁香色婷婷综合久久 | 在线观看一区二区视频 | 国产精品久久久久久久久费观看 | 在线观看免费一区 | 激情综合亚洲 | 青青草久草在线 | 美女视频国产 | 婷婷国产视频 | 深夜福利视频一区二区 | 国产成人精品一区二 | 99久久婷婷国产一区二区三区 | 一区二区三区www | 国产精品久久久久久久免费观看 | 91精品影视 | 久久精品男人的天堂 | 亚洲精品免费在线播放 | 免费福利视频网 | 国产亚洲在线 | 国产精品久久久久久久av大片 | 狠狠的干狠狠的操 | 深爱激情五月网 | 综合色中文 | 精品亚洲免费视频 | 五月天久久婷婷 | av再线观看 | 国产在线精品一区二区不卡了 | 最新国产在线视频 | 亚洲一区二区视频在线播放 | 国产精品久久久毛片 | 97碰碰视频| 日韩有码专区 | 日韩精品一区在线播放 | 成人av一区二区在线观看 | 久久伦理网 | 日韩视频欧美视频 | 久久免费视频这里只有精品 | 亚洲资源 | 欧美成人精品在线 | 国产精品女教师 | 一区二区三区视频在线 | 麻豆视频在线免费观看 | 婷婷九月激情 | 97视频在线免费观看 | 91视频免费视频 | 天天操天天操天天操天天操天天操 | 亚洲视频免费在线 | 99精品免费在线观看 | 日韩av电影中文字幕在线观看 | 日本黄色大片免费 | 日韩在线视频线视频免费网站 | 一区二区三区四区五区在线 | 国产精品麻豆果冻传媒在线播放 | 麻豆网站免费观看 | 久久这里精品视频 | 狠狠色伊人亚洲综合成人 | 国产精品99久久久久久人免费 | 亚洲精品在线一区二区 | www.五月婷婷.com | 国产精国产精品 | 激情网五月婷婷 | 美女视频黄免费的久久 | 精品91久久久久 | 人人干天天射 | 欧美一级电影免费观看 | 久久久久久久综合色一本 | 国产一区二区精 | 久久视频热| 91视频午夜 | 亚洲精品乱码久久久久久 | 午夜精品久久久99热福利 | 国内精品视频在线 | 97视频在线免费播放 | 国产尤物一区二区三区 | 操高跟美女 | 精品视频一区在线观看 | 天天综合精品 | 免费www视频 | 亚洲免费一级电影 | 久久久夜色 | 色av婷婷 | 一级成人免费 | 狠狠久久 | 91九色精品国产 | 亚洲mv大片欧洲mv大片免费 | 精品久久久久久国产 | 中文字幕av在线 | 久久精品人人做人人综合老师 | 婷婷av资源 | 精品一区二区综合 | 国产精品 中文字幕 亚洲 欧美 | 182午夜在线观看 | 免费男女网站 | 一区二区三区精品久久久 | 国产在线探花 | 欧美性猛片,| 国产 中文 日韩 欧美 | 1区2区视频| 97精品视频在线播放 | 国产成人精品久久二区二区 | 欧美性色网站 | 亚洲成av人片在线观看无 | 久久99亚洲网美利坚合众国 | 中文字幕人成乱码在线观看 | jizz18欧美18| 日韩黄色在线观看 | 久久伦理电影网 | 午夜影院在线观看18 | 天天干天天操天天入 | 日韩欧美在线免费观看 | 国产少妇在线观看 | 狠狠躁日日躁夜夜躁av | 亚洲一区日韩 | 亚洲国产精品va在线看 | 欧美性精品 | 亚洲欧美日韩精品久久久 | 天天躁日日躁狠狠躁av麻豆 | 美女免费视频一区 | 久久久99精品免费观看乱色 | 亚洲精品乱码久久久久久写真 | 国产成人久久久77777 | 99久久99| 激情综合网色播五月 | 黄色大片入口 | 国产伦精品一区二区三区高清 | 久久久久久久久亚洲精品 | 天天操狠狠操夜夜操 | 日韩专区在线 | 91福利视频免费观看 | 日韩高清免费无专码区 | 999久久久欧美日韩黑人 | 91精品国产福利 | 国内精品视频免费 | 亚洲精品免费在线视频 | 久久草在线视频国产 | 成人免费观看电影 | 午夜视频在线观看一区二区 | 成人a免费视频 | 国产二级视频 | 成人久久精品视频 | 婷婷色亚洲 | 国产一区av在线 | 不卡的av在线 | 欧美日韩一区二区三区在线观看视频 | 一区二区精品视频 | 日本中文字幕在线观看 | 免费看的黄色录像 | 在线观看中文字幕网站 | 韩国精品一区二区三区六区色诱 | 国产xx视频 | 在线免费av网| 在线观看视频你懂得 | 国内精品久久久久影院男同志 | 色.www| 偷拍福利视频一区二区三区 | 伊人天天综合 | 日韩免费视频在线观看 | 狠狠色香婷婷久久亚洲精品 | 日本不卡123区 | 日韩av成人在线 | 日本最大色倩网站www | 天堂麻豆 | 欧美日韩视频在线一区 | 久操中文字幕在线观看 | 午夜精品电影一区二区在线 | 久久久免费在线观看 | 国产xxxx性hd极品 | 天天操天天综合网 | 免费在线黄网 | 国产精品久久久久久69 | 久久综合久久久 | 亚洲理论电影 | 深夜国产福利 | 国产亚洲精品久久久久久无几年桃 | 天堂网在线视频 | 亚洲综合成人在线 | 99精品一区 | 日韩在线视 | 日韩免费在线视频观看 | 久久精品视频一 | 婷婷色吧 | 最新国产精品视频 | 人人干天天射 | 91亚洲精品久久久久图片蜜桃 | 中文字幕 在线 一 二 | 中文字幕中文字幕在线中文字幕三区 | 91精选 | 99色精品视频| 99视频精品在线 | 欧美日韩高清一区二区 国产亚洲免费看 | 人人澡人人添人人爽一区二区 | 在线观看免费一级片 | 一本色道久久精品 | 国产精品成人久久久 | 337p西西人体大胆瓣开下部 | av线上看 | 成人欧美一区二区三区在线观看 | 色丁香久久 | 欧美99精品 | 亚洲成人黄色在线 | 一区二区久久 | 狠狠操天天干 | 婷婷午夜 | 亚洲精品免费在线观看 | 狠狠色伊人亚洲综合网站野外 | 97综合视频 | 久草在线免费播放 | 国产精品高清一区二区三区 | 日本精品一区二区三区在线播放视频 | 国产精品入口麻豆www | 一区二区av | 免费日韩| 色婷婷激情 | 高清一区二区 | 国产成人av福利 | 麻豆一精品传二传媒短视频 | 亚洲精品乱码久久久久久蜜桃91 | 91九色最新地址 | 日韩高清免费无专码区 | 韩日精品在线 | 午夜久久久久久久久 | 亚洲高清在线视频 | 国产精品毛片一区二区 | 人人躁| 国产精品亚洲综合久久 | 亚洲高清国产视频 | 黄色软件大全网站 | 久久伊人婷婷 | 操操综合网 | 中文字幕有码在线播放 | 在线看黄色av | 一区二区视频网站 | 亚洲aⅴ在线 | 园产精品久久久久久久7电影 | 免费三及片| a黄色一级片 | 91免费网站在线观看 | 五月开心网 | 中文字幕人成乱码在线观看 | 5月丁香婷婷综合 | 色视频在线免费 | 久久成人国产精品入口 | 中文字幕av网站 | 久久人人爽人人片av | 97视频在线观看视频免费视频 | 91精品国产99久久久久久红楼 | 国产免费不卡 | 久草热视频 | 欧美色图亚洲图片 | 久久精品最新 | 国产日韩精品在线观看 | 久久这里只有精品23 | 成人小视频在线观看免费 | 四虎在线观看视频 | 黄色毛片视频 | 久久无码av一区二区三区电影网 | 国产99久久久国产精品成人免费 | 色a资源在线 | 久久久久久久久久久久久国产精品 | 国产精品久久久区三区天天噜 | 夜又临在线观看 | 一区二区免费不卡在线 | 5月丁香婷婷综合 | 一区二区三区高清不卡 | 91探花系列在线播放 | 黄色一级大片在线免费看产 | 91污污视频在线观看 | 国产日产高清dvd碟片 | 中文字幕在线视频一区二区 | 色片网站在线观看 | 久久av在线| av免费在线网站 | www.久久精品视频 | 欧美精品久久久久久 | 欧美日韩精品免费观看 | 91插插插网站 | www.伊人网| 爱色av.com| 久久视频精品在线 | av视屏在线播放 | 91av免费观看 | 一级免费观看 | 综合久久网站 | 韩国av永久免费 | 国产午夜在线 | 成人免费在线播放 | 最近2019年日本中文免费字幕 | 国产精品美女久久久久久久 | 天天干夜夜爱 | 日韩av资源站 | 黄色大片入口 | 久久久久久久久久久久国产精品 | 国产日韩亚洲 | 尤物97国产精品久久精品国产 | 热久久99这里有精品 | 国产高清在线观看 | 91九色视频国产 | 婷婷深爱| 在线高清 | 日韩在线高清免费视频 | 亚洲欧美日韩在线一区二区 | 丝袜美腿av | 免费观看性生活大片 | 97天堂| 久久久亚洲网站 | 日本性xxxxx 亚洲精品午夜久久久 | 日韩亚洲在线观看 | 久久久污| 五月天,com| 91大神精品视频在线观看 | 香蕉在线播放 | 精品久久中文 | 亚洲伦理一区 | 国产视频精品在线 | 91av蜜桃| 综合激情伊人 | 国产精品久久久久久久电影 | 九九热久久久 | 欧美精品九九 | 91插插插免费视频 | 精品播放 | www.狠狠色| 国产青青青 | 99久久精品免费看国产麻豆 | 久草在线视频免费资源观看 | www.婷婷色 | 狠狠操.com| 中文在线字幕免费观 | 久久精品免费播放 | 日韩av女优视频 | 在线观看日本高清mv视频 | 精品国产一区在线观看 | 涩五月婷婷 | 久久久久久久久久伊人 | 啪啪av在线 | 日韩午夜电影 | 一级黄色电影网站 | 操夜夜操| 黄污在线看 | 最新av在线免费观看 | 日韩sese| 成人免费看片98欧美 | 婷婷久久久 | 亚洲网久久 | 黄色网址在线播放 | 日韩高清一二区 | 91精品国产成 | 日韩精品久久久久久久电影竹菊 | 日韩一区二区免费视频 | av高清免费在线 | 在线看国产精品 | 成人午夜精品久久久久久久3d | 色悠悠久久综合 | 国产精品久久久久一区二区 | 国产成人高清 | 久久久精品福利视频 | 精品国产精品一区二区夜夜嗨 | 婷婷在线色 | 97超碰总站 | 国产精品免费久久久久 | 综合网婷婷 | 成人欧美日韩国产 | 麻豆免费视频 | 六月天综合网 | 亚洲精品国产区 | av动图 | av线上免费观看 | 国产视频久久久 | 国产精品一区二区在线免费观看 | 99精品视频在线观看视频 | 国产精品 日韩精品 | 亚洲精品视频免费 | 亚洲国产三级 | 国产精品国产三级国产 | 人人狠狠综合久久亚洲婷 | 免费又黄又爽 | 激情网综合 | 国产网站色 | 日日干夜夜干 | 国产精品久久久久久久久久99 | 日韩av网站在线播放 | 一级欧美黄| 国产美女网| 婷婷爱五月天 | 日韩av片无码一区二区不卡电影 | 国产一区麻豆 | 在线观看91 | 国产精品美女久久久久久久 | 五月婷婷av | 五月天亚洲精品 | 久久国产露脸精品国产 | 日韩久久久久久久 | 日日夜夜国产 | 日韩av一区二区三区 | 成人动漫视频在线 | 国产三级视频在线 | 日韩av中文字幕在线免费观看 | 久久精品美女 | 有码中文在线 | www黄在线 | 在线中文字幕av观看 | 久久久久久久久电影 | 国产精品亚洲片在线播放 | 婷婷丁香激情网 | 国产一区二区在线看 | 国产精品理论视频 | 精品久久一二三区 | 久久精品精品电影网 | 三级a视频 | 一区二区三区四区不卡 | 亚洲 欧美日韩 国产 中文 | 九色免费视频 | 亚洲精品91天天久久人人 | 中国一级片在线观看 | 国产99久久精品一区二区永久免费 | 免费在线播放av电影 | 在线看污网站 | www激情久久 | 91免费的视频在线播放 | 青春草免费在线视频 | 中文字幕a∨在线乱码免费看 | 激情视频亚洲 | 一二三精品视频 | 国产视频久久 | www.五月激情.com | 色夜视频 | 久久久久免费精品视频 | 97在线影视 | 天天综合久久综合 | 色欧美日韩 | 亚洲aⅴ久久精品 | 精品极品在线 | 黄色小说在线免费观看 | 久久国产精品免费视频 | 国产免费视频一区二区裸体 | 国产人免费人成免费视频 | 免费视频久久久久久久 | 免费在线成人av电影 | 国产精品 日韩 欧美 | 激情文学综合丁香 | 97在线免费观看 | 亚洲天堂网在线视频观看 | 久草视频在线资源站 | 欧美日韩国产网站 | 99热在线免费观看 | 狠狠狠色丁香综合久久天下网 | 国产色在线,com | 国产日韩在线播放 | 久久精品中文字幕少妇 | 精品自拍sae8—视频 | 免费的国产精品 | 91免费视频国产 | 波多野结衣在线中文字幕 | 中文字幕文字幕一区二区 | 久久都是精品 | 久99久视频 | 日本不卡123| 91黄视频在线观看 | 黄色在线观看免费网站 | ,午夜性刺激免费看视频 | 亚洲.www| 超碰人人av | 成人蜜桃视频 | 五月激情五月激情 | 丁香婷婷色综合亚洲电影 | 黄色成品视频 | 国产精品网站 | 六月丁香综合网 | 国产精品国产精品 | 婷婷激情五月综合 | 日韩免费中文字幕 | 国产伦精品一区二区三区四区视频 | 日韩一级电影在线观看 | 五月天婷婷在线观看视频 | 2019av在线视频 | 一区 二区 精品 | 超碰公开97| 91精品推荐 | 中文字幕亚洲精品日韩 | 99热9 | 国产精品久久久久久久久搜平片 | 国产精品久久久久久a | 国产精品乱码久久 | 天天爽天天爽天天爽 | 国产91精品看黄网站在线观看动漫 | 99产精品成人啪免费网站 | 天天射日 | 1000部18岁以下禁看视频 | 国产区在线看 | 成人a级网站 | 免费一级毛毛片 | 天天躁日日躁狠狠躁 | 在线播放av网址 | 久久免费视频这里只有精品 | 亚洲六月丁香色婷婷综合久久 | 久久久久久久久影院 | 成人av中文字幕 | 国产精品久久久免费看 | 三级黄在线 | 久草免费手机视频 | 欧美三级免费 | 在线看一级片 | 一本一本久久a久久精品综合 | 日韩精品久久久免费观看夜色 | 欧美了一区在线观看 | 黄色精品一区 | 日韩成人邪恶影片 | 就要干b| 国产成人精品久久久久 | 日韩一区二区在线免费观看 | 国产成人a v电影 | 中文字幕久久久精品 | 国产特级毛片aaaaaa | 久久99久国产精品黄毛片入口 | 久久免费精彩视频 | 久久综合久久综合这里只有精品 | 天天碰天天操视频 | 中文理论片 | 在线免费黄| 亚洲免费在线视频 | 久久一区二 | h视频日本| 69视频永久免费观看 | 日韩免费电影一区二区三区 | 久久久免费国产 | av福利电影 | 精品一区二区在线看 | 婷婷开心久久网 | 婷婷久久久 | 国色天香第二季 | 日本久久久精品视频 | 成人av电影在线 | 日韩高清在线不卡 | 日日操日日插 | 婷婷伊人五月天 | 国产99久久久国产精品免费看 | 四虎国产精 | 国产黄免费看 | 欧美一区中文字幕 | h视频在线看 | 在线观看深夜视频 | 天天射天天射 | 婷婷视频| 日本性久久 | 国产精品一区二区三区免费视频 | 99久久精品无免国产免费 | 精品国产成人在线 | 日韩欧美电影 | 99在线观看| 91精品国产麻豆国产自产影视 | 国产69久久久欧美一级 | 亚洲天堂网在线视频 | 99热国产精品 | 日韩精品极品视频 | 天天综合中文 | 91视频麻豆 | 欧美久久久久久久久 | 久久久伊人网 | 亚州精品国产 | 青草草在线 | 麻豆精品传媒视频 | 国产日韩中文在线 | 91成人免费看 | 日韩av电影中文字幕 | 99国产精品视频免费观看一公开 | 国产高清不卡av | 天天干天天操天天射 | 国产91亚洲 | 色大片免费看 | 在线成人国产 | 在线观看成人小视频 | 99精品观看 | 成人一级免费电影 | 国产精品一区二区在线看 | 亚洲一级性| 色资源中文字幕 | 麻豆91精品91久久久 | 亚洲成人av在线 | 国产麻豆果冻传媒在线观看 | 黄色在线免费观看网站 | 99色在线播放 | 高清在线一区二区 | 成人免费亚洲 | 免费亚洲片 | 激情伊人五月天久久综合 | 中文字幕在线观看不卡 | 国产麻豆果冻传媒在线观看 | 久久九九免费 | 在线视频手机国产 | 亚洲国产999 | 久久久久免费精品国产小说色大师 | 黄色软件在线观看视频 | 日韩精品一区二区三区高清免费 | 九九免费视频 | 亚洲成免费 | 欧美日韩国产在线精品 | 亚洲高清精品在线 | 国产精品婷婷午夜在线观看 | 国产中文a| 麻豆视频免费在线观看 | 毛片在线播放网址 | 日韩精品一区二区三区在线播放 | 久久精品在线视频 | 欧美日韩国产一区二 | 国产丝袜网站 | 9热精品| 中文字幕 影院 | 在线观看一级片 | 中文字幕电影高清在线观看 | 亚洲精欧美一区二区精品 | 月下香电影 | 中文字字幕在线 | 日本中文字幕影院 | 777视频在线观看 | 日韩av一区二区三区 | 国产中文字幕网 | 丁香伊人网 | 天天射天天舔天天干 | 成年人看片 | 亚洲在线国产 | 日本色小说视频 | 国产伦理剧 | 夜夜骑天天操 | 婷婷精品国产欧美精品亚洲人人爽 | 色橹橹欧美在线观看视频高清 | 国产精品久久伊人 | 久草97| 国产精品久久久久久电影 | 国产成人av电影在线 | 毛片888| 久久久久免费精品视频 | 国产伦理一区二区三区 | 国产精品破处视频 | 国产99久久精品一区二区永久免费 | 精品亚洲成a人在线观看 | 麻豆视频在线免费观看 | 久久精品高清 | 国产123区在线观看 国产精品麻豆91 | 天天综合婷婷 | 天天综合天天综合 | 福利av影院| 国产 日韩 在线 亚洲 字幕 中文 | a在线视频v视频 | 免费黄色在线网址 | 天天插伊人 | 日韩性片 | 久久五月精品 | 69av免费视频| 在线观看视频国产一区 | 日韩精品中文字幕在线 | 91av原创| 亚洲在线视频免费观看 | 97在线视频免费观看 | 亚洲精品自拍视频在线观看 | 精品一区电影 | av黄免费看 | 婷婷视频在线 | 久草视频精品 | av在线免费播放网站 | 中文字幕在线观看免费观看 | 国产免费人成xvideos视频 | 二区三区中文字幕 | 久久激五月天综合精品 | 在线免费观看麻豆视频 | 亚洲手机av | 亚洲aⅴ乱码精品成人区 | 成人精品一区二区三区电影免费 | 四虎在线免费观看视频 | 色噜噜色噜噜 | 色视频在线看 | a黄色一级| 波多野结衣在线播放一区 | 色综合久久88色综合天天6 | 中文字幕a∨在线乱码免费看 | 99精品黄色片免费大全 | 亚洲一区二区精品视频 | 久久成人国产精品入口 | 亚洲欧美日韩精品一区二区 | 免费观看黄色12片一级视频 | 99精品久久久 | 欧美一二三在线 | 国产最新视频在线 | 黄色特级一级片 | 国产精品资源在线观看 | 99精品欧美一区二区蜜桃免费 | 天天艹| 最近高清中文字幕 | 天天撸夜夜操 | 91大神在线观看视频 | 色噜噜在线观看视频 | 久久久久久免费网 | 日精品| 日日弄天天弄美女bbbb | 天天色天天色天天色 | 亚洲视频免费在线观看 | 天天操 夜夜操 | 日韩四虎| 午夜av网站 | 婷婷网站天天婷婷网站 | 欧美一区二区三区特黄 | 欧美日韩免费观看一区=区三区 | 五月婷婷在线观看 | 久久久久久美女 | 亚洲欧美精品一区二区 | 日韩狠狠操 | 国产精品久久久久一区二区国产 | 在线观看免费av网 | 成人在线免费视频 | 西西444www大胆高清视频 | 国产一级高清 | 欧美色黄 | 日韩精品中文字幕在线不卡尤物 | 五月天丁香 | 免费视频 三区 | 久久久91精品国产一区二区精品 | 国产97在线看 | 久久综合网色—综合色88 | 日韩欧美成人网 | www.伊人网| 国产精品不卡一区 | 婷婷在线视频 | 中文字幕亚洲欧美 | 深爱婷婷久久综合 | 精品国产一区二区三区久久久蜜臀 | 免费三级av | 九九九视频精品 | 婷婷久久五月天 | 中文字幕在线观看网 | 国产一区二区在线免费 | 99精品久久只有精品 | av大片免费在线观看 | 黄色在线看网站 | 91久久久久久久一区二区 | 最新中文在线视频 | 精品二区视频 | 亚洲一区精品人人爽人人躁 | 1000部国产精品成人观看 | 美女久久久 | 狠狠操天天射 | 精品国产网址 | 久久久久久久久久久国产精品 | 婷婷深爱激情 | 欧美日韩中文国产一区发布 | 香蕉视频在线网站 | 黄色官网在线观看 | 亚洲人在线视频 | 国产精品毛片久久久久久久 | 亚洲精品国精品久久99热 | 国产在线超碰 | 亚洲精品综合在线观看 | 色99久久 | 欧美美女视频在线观看 | 激情久久久久久久久久久久久久久久 | 婷婷丁香色 | 色吊丝在线永久观看最新版本 | 天天干天天做 | 精品91视频 | 美女av在线免费 | 激情av五月婷婷 | 婷婷午夜天 | 一区二区电影网 | 日韩视频免费播放 | 午夜91视频 | 久久精品99国产精品日本 | 国产精品视频免费在线观看 | www国产一区| 亚洲国产成人精品在线 | 九色porny真实丨国产18 | 欧美日韩在线精品一区二区 | 日韩免费一级a毛片在线播放一级 | 国产伦精品一区二区三区四区视频 | 久久tv | 国产色婷婷精品综合在线手机播放 | 国产96在线| 成人va视频 | 91高清免费在线观看 | 午夜精品久久久久久久久久久久久久 | 91av小视频 | 国产中文字幕视频在线观看 | 亚洲清纯国产 | 欧美小视频在线观看 | 成人理论电影 | 在线观看完整版 | 色噜噜日韩精品欧美一区二区 | 免费色黄| 久久久五月婷婷 | 最新日韩在线观看视频 | 日韩精品在线观看视频 | 免费在线播放av电影 | 天天干,夜夜爽 | 亚洲精品国偷自产在线99热 | 又黄又刺激视频 | www日韩视频 | 亚洲第五色综合网 | 免费不卡中文字幕视频 | 高清av中文字幕 | 久久高清片 | 亚洲国产免费看 | 欧美日韩不卡在线视频 | 97视频在线观看视频免费视频 | 亚洲精品97| 婷婷天天色| 日韩超碰在线 | 婷婷国产一区二区三区 | 精品国产一区二区三区在线 | 国产一区二区观看 | 亚洲伊人网在线观看 | 天天色天天搞 | 黄在线免费看 | 久久精品久久久久电影 | 欧美疯狂性受xxxxx另类 | 日韩国产精品久久久久久亚洲 | 波多野结衣在线视频一区 | 国产精品婷婷 | 日本h视频在线观看 | 激情综合五月天 | 99久久一区 | 国产福利免费看 | 中文字幕免费 | 日本中文字幕在线 | 欧美黑人猛交 | 欧美日韩中文在线视频 | 国产精品wwwwww| 久久超碰在线 | 久久久久久久久久久免费视频 | 天天看天天干 | 欧美极品在线播放 | 国产精品一区二区久久精品爱微奶 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产免费a| 特级西西人体444是什么意思 | 国产精品视频免费在线观看 | 91久久丝袜国产露脸动漫 | 国产小视频福利在线 | 高清免费在线视频 | 五月婷婷影视 | 亚洲午夜大片 | 97国产大学生情侣酒店的特点 | 成年人电影免费看 | 在线免费观看不卡av | 99久久精品国产一区二区成人 | 欧美一区二区三区激情视频 | 国产免费高清视频 | 天天干,天天操,天天射 | 国产精品久久久久三级 | 人人精品久久 | 开心综合网 | 99久久www免费| av网站在线观看播放 | 天天操天天怕 | 日韩欧美一区二区在线播放 | 欧美粗又大 | 人人爱天天操 | 日女人免费视频 | 国产成人区 | 激情五月***国产精品 | 精品国产伦一区二区三区观看说明 | 国产高清99 | 黄色大全免费网站 | 久久亚洲婷婷 | 亚洲黄色av | 日本久久免费视频 | 在线中文字母电影观看 | 久久超级碰 | 亚洲一二视频 | 免费国产一区二区 | 日韩精品最新在线观看 | 国产91电影在线观看 | 粉嫩av一区二区三区免费 | 免费视频一级片 | 日韩一级理论片 | 免费色网 | 欧美va天堂在线电影 | 色婷婷综合久久久中文字幕 | 欧美午夜精品久久久久久浪潮 | 日日干美女 | 亚洲欧洲精品一区二区 | 日韩欧美一级二级 | 超碰在线官网 | 日韩欧美综合 | 国产精品黑丝在线观看 | 日韩精品一区在线观看 | 99精品久久只有精品 | 草久在线播放 | 中文字幕在线观看网址 | 久久精品亚洲一区二区三区观看模式 | www.在线看片.com |