移动机器人全覆盖路径规划及仿真(二.选择合适的遍历方向)

移动机器人全覆盖路径规划及仿真(二.选择合适的遍历方向)

算法流程
1.地图预处理;
2.识别地图中的直线;
3.选取最长或最短直线计算斜率;
4.将地图沿该斜率方向旋转。

float cal_rat_angle(cv::Mat map)
{
    // Parameter configuration
    double meters_per_pix = 0.05;
    double robot_size_in_meters = 0.48;
    int robot_radius = ComputeRobotRadius(meters_per_pix, robot_size_in_meters);
    //find contours
    std::vector<std::vector<cv::Point>> obstacle_contours;
    std::vector<std::vector<cv::Point>> wall_contours;
    ExtractContours(map, wall_contours, obstacle_contours, 4);
    Polygon wall = ConstructWall(map, wall_contours.front());
    PolygonList obstacles = ConstructObstacles(map, obstacle_contours);

    cv::Mat3b src = cv::Mat3b(map.size());
    src.setTo(cv::Scalar(0, 0, 0));
    cv::fillPoly(src, wall_contours, cv::Scalar(255, 255, 255));
    cv::fillPoly(src, obstacle_contours, cv::Scalar(0, 0, 0));
    std::cout << "Get map2" << std::endl;
    //cv::imshow("aa",src);
    //cv::waitKey(0);

    cv::Mat edges, dst;
    //cv::imshow("aa",src);
    //cv::waitKey(0);
    //cv::cvtColor(src,dst,CV_BGR2GRAY);
    cv::Canny(src, edges, 50, 150, 3);
    //cv::imshow("Canny",edges);
    //cv::waitKey(0);
    std::vector<Vec4f> lines;
    //std::vector<std::vector<float>> lines;
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 100, 50, 10);
    //cv::cvtColor(src,dst,CV_GRAY2BGR);

    for (auto line : lines)
    {
        float x8, y8, x9, y9;
        x8 = line[0];
        y8 = line[1];
        x9 = line[2];
        y9 = line[3];
        cv::line(src,cv::Point(x8, y8), cv::Point(x9, y9), (0, 0, 255), 1);
        //line(src,Point(1,1),Point(250,250),Scalar(0,0,255),5,CV_AA);

        cv::imshow("line_detect_possible_demo", src);
        //cv::waitKey(0);
    }

    float mink;
    std::vector<float> linek;
    for(auto line : lines)
    {
        float x0, y0, x1, y1;
        x0 = line[0];
        y0 = line[1];
        x1 = line[2];
        y1 = line[3];
        //x0, y0, x1, y1 = line;
        linek.push_back((y1 - y0)/(x1 - x0));
    }
    std::vector<float> verticalk;
    for(float i : linek)
    {
        //std::vector<float> temp = i * linek;
        std::vector<float> temp;
        for(float n : linek)
        {
            temp.push_back(i * n);
        }
        for(float j : temp)
        {
            if (0.9 < abs(j) && abs(j) < 1.1)
                verticalk.push_back(i);
        }
    }
    /**if(verticalk.size() != 0)
    {
        auto iter = std::min_element(std::begin(verticalk),std::end(verticalk));
        mink = *iter;
    }

    else
    {
        std::vector<float> line_length;
        for(auto line : lines)
        {
            float x2, y2, x3, y3;
            x2 = line[0];
            y2 = line[1];
            x3 = line[2];
            y3 = line[3];
            //x2, y2, x3, y3 = line;
            float length = (y3 - y2)*(y3 - y2) + (x3 - x2)*(x3 - x2);
            line_length.push_back(length);
        }
        auto iter1 = std::max_element(line_length.begin(),line_length.end());
        //float longest = *iter1;
        int index1 = std::distance(std::begin(line_length), iter1);
        float x4, y4, x5, y5;
        x4 = lines[index1][0];
        y4 = lines[index1][1];
        x5 = lines[index1][2];
        y5 = lines[index1][3];
        //x4, y4, x5, y5 = temp1;
        mink = (y5 - y4)/(x5 - x4);
    }**/

    std::vector<float> line_length;
    for(auto line : lines)
    {
        float x2, y2, x3, y3;
        x2 = line[0];
        y2 = line[1];
        x3 = line[2];
        y3 = line[3];
        //x2, y2, x3, y3 = line;
        float length = (y3 - y2)*(y3 - y2) + (x3 - x2)*(x3 - x2);
        line_length.push_back(length);
    }
    //auto iter1 = std::max_element(line_length.begin(),line_length.end());
    auto iter1 = std::max_element(line_length.begin(),line_length.end());
    //float longest = *iter1;
    int index1 = std::distance(std::begin(line_length), iter1);
    float x4, y4, x5, y5;
    x4 = lines[index1][0];
    y4 = lines[index1][1];
    x5 = lines[index1][2];
    y5 = lines[index1][3];
    //x4, y4, x5, y5 = temp1;
    mink = (y5 - y4)/(x5 - x4);
    return mink;
}

void rotate_arbitrarily_angle(cv::Mat &src,cv::Mat &dst,float angle)
{


    int maxBorder =(int) (cv::max(src.cols, src.rows)* 1.414 ); //即为sqrt(2)*max
    int dx = (maxBorder - src.cols)/2;
    int dy = (maxBorder - src.rows)/2;
    copyMakeBorder(src, dst, dy, dy, dx, dx, cv::BORDER_CONSTANT);
    cv::Point2f center( (float)(dst.cols/2) , (float) (dst.rows/2));
    cv::Mat affine_matrix = getRotationMatrix2D( center, angle, 1.0 );//求得旋转矩阵
    warpAffine(dst, dst, affine_matrix, dst.size());
}

平行最长边的遍历方向。
在这里插入图片描述
垂直最长边的方向。
在这里插入图片描述
地图预处理后识别的所有边。
在这里插入图片描述

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 基于turtlesim模拟扫地机器人的覆盖路径规划可以分为以下几个步骤: 1. 初始化环境:首先,在turtlesim中创建一个仿真环境,确定机器人的起始位置和地图边界。 2. 地图分割:将整个环境划分为小网格,每个网格代表机器人可以移动的区域。 3. 覆盖策略:选择一个覆盖策略,例如螺旋形扫描或Z字形扫描等。这些策略可以在机器人移动时确保覆盖每个网格。 4. 路径规划:根据当前机器人所在的位置和选择覆盖策略,计算机器人移动的路径。路径规划算法可以选择A*算法或Dijkstra算法等。 5. 移动控制:根据计算得到的路径,通过控制机器人的速度和方向,使机器人按照规划路径进行移动。 6. 障碍物避免:如果在移动过程中遇到障碍物,需要进行避障处理,例如使用传感器探测障碍物并重新计算路径。 7. 完成覆盖:当机器人完成当前路径的覆盖后,继续计算下一个路径,直到整个环境的所有网格都被覆盖。 通过以上步骤,可以在turtlesim模拟环境中实现基于覆盖路径规划的扫地机器人仿真。这样的仿真可以用于验证和优化真实扫地机器人的路径规划算法,并帮助设计更高效的清洁机器人系统。 ### 回答2: 基于turtlesim模拟的扫地机器人覆盖路径规划涉及到几个关键步骤。 首先,需要确定turtlesim环境的大小和机器人的起始位置。假设turtlesim环境是一个矩形区域,机器人的起始位置位于矩形区域的左上角。 其次,为了实现覆盖路径规划,可以采用螺旋式的行动策略。机器人按照固定的方向和速度前进,当机器人到达turtlesim环境的边框时,它会沿着边框行进一段距离,然后转弯进入内部区域,继续按照同样的方向和速度前进。这样重复多次,直到整个turtlesim环境被完覆盖。 接下来,需要实现机器人转弯的策略。可以通过控制机器人的角速度来实现转弯,具体的转弯角度可以根据实际情况进行调整。当机器人到达环境边框时,可以使其沿着边框行进一段距离,然后通过调整机器人的角速度来使其转弯,进入内部区域。 最后,需要注意机器人的运动控制和碰撞检测。在模拟中,可以通过编程控制机器人的运动速度和角速度,以及实时监测机器人与环境边框的碰撞情况。当机器人与边框碰撞时,可以停止转弯并沿着边框行进一段距离,避免出现碰撞错误。 综上所述,基于turtlesim模拟的扫地机器人覆盖路径规划需要确定环境大小和机器人的起始位置,采用螺旋式的行动策略实现覆盖整个环境,编程实现机器人的运动控制和转弯策略,并确保机器人与环境边框的碰撞检测和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值