移动机器人全覆盖路径规划及仿真(一.地图预处理)

移动机器人全覆盖路径规划及仿真(一.地图预处理)

算法步骤

1.地图预处理;
2.选取合适的遍历方向;
3.地图分割;
4.子区域连接与遍历;
5.建立机器人模型,并将路径点发送给机器人。

原始地图
原始地图全覆盖路径
在这里插入图片描述gazebo仿真
在这里插入图片描述
在这里插入图片描述

地图处理流程
在这里插入图片描述
图2,用wall_contours围成的区域做mask。

图3,mask与原地图做加运算(两者都是黑色时为黑,其余均为白色)。
在这里插入图片描述
图4,用wall_contours围成的区域画黑色填充的多边形,以多边形每个顶点,机器人半径画白色圆。

在这里插入图片描述
图5,在上图基础上用Obstacle_contours
围成的区域画黑色填充的多边形。
在这里插入图片描述
图6,以多边形每个顶点,机器人半径画白色圆,地图腐蚀和膨胀。
在这里插入图片描述
图7,地图内Obstacle_contours。
在这里插入图片描述
图8,地图Wall_contours
在这里插入图片描述

void ExtractRawContours(const cv::Mat& original_map, std::vector<std::vector<cv::Point>>& raw_wall_contours, std::vector<std::vector<cv::Point>>& raw_obstacle_contours)
{
    cv::Mat map = original_map.clone();
    cv::threshold(map, map, 128, 255, cv::THRESH_BINARY_INV);

    cv::cvtColor(map, map, cv::COLOR_GRAY2BGR);


    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(original_map.clone(), contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

    std::vector<int> wall_cnt_indices(contours.size());
    std::iota(wall_cnt_indices.begin(), wall_cnt_indices.end(), 0);

//    std::sort(wall_cnt_indices.begin(), wall_cnt_indices.end(), [&contours](int lhs, int rhs){return contours[lhs].size() > contours[rhs].size();});
    std::sort(wall_cnt_indices.begin(), wall_cnt_indices.end(), [&contours](int lhs, int rhs){return cv::contourArea(contours[lhs]) > cv::contourArea(contours[rhs]);});

    std::vector<cv::Point> raw_wall_contour = contours[wall_cnt_indices.front()];
    raw_wall_contours = {raw_wall_contour};

    cv::Mat mask = cv::Mat(original_map.size(), original_map.type(), 255);
    cv::fillPoly(mask, raw_wall_contours, 0);



    cv::Mat base = original_map.clone();
    base += mask;



    cv::threshold(base, base, 128, 255, cv::THRESH_BINARY_INV);



    cv::findContours(base, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

    raw_obstacle_contours = contours;
}

void ExtractContours(const cv::Mat& original_map, std::vector<std::vector<cv::Point>>& wall_contours, std::vector<std::vector<cv::Point>>& obstacle_contours, int robot_radius=0)
{
    ExtractRawContours(original_map, wall_contours, obstacle_contours);

    if(robot_radius != 0)
    {
        cv::Mat3b canvas = cv::Mat3b(original_map.size(), CV_8U);
        canvas.setTo(cv::Scalar(255, 255, 255));


        cv::fillPoly(canvas, wall_contours, cv::Scalar(0, 0, 0));

        for(const auto& point:wall_contours.front())
        {
            cv::circle(canvas, point, robot_radius, cv::Scalar(255, 255, 255), -1);
        }



        cv::fillPoly(canvas, obstacle_contours, cv::Scalar(255, 255, 255));


        for(const auto& obstacle_contour:obstacle_contours)
        {
            for(const auto& point:obstacle_contour)
            {
                cv::circle(canvas, point, robot_radius, cv::Scalar(255, 255, 255), -1);
            }
        }



        cv::Mat canvas_;
        cv::cvtColor(canvas, canvas_, cv::COLOR_BGR2GRAY);
        cv::threshold(canvas_, canvas_, 200, 255, cv::THRESH_BINARY_INV);


        cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(robot_radius,robot_radius), cv::Point(-1,-1));
        cv::morphologyEx(canvas_, canvas_, cv::MORPH_OPEN, kernel);



        ExtractRawContours(canvas_, wall_contours, obstacle_contours);


        std::vector<cv::Point> processed_wall_contour;
        cv::approxPolyDP(cv::Mat(wall_contours.front()), processed_wall_contour, 1, true);

        std::vector<std::vector<cv::Point>> processed_obstacle_contours(obstacle_contours.size());
        for(int i = 0; i < obstacle_contours.size(); i++)
        {
            cv::approxPolyDP(cv::Mat(obstacle_contours[i]), processed_obstacle_contours[i], 1, true);
        }

        wall_contours = {processed_wall_contour};
        obstacle_contours = processed_obstacle_contours;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值