CN118092455B - 一种智能仓库的安全保护系统和方法 - Google Patents

一种智能仓库的安全保护系统和方法

Info

Publication number
CN118092455B
CN118092455B CN202410474562.3A CN202410474562A CN118092455B CN 118092455 B CN118092455 B CN 118092455B CN 202410474562 A CN202410474562 A CN 202410474562A CN 118092455 B CN118092455 B CN 118092455B
Authority
CN
China
Prior art keywords
guided vehicle
automatic guided
real
time
positioning
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202410474562.3A
Other languages
English (en)
Other versions
CN118092455A (zh
Inventor
刘海胶
李驰
颜蔚东
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guangdong Tengwei Zhishu Technology Co ltd
Original Assignee
Guangdong Tengwei Zhishu Technology Co ltd
Filing date
Publication date
Application filed by Guangdong Tengwei Zhishu Technology Co ltd filed Critical Guangdong Tengwei Zhishu Technology Co ltd
Priority to CN202410474562.3A priority Critical patent/CN118092455B/zh
Publication of CN118092455A publication Critical patent/CN118092455A/zh
Application granted granted Critical
Publication of CN118092455B publication Critical patent/CN118092455B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明公开一种智能仓库的安全保护系统和方法,涉及仓储管理技术领域。本发明包括,自动导引车,包括驱动模块、定位通讯模块、雷达、安全保护控制端以及报警检修端,根据获取的实时定位位置得到自动导引车的实时实际位置分布范围;根据电子地图获取自动导引车的实时实际位置分布范围内道路及障碍物分布;根据车身各部位雷达与障碍物实时距离以及自动导引车的实时实际位置分布范围内道路及障碍物分布得到自动导引车的实时实际位置;根据自动导引车的实时实际位置以及自动导引车的设定移动轨迹判断自动导引车是否偏离设定移动轨迹超过设定最大偏离距离。本发明有效避免仓库内进出货过程中出现碰撞后扩大危害从而危及仓库安全。

Description

一种智能仓库的安全保护系统和方法
技术领域
本发明属于仓储管理技术领域,特别是涉及一种智能仓库的安全保护系统和方法。
背景技术
随着现代物流业的迅速发展,智能仓库成为了提升仓储效率、降低管理成本、保障货物安全的重要手段。智能仓库通过自动化、信息化技术实现货物的智能化存储与管理。
仓库内的获取进出通常通过自动导引车(AGV)实现货物运输,为了避免高频快速的货物运输导致自动引导车与货架等障碍物发生碰撞后无人检修导致仓库内发生危害事件,通常会安排人员进行定期巡检,但是这样无法实时对仓库内的进出货状况进行监控,无法及时保障仓库内的进出货安全。
发明内容
本发明的目的在于提供一种智能仓库的安全保护系统和方法,通过对仓库内的自动导引车进行高精度的无线定位,有效避免仓库内进出货过程中出现碰撞后扩大危害从而危及仓库安全。
为解决上述技术问题,本发明是通过以下技术方案实现的:
本发明提供一种智能仓库的安全保护方法,包括,
获取仓库内的道路及障碍物分布的电子地图;
获取自动导引车的设定移动轨迹以及设定最大偏离距离;
持续获取自动导引车的实时定位位置以及车身各部位雷达与障碍物实时距离;
根据获取的实时定位位置得到所述自动导引车的实时实际位置分布范围;
根据所述电子地图获取所述自动导引车的实时实际位置分布范围内道路及障碍物分布;
根据车身各部位雷达与障碍物实时距离以及所述自动导引车的实时实际位置分布范围内道路及障碍物分布得到所述自动导引车的实时实际位置;
根据所述自动导引车的实时实际位置以及所述自动导引车的设定移动轨迹判断所述自动导引车是否偏离设定移动轨迹超过设定最大偏离距离;
若是,则判断所述自动导引车处于不安全状态;
若否,则判断所述自动导引车处于安全状态。
本发明还公开了一种智能仓库的安全保护方法,包括,
接收自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则控制所述自动导引车继续运行;
若所述自动导引车处于不安全状态,则控制所述自动导引车停止运行。
本发明还公开了一种智能仓库的安全保护方法,包括,
报警检修,接收自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则不进行操作;
若所述自动导引车处于不安全状态,则对所述自动导引车进行检修。
本发明还公开了一种智能仓库的安全保护系统,包括,
自动导引车,包括驱动模块、定位通讯模块以及雷达;其中所述驱动模块用于驱动所述自动引导车行驶移动,所述定位通讯模块用于获取并发送实时定位位置以及车身各部位雷达与障碍物实时距离;
安全保护控制端,用于获取仓库内的道路及障碍物分布的电子地图;
获取自动导引车的设定移动轨迹以及设定最大偏离距离;
持续获取自动导引车的实时定位位置以及车身各部位雷达与障碍物实时距离;
根据获取的实时定位位置得到所述自动导引车的实时实际位置分布范围;
根据所述电子地图获取所述自动导引车的实时实际位置分布范围内道路及障碍物分布;
根据车身各部位雷达与障碍物实时距离以及所述自动导引车的实时实际位置分布范围内道路及障碍物分布得到所述自动导引车的实时实际位置;
根据所述自动导引车的实时实际位置以及所述自动导引车的设定移动轨迹判断所述自动导引车是否偏离设定移动轨迹超过设定最大偏离距离;
若是,则判断所述自动导引车处于不安全状态;
若否,则判断所述自动导引车处于安全状态;
报警检修端,用于接收自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则不进行操作;
若所述自动导引车处于不安全状态,则对所述自动导引车进行检修;
其中,所述驱动模块还用于接收所述自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则控制所述自动导引车继续运行;
若所述自动导引车处于不安全状态,则控制所述自动导引车停止运行。
本发明通过自动导引车的定位位置获取自动导引车的实时实际位置分布范围,并通过电子地图中道路及障碍物分布以及车身各部位雷达与障碍物实时距离对实时实际位置分布范围进行范围缩小和校正,从而得到自动引导车的准确位置,实现对自动导引车在仓库内进出货过程的碰撞判断,有效保障了仓库内无人值守状态下的进出货安全。
当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明所述一种智能仓库的安全保护系统于一实施例的功能模块和信息流向示意图;
图2为本发明所述安全保护控制端于一实施例的步骤流程示意图;
图3为本发明所述驱动模块于一实施例的步骤流程示意图;
图4为本发明所述报警检修端于一实施例的步骤流程示意图;
图5为本发明所述步骤S4于一实施例的步骤流程示意图;
图6为本发明所述步骤S44于一实施例的步骤流程示意图;
图7为本发明所述步骤S6于一实施例的步骤流程示意图;
图8为本发明所述步骤S68于一实施例的步骤流程示意图;
图9为本发明所述步骤S8于一实施例的步骤流程示意图;
附图中,各标号所代表的部件列表如下:
1-自动导引车,11-驱动模块,12-雷达,13-定位通讯模块;
2-安全保护控制端;
3-报警检修端。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
需要说明的是,本申请中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
智能仓库是指应用物联网、传感器技术、自动化控制和数据分析等先进技术,以提高仓库管理效率、降低成本并增强货物流通性的仓库系统。智能仓库利用各种技术手段实现自动化操作、实时监控和智能决策,提供更高效、更准确的仓储和物流管理。由于智能仓库内通常无人值守,也不会对自动导引车(AGV)进行行驶介入。为了避免自动引导车与货柜等障碍物发生碰撞,或者碰撞后进行及时维保检修,本发明提供以下方案。
请参阅图1至2所示,本发明提供了一种智能仓库的安全保护系统,从功能模块上划分包括自动导引车1、安全保护控制端2以及报警检修端3。自动导引车1,包括驱动模块11、雷达12以及定位通讯模块13。其中驱动模块11用于驱动自动引导车行驶移动,定位通讯模块13用于获取并发送实时定位位置以及车身各部位雷达12与障碍物实时距离。
本系统中的安全保护控制端2在运行的过程中首先可以执行步骤S1获取仓库内的道路及障碍物分布的电子地图。接下来可以执行步骤S2获取自动导引车的设定移动轨迹以及设定最大偏离距离。接下来可以执行步骤S3持续获取自动导引车的实时定位位置以及车身各部位雷达与障碍物实时距离。接下来可以执行步骤S4根据获取的实时定位位置得到自动导引车的实时实际位置分布范围。接下来可以执行步骤S5根据电子地图获取自动导引车的实时实际位置分布范围内道路及障碍物分布。接下来可以执行步骤S6根据车身各部位雷达与障碍物实时距离以及自动导引车的实时实际位置分布范围内道路及障碍物分布得到自动导引车的实时实际位置。接下来可以执行步骤S7根据自动导引车的实时实际位置以及自动导引车的设定移动轨迹判断自动导引车是否偏离设定移动轨迹超过设定最大偏离距离。若是则接下来可以执行步骤S71判断自动导引车处于不安全状态,若否则接下来可以执行步骤S72判断自动导引车处于安全状态。
请参阅图9所示,如果自动引导车已经发生碰撞,需要避免碰撞的危害扩大化,具体而言可以执行步骤S8根据自动导引车的实时实际位置以及电子地图中障碍物分布判断自动导引车是否发生碰撞。若是则接下来可以执行步骤S81判断所述自动导引车处于不安全状态,若否则接下来可以执行步骤S82判断所述自动导引车处于安全状态。
在通讯硬件上,智能仓库的安全保护主控系统是基于电脑上,实时通过网络接收安装在自动导引车(AGV)上监控控制板发过来的AGV位置信息数据、环境温度信息数据、及AGV状态数据。同时接收雷达通过DTU发送的实时数据。AGV小车定位跟踪保护控制系统是由AGV小车上监控控制板通过SPI接口调用UWB模块(DWM1000)向基点的UWB模块(DWM1000)发送/接受UWB信号,通过记录每个基点发送和接受UWB信号的时间差计算出AGV小车的实时坐标,AGV小车上监控控制板通过IIC接口实时读取温湿度传感器获得仓库的实时环境参数,AGV小车上监控控制板MCU通过UART接口向WIFI模块(ESP8266)发送AGV小车的实时坐标数据及环境参数,WIFI模块(ESP8266)实时将AGV小车的实时坐标数据及环境参数转发给上位PC。各个关键位置的雷达实时把监控的AGV小车的速度和距离实时通过485接口经过数据传输单元DTU发送给上位PC机。
请参阅图3所示,驱动模块11在运行的过程中首先可以执行步骤S011接收自动导引车处于安全状态或不安全状态。若自动导引车处于安全状态,则接下来可以执行步骤S11控制自动导引车继续运行。若自动导引车处于不安全状态,则接下来可以执行步骤S012控制自动导引车停止运行。若无法接收自动导引车处于安全状态或不安全状态,同样控制自动导引车停止运行,因此此时自动导引车处于失控状态,需要避免出现碰撞危险。
请参阅图4所示,报警检修端3在运行的过程中首先可以执行步骤S021接收自动导引车处于安全状态或不安全状态。若自动导引车处于安全状态,则接下来可以执行步骤S022不进行操作。若自动导引车处于不安全状态,则接下来可以执行步骤S023对自动导引车进行检修,避免碰撞后果的扩大化。
请参阅图5所示,由于本方案采用的UWB无线定位方式的精度在10cm-30cm,因此无法直接通过实时定位位置得到自动引导车的可用真实位置,这就需要先得到自动导引车的实时实际位置分布范围。具体而言,上述的步骤S4在具体实施的过程中首先可以执行步骤S41根据自动导引车的实时定位位置以及多个历史时刻的实际位置得到自动导引车在历史时段内多个定位位置和对应的实际位置。接下来可以执行步骤S42将定位位置相对于实际位置的方向均匀划分为多个方位角。接下来可以执行步骤S43获取每个方位角内自动导引车在历史时段内多个定位位置和对应的实际位置。接下来可以执行步骤S44根据每个方位角内自动导引车在历史时段内多个定位位置和对应的实际位置得到每个方位角内定位位置相对于实际位置的距离分布范围。最后可以执行步骤S45将每个方位角内定位位置相对于实际位置的距离分布范围作为自动导引车的实时实际位置分布范围。
为了对上述的步骤S41至步骤S45的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。为了避免涉及商业秘密的数据泄露,对不影响方案实施的部分数据进行脱敏处理,下同。
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<limits>
// 位置结构定义
struct Position {
double x;
double y;
// 计算两个位置之间的距离
double distanceTo(const Position&other) const {
return std::sqrt((x - other.x) * (x - other.x) + (y -other.y) * (y - other.y));
}
};
// 方位角的距离分布范围结构定义
struct AngleDistanceRange {
double angle;
double minDistance;
double maxDistance;
};
// 自动导引车位置的历史记录
class AGVPositionHistory {
private:
// 历史记录,包括定位位置和实际位置
std::vector<std::pair<Position, Position>>historyPositions;
public:
// 添加一个位置记录
void addPositionRecord(const Position&locatedPosition, constPosition&actualPosition) {
historyPositions.push_back({locatedPosition,actualPosition});
}
// 获取指定方位角内的定位位置相对于实际位置的距离分布范围
AngleDistanceRange getDistanceRangeForAngle(double angle) {
AngleDistanceRange range {angle, std::numeric_limits<double>::max(), 0};
for (const auto&record : historyPositions) {
// 计算方位角
double angleOfRecord = std::atan2(record.second.y -record.first.y, record.second.x - record.first.x);
// 如果在指定的方位角范围内
if (std::abs(angleOfRecord - angle)<std::numeric_limits<double>::epsilon()) {
double distance = record.first.distanceTo(record.second);
range.minDistance = std::min(range.minDistance,distance);
range.maxDistance = std::max(range.maxDistance,distance);
}
}
return range;
}
// 获取所有方位角内的距离分布范围,示例方位角以45度为单位划分
std::vector<AngleDistanceRange>getDistanceRanges() {
std::vector<AngleDistanceRange>ranges;
// 从0到360度,每45度为一个方位角
for (double angle = 0; angle<2 * M_PI; angle += M_PI / 4) {
ranges.push_back(getDistanceRangeForAngle(angle));
}
return ranges;
}
};
// 根据历史数据计算AGV的实时实际位置分布范围
std::vector<AngleDistanceRange>calculateRealTimePositionRange(AGVPositionHistory&history) {
return history.getDistanceRanges();
}
// 主函数示例
int main() {
AGVPositionHistory agvHistory;
// 示例添加一些历史定位数据
agvHistory.addPositionRecord({1, 2}, {1.1, 2.1});
agvHistory.addPositionRecord({2, 3}, {2.2, 3.2});
agvHistory.addPositionRecord({3, 4}, {3.3, 4.4});
// ...(可以添加更多历史数据)
// 计算实时实际位置分布范围
auto positionRange = calculateRealTimePositionRange(agvHistory);
// 打印结果
for (const auto&range : positionRange) {
std::cout<<"Angle: "<<range.angle<<" - Min Distance: "<<range.minDistance<<" - Max Distance: "<<range.maxDistance<<std::endl;
}
return 0;
}
以上代码实现了一个简化版本的智能仓库安全保护方法,用于处理自动导引车的实时实际位置分布范围。首先定义了Position结构来存储位置信息,并实现了一个方法来计算两点之间的距离。然后定义了AngleDistanceRange结构来描述不同方位角的最小和最大距离范围。接着创建了AGVPositionHistory类来存储和处理自动导引车的历史定位位置和实际位置的数据。该类包含方法addPositionRecord用于添加位置记录,getDistanceRangeForAngle用于获取特定方位角内距离范围,以及getDistanceRanges用于获取所有方位角的距离分布范围。最后在main函数中根据历史定位数据并调用calculateRealTimePositionRange函数计算并打印出自动导引车的实时实际位置分布范围。
请参阅图6所示,为了计算每个方位角内定位位置相对于实际位置的偏离距离分布,对于每个方位角,上述的步骤S44在具体实施的过程中首先可以执行步骤S441分别获取每个定位位置相对于对应的实际位置的距离作为定位偏差值。接下来可以执行步骤S442将每个定位偏差值按照数值大小进行排列得到定位偏差值数列。接下来可以执行步骤S443计算获取定位偏差值数列内每个定位偏差值与相邻的定位偏差值的差值的均值作为平均间隔值。接下来可以执行步骤S444将定位偏差值数列内与相邻的定位偏差值的差值大于平均间隔值的定位偏差值作为定位偏差值数列内的有效定位偏差值。最后可以执行步骤S445将定位偏差值数列内的有效定位偏差值的分布范围作为定位位置相对于实际位置的距离分布范围。
为了对上述的步骤S441至步骤S445的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
// 定义位置结构体
struct Position {
double x;
double y;
// 计算与另一个位置的距离
double distanceTo(const Position&other) const {
return std::sqrt((x - other.x) * (x - other.x) + (y -other.y) * (y - other.y));
}
};
// 定义方位角范围结构体,用于存储每个方位角内的定位偏差值
struct AngleDeviation {
double angle; // 方位角
std::vector<double>deviations; // 偏差值数组
// 计算有效的定位偏差值的分布范围
void calculateEffectiveDeviationRange() {
if (deviations.empty()) return;
// 将偏差值排序
std::sort(deviations.begin(), deviations.end());
// 计算相邻偏差值的差的均值作为平均间隔值
double totalInterval = 0.0;
for (size_t i = 1; i<deviations.size(); ++i) {
totalInterval += deviations[i] - deviations[i - 1];
}
double averageInterval = totalInterval / (deviations.size() -1);
// 筛选出大于平均间隔值的有效偏差值
std::vector<double>effectiveDeviations;
for (size_t i = 1; i<deviations.size(); ++i) {
if (deviations[i] - deviations[i - 1]>averageInterval) {
effectiveDeviations.push_back(deviations[i - 1]);
}
}
// 添加最后一个偏差值,因为它总是有效的
effectiveDeviations.push_back(deviations.back());
// 更新偏差值数组为有效的偏差值
deviations = effectiveDeviations;
}
// 获取有效偏差值的最小和最大值作为范围
std::pair<double, double>getEffectiveDeviationRange() const {
if (deviations.empty()) return {0, 0};
double minDeviation = deviations.front();
double maxDeviation = deviations.back();
return {minDeviation, maxDeviation};
}
};
// 主函数
int main() {
// 示例:AGV历史定位数据和对应的实际位置
std::vector<std::pair<Position, Position>>historyData = {
{{1, 2}, {1.1, 2.1}},
{{2, 3}, {2.2, 3.3}},
{{3, 4}, {3.3, 4.4}},
// ... 可以添加更多历史数据
};
// 示例按照每45度一个方位角来划分
std::vector<AngleDeviation>angleDeviations(8); // 360度分为8个方位角
// 初始化方位角的值
for (int i = 0; i<8; ++i) {
angleDeviations[i].angle = i * M_PI / 4; // 0, 45, 90, ...,315 度
}
// 计算每个方位角内的定位偏差值
for (const auto&record : historyData) {
Position located = record.first;
Position actual = record.second;
double deviation = located.distanceTo(actual); // 计算偏差值
double angle = std::atan2(actual.y - located.y, actual.x -located.x); // 计算方位角
// 将偏差值分配到最近的方位角
int index = static_cast<int>(std::round(angle / (M_PI / 4)))% 8;
angleDeviations[index].deviations.push_back(deviation);
}
// 计算每个方位角内的有效定位偏差值的分布范围
for (AngleDeviation&ad : angleDeviations) {
ad.calculateEffectiveDeviationRange();
}
// 输出每个方位角内有效定位偏差值的分布范围
for (const AngleDeviation&ad : angleDeviations) {
auto range = ad.getEffectiveDeviationRange();
std::cout<<"Angle: "<<ad.angle * (180 / M_PI)<<" degrees"
<<", Min Deviation: "<<range.first
<<", Max Deviation: "<<range.second<<std::endl;
}
return 0;
}
这段代码演示了如何计算自动导引车(AGV)在不同方位角内定位位置相对于实际位置的距离分布范围。首先定义了一个Position结构来存储位置,并能计算两点之间的距离。接着定义了AngleDeviation结构来存储特定方位角内的定位偏差值,并实现了计算有效偏差值范围的方法。在main函数中模拟了一组历史定位数据,并计算了每个方位角内的定位偏差值。然后对每个方位角内的定位偏差值进行排序和筛选,得到有效的偏差值,并计算其最小和最大值作为范围。最后输出每个方位角内有效定位偏差值的范围。这个分布范围可用于评估AGV的定位系统性能,以及进一步计算定位准确度和风险评估。
请参阅图7所示,由于自动导引车处于不同位置,车身上的雷达与障碍物的距离也会不同,可以据此对自动导引车的实时实际位置进行校正。具体而言,上述的步骤S6在具体实施的过程中首先可以执行步骤S61将自动导引车的实时实际位置分布范围进行网格化。接下来可以执行步骤S62依次在每个网格内抽取位置点。接下来可以执行步骤S63验证自动导引车位于位置点时,车身各部位雷达与障碍物实时距离是否符合位置点处道路及障碍物分布。若符合则接下来可以执行步骤S64保留位置点和对应的网格,若不符合则接下来可以执行步骤S65反之。接下来可以执行步骤S66在对全部的位置点进行验证之后,判断保留下来的位置点的数量是否为1个。若是则接下来可以执行步骤S67将位置点作为自动导引车的实时实际位置,若否则接下来可以执行步骤S68根据位置点和对应的网格得到自动导引车的实时实际位置。
为了对上述的步骤S61至步骤S68的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
// 定义位置结构体
struct Position {
double x;
double y;
};
// 障碍物结构体
struct Obstacle {
Position center; // 障碍物中心位置
double radius; // 障碍物半径
};
// 定义区域网格,用于确定车辆可能的位置
struct Grid {
Position topLeft; // 网格的左上角位置
Position bottomRight; // 网格的右下角位置
// 检查一个点是否在这个网格内
bool contains(const Position&point) const {
return point.x>= topLeft.x&&point.x<= bottomRight.x&&
point.y<= topLeft.y&&point.y>= bottomRight.y;
}
};
// 模拟自动导引车(AGV)的实时数据
struct AGVRealTimeData {
std::vector<double>radarDistances; // 车身各部位雷达与障碍物的实时距离
Position estimatedPosition; // 自动导引车的估计位置
};
// 模拟智能仓库环境
class SmartWarehouse {
private:
std::vector<Obstacle>obstacles; // 仓库中的障碍物列表
Grid grid; // 用于定位的区域网格
public:
SmartWarehouse(const std::vector<Obstacle>&obs, const Grid&g) :obstacles(obs), grid(g) {}
// 检查AGV的雷达数据是否与某个位置的障碍物分布相符
bool validatePositionWithRadarData(const AGVRealTimeData&agvData,const Position&point) {
for (size_t i = 0; i<agvData.radarDistances.size(); ++i) {
// 这里简化处理,示例雷达是均匀分布在AGV周围
double angle = 2 * M_PI * i / agvData.radarDistances.size();
Position radarPosition = {
agvData.estimatedPosition.x + agvData.radarDistances[i] * cos(angle),
agvData.estimatedPosition.y + agvData.radarDistances[i] * sin(angle)
};
// 检查雷达位置是否与任何障碍物碰撞
for (const auto&obstacle : obstacles) {
double distanceToObstacle = std::hypot(radarPosition.x - obstacle.center.x, radarPosition.y - obstacle.center.y);
if (distanceToObstacle<= obstacle.radius) {
return false; // 雷达数据与障碍物分布不符合
}
}
}
return true; // 雷达数据与障碍物分布符合
}
// 网格化区域并验证AGV的位置
std::vector<Position>validateAGVPosition(const AGVRealTimeData&agvData) {
std::vector<Position>validPositions;
// 网格化步进尺寸
const double stepSize = 0.1; // 示例网格步进为0.1米
for (double x = grid.topLeft.x; x<= grid.bottomRight.x; x +=stepSize) {
for (double y = grid.bottomRight.y; y<= grid.topLeft.y; y+= stepSize) {
Position currentPoint = {x, y};
if (validatePositionWithRadarData(agvData,currentPoint)) {
validPositions.push_back(currentPoint);
}
}
}
return validPositions;
}
};
int main() {
// 创建一些障碍物和网格
std::vector<Obstacle>obstacles = {
{{5, 5}, 1}, // 障碍物1
{{10, 10}, 2} // 障碍物2 等等
};
Grid grid = {{0, 10}, {20, 0}}; // 定义一个网格区域
// 创建智能仓库环境
SmartWarehouse warehouse(obstacles, grid);
// 创建AGV实时数据
AGVRealTimeData agvData = {
{
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<cassert>
// 定义位置结构体
struct Position {
double x;
double y;
};
// 障碍物结构体
struct Obstacle {
Position position; // 障碍物的位置
double radius; // 障碍物的半径
};
// 定义网格结构体,用于表示实时实际位置分布范围
struct Grid {
Position center; // 网格中心位置
double size; // 网格的尺寸
};
// 模拟雷达检测结构体,存储雷达距离和角度
struct RadarDetection {
double distance; // 雷达与障碍物的距离
double angle; // 雷达方向的角度(相对于车身的正前方)
};
// 检测点是否在障碍物内
bool isInObstacle(const Position&point, const Obstacle&obstacle) {
double dist = std::hypot(point.x - obstacle.position.x, point.y -obstacle.position.y);
return dist<obstacle.radius;
}
// 检查AGV雷达数据是否与某点的障碍物分布一致
bool checkRadarConsistency(const std::vector<RadarDetection>&radarDetections, const Position&point, const std::vector<Obstacle>&obstacles){
for (const RadarDetection&detection : radarDetections) {
// 计算雷达探测点的位置
Position detectionPoint = {
point.x + detection.distance * std::cos(detection.angle),
point.y + detection.distance * std::sin(detection.angle)
};
// 检查探测点是否在任意障碍物内
for (const Obstacle&obstacle : obstacles) {
if (isInObstacle(detectionPoint, obstacle)) {
return false; // 若探测点在障碍物内,则不一致
}
}
}
return true; // 所有探测点都不在障碍物内,说明一致
}
// 主函数
int main() {
// 网格化范围(这里简化为一个网格)
Grid grid = {{5, 5}, 10};
// 障碍物列表
std::vector<Obstacle>obstacles = {
{{2, 3}, 1},
{{8, 8}, 1}
// ... 可以添加更多障碍物
};
// 雷达检测数据(这里示例有4个雷达,分别位于AGV的前、后、左、右)
std::vector<RadarDetection>radarDetections = {
{2.5, 0}, // 前方2.5米
{3.0, M_PI}, // 后方3米
{2.0, M_PI/2}, // 左侧2米
{2.0, -M_PI/2} // 右侧2米
};
// 示例的AGV实时估计位置
Position agvEstimatedPosition = {5, 5};
// 网格中心的实际位置
Position agvActualPosition = {0, 0};
bool positionFound = false;
// 网格化搜索,这里简化为以网格中心为唯一搜索点
if (checkRadarConsistency(radarDetections, grid.center,obstacles)) {
agvActualPosition = grid.center;
positionFound = true;
}
// 输出结果
if (positionFound) {
std::cout<<"AGV的实时实际位置已确定: ("<<agvActualPosition.x<<", "<<agvActualPosition.y<<")"<<std::endl;
} else {
std::cout<<"AGV的实时实际位置无法确定,需要更多数据。"<<std::endl;
}
return 0;
}
请参阅图8所示,雷达距离验证筛选后的位置点可能会不止一个,为了筛选出更有可能是实际位置的位置点,上述的步骤S68在具体实施的过程中首先可以执行步骤S681将相邻的若干个网格划入同一个网格组。接下来可以执行步骤S682将包含网格数量最多的网格组作为目标网格组。接下来可以执行步骤S683计算获取目标网格组内全部网格对应的位置点的均值位置。接下来可以执行步骤S684判断均值位置是否落入目标网格组的范围内。若是则接下来可以执行步骤S685将均值位置作为自动导引车的实时实际位置,若否则接下来可以执行步骤S686将目标网格组内全部网格对应的位置点中距离均值位置最近的位置点作为自动导引车的实时实际位置。
为了对上述的步骤S681至步骤S686的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
// 定义位置结构体
struct Position {
double x;
double y;
};
// 计算两个位置点的距离
double distance(const Position&p1, const Position&p2) {
return std::sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) *(p1.y - p2.y));
}
// 定义网格结构体
struct Grid {
Position center; // 网格中心点
double size; // 示例网格是正方形,size是边长
};
// 定义网格组结构体
struct GridGroup {
std::vector<Position>points; // 网格组内的所有位置点
};
// 根据网格组计算均值位置
Position calculateMeanPosition(const GridGroup&group) {
double sumX = 0.0, sumY = 0.0;
for (const auto&point : group.points) {
sumX += point.x;
sumY += point.y;
}
return {sumX / group.points.size(), sumY / group.points.size()};
}
// 主函数
int main() {
// 网格组的示例数据
std::vector<GridGroup>gridGroups;
// 示例有一些网格组和他们的位置点
// 这里只是示例数据,实际应用中需要根据AGV的实际情况来获取这些数据
gridGroups.push_back({{{1, 1}, {1.5, 1.5}, {2, 2}}});
gridGroups.push_back({{{3, 3}, {3.5, 3.5}, {4, 4}, {4.5, 4.5}}});
// 找到包含位置点最多的网格组
auto targetGroupIt = std::max_element(gridGroups.begin(),gridGroups.end(),
[](const GridGroup&a, const GridGroup&b) {
return a.points.size()<b.points.size();
}
); // 计算目标网格组内所有位置点的均值位置
Position meanPosition = calculateMeanPosition(*targetGroupIt);
// 示例目标网格组的大小
double gridSize = 1.0; // 以1为网格大小
Position agvRealTimePosition;
bool foundExactPosition = false;
// 检查均值位置是否在目标网格组内的任意网格范围内
for (const auto&point : targetGroupIt->points) {
if (distance(point, meanPosition)<= (gridSize / std::sqrt(2.0))) {
agvRealTimePosition = meanPosition;
foundExactPosition = true;
break;
}
}
// 若均值位置不在网格内,则选择最近的位置点
if (!foundExactPosition) {
double minDistance = std::numeric_limits<double>::infinity();
for (const auto&point : targetGroupIt->points) {
double currentDistance = distance(meanPosition, point);
if (currentDistance<minDistance) {
minDistance = currentDistance;
agvRealTimePosition = point;
}
}
}
// 输出自动导引车的实时实际位置
std::cout<<"AGV的实时实际位置为: x = "<<agvRealTimePosition.x<<",y = "<<agvRealTimePosition.y<<std::endl;
return 0;
}
在这段代码中首先定义了表示位置和网格的结构体,然后定义了一个网格组结构体,用于存储网格内的所有位置点。为网格组计算均值位置,然后找到包含位置点最多的网格组,计算该组内所有位置点的均值位置。接着检查均值位置是否在目标网格组的范围内。如果均值位置在目标网格组内,则认为这个均值位置是自动导引车的实时实际位置,如果不在则将目标网格组内全部网格对应的位置点中距离均值位置最近的位置点作为实际位置。
附图中的流程图和框图显示了根据本申请的多个实施例的装置、系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。
也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行相应的功能或动作的硬件,例如电路或ASIC(专用集成电路,Application Specific Integrated Circuit)来实现,或者可以用硬件和软件的组合,如固件等来实现。
尽管在此结合各实施例对本发明进行了描述,然而,在实施所要求保护的本发明过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
以上已经描述了本申请的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

Claims (9)

1.一种智能仓库的安全保护方法,其特征在于,包括,
获取仓库内的道路及障碍物分布的电子地图;
获取自动导引车的设定移动轨迹以及设定最大偏离距离;
持续获取自动导引车的实时定位位置以及车身各部位雷达与障碍物实时距离;
根据获取的实时定位位置得到所述自动导引车的实时实际位置分布范围;
根据所述电子地图获取所述自动导引车的实时实际位置分布范围内道路及障碍物分布;
根据车身各部位雷达与障碍物实时距离以及所述自动导引车的实时实际位置分布范围内道路及障碍物分布得到所述自动导引车的实时实际位置;
根据所述自动导引车的实时实际位置以及所述自动导引车的设定移动轨迹判断所述自动导引车是否偏离设定移动轨迹超过设定最大偏离距离;
若是,则判断所述自动导引车处于不安全状态;
若否,则判断所述自动导引车处于安全状态;
其中,
所述根据车身各部位雷达与障碍物实时距离以及所述自动导引车的实时实际位置分布范围内道路及障碍物分布得到所述自动导引车的实时实际位置的步骤,包括,
将所述自动导引车的实时实际位置分布范围进行网格化;
依次在每个网格内抽取位置点;
验证所述自动导引车位于所述位置点时,车身各部位雷达与障碍物实时距离是否符合所述位置点处道路及障碍物分布;
若符合,则保留所述位置点和对应的网格;
若不符合,则反之;
在对全部的所述位置点进行验证之后,判断保留下来的所述位置点的数量是否为1个;
若是,则将所述位置点作为所述自动导引车的实时实际位置;
若否,则根据所述位置点和对应的网格得到所述自动导引车的实时实际位置。
2.根据权利要求1所述的方法,其特征在于,所述根据获取的实时定位位置得到所述自动导引车的实时实际位置分布范围的步骤,包括,
根据自动导引车的实时定位位置以及多个历史时刻的实际位置得到所述自动导引车在历史时段内多个定位位置和对应的实际位置;
将定位位置相对于实际位置的方向均匀划分为多个方位角;
获取每个方位角内所述自动导引车在历史时段内多个定位位置和对应的实际位置;
根据每个方位角内所述自动导引车在历史时段内多个定位位置和对应的实际位置得到每个方位角内定位位置相对于实际位置的距离分布范围;
将每个方位角内定位位置相对于实际位置的距离分布范围作为所述自动导引车的实时实际位置分布范围。
3.根据权利要求2所述的方法,其特征在于,所述根据每个方位角内所述自动导引车在历史时段内多个定位位置和对应的实际位置得到每个方位角内定位位置相对于实际位置的距离分布范围的步骤,包括,
在每个方位角内,
分别获取每个定位位置相对于对应的实际位置的距离作为定位偏差值,
将每个所述定位偏差值按照数值大小进行排列得到定位偏差值数列,
计算获取定位偏差值数列内每个所述定位偏差值与相邻的所述定位偏差值的相减差的均值作为平均间隔值;
将定位偏差值数列内与相邻的所述定位偏差值的相减差大于所述平均间隔值的所述定位偏差值作为定位偏差值数列内的有效定位偏差值;
将定位偏差值数列内的有效定位偏差值的分布范围作为定位位置相对于实际位置的距离分布范围。
4.根据权利要求1所述的方法,其特征在于,所述根据所述位置点和对应的网格得到所述自动导引车的实时实际位置的步骤,包括,
将相邻的若干个网格划入同一个网格组;
将包含网格数量最多的网格组作为目标网格组;
计算获取所述目标网格组内全部网格对应的所述位置点的均值位置;
判断所述均值位置是否落入所述目标网格组的范围内;
若是,则将所述均值位置作为所述自动导引车的实时实际位置;
若否,则将所述目标网格组内全部网格对应的所述位置点中距离所述均值位置最近的所述位置点作为所述自动导引车的实时实际位置。
5.根据权利要求1所述的方法,其特征在于,还包括,
根据所述自动导引车的实时实际位置以及电子地图中障碍物分布判断所述自动导引车是否发生碰撞;
若是,则判断所述自动导引车处于不安全状态;
若否,则判断所述自动导引车处于安全状态。
6.一种智能仓库的安全保护方法,其特征在于,包括,
接收权利要求1至5任一项所述的一种智能仓库的安全保护方法中的自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则控制所述自动导引车继续运行;
若所述自动导引车处于不安全状态,则控制所述自动导引车停止运行。
7.根据权利要求6所述的方法,其特征在于,还包括,
若无法接收所述自动导引车处于安全状态或不安全状态,则控制所述自动导引车停止运行。
8.一种智能仓库的安全保护方法,其特征在于,包括,
接收权利要求1至5任一项所述的一种智能仓库的安全保护方法中的自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则不进行操作;
若所述自动导引车处于不安全状态,则对所述自动导引车进行检修。
9.一种智能仓库的安全保护系统,其特征在于,包括,
自动导引车,包括驱动模块、定位通讯模块以及雷达;其中所述驱动模块用于驱动所述自动导引车行驶移动,所述定位通讯模块用于获取并发送实时定位位置以及车身各部位雷达与障碍物实时距离;
安全保护控制端,用于获取仓库内的道路及障碍物分布的电子地图;
获取自动导引车的设定移动轨迹以及设定最大偏离距离;
持续获取自动导引车的实时定位位置以及车身各部位雷达与障碍物实时距离;
根据获取的实时定位位置得到所述自动导引车的实时实际位置分布范围;
根据所述电子地图获取所述自动导引车的实时实际位置分布范围内道路及障碍物分布;
根据车身各部位雷达与障碍物实时距离以及所述自动导引车的实时实际位置分布范围内道路及障碍物分布得到所述自动导引车的实时实际位置;
根据所述自动导引车的实时实际位置以及所述自动导引车的设定移动轨迹判断所述自动导引车是否偏离设定移动轨迹超过设定最大偏离距离;
若是,则判断所述自动导引车处于不安全状态;
若否,则判断所述自动导引车处于安全状态;
报警检修端,用于接收自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则不进行操作;
若所述自动导引车处于不安全状态,则对所述自动导引车进行检修;
其中,所述驱动模块还用于接收所述自动导引车处于安全状态或不安全状态;
若所述自动导引车处于安全状态,则控制所述自动导引车继续运行;
若所述自动导引车处于不安全状态,则控制所述自动导引车停止运行;
其中,
所述根据车身各部位雷达与障碍物实时距离以及所述自动导引车的实时实际位置分布范围内道路及障碍物分布得到所述自动导引车的实时实际位置的步骤,包括,
将所述自动导引车的实时实际位置分布范围进行网格化;
依次在每个网格内抽取位置点;
验证所述自动导引车位于所述位置点时,车身各部位雷达与障碍物实时距离是否符合所述位置点处道路及障碍物分布;
若符合,则保留所述位置点和对应的网格;
若不符合,则反之;
在对全部的所述位置点进行验证之后,判断保留下来的所述位置点的数量是否为1个;
若是,则将所述位置点作为所述自动导引车的实时实际位置;
若否,则根据所述位置点和对应的网格得到所述自动导引车的实时实际位置。
CN202410474562.3A 2024-04-19 一种智能仓库的安全保护系统和方法 Active CN118092455B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410474562.3A CN118092455B (zh) 2024-04-19 一种智能仓库的安全保护系统和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410474562.3A CN118092455B (zh) 2024-04-19 一种智能仓库的安全保护系统和方法

Publications (2)

Publication Number Publication Date
CN118092455A CN118092455A (zh) 2024-05-28
CN118092455B true CN118092455B (zh) 2024-07-02

Family

ID=

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107632601A (zh) * 2017-08-07 2018-01-26 上海斐讯数据通信技术有限公司 一种无轨智能导引装置、系统及方法
CN113848910A (zh) * 2021-09-27 2021-12-28 东风本田发动机有限公司 导航系统、导航控制方法及装置、控制器、agv小车

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107632601A (zh) * 2017-08-07 2018-01-26 上海斐讯数据通信技术有限公司 一种无轨智能导引装置、系统及方法
CN113848910A (zh) * 2021-09-27 2021-12-28 东风本田发动机有限公司 导航系统、导航控制方法及装置、控制器、agv小车

Similar Documents

Publication Publication Date Title
US9563808B2 (en) Target grouping techniques for object fusion
US8558679B2 (en) Method of analyzing the surroundings of a vehicle
CN109927719A (zh) 一种基于障碍物轨迹预测的辅助驾驶方法和系统
Moras et al. Moving objects detection by conflict analysis in evidential grids
US20150112570A1 (en) Confidence estimation for predictive driver assistance systems based on plausibility rules
CN107406073B (zh) 用于在无碰撞性方面监视要由车辆驶过的额定轨迹的方法和设备
CN107918758A (zh) 能够进行环境情景分析的车辆
US20200139975A1 (en) Moving body behavior prediction device
CN105785370A (zh) 物体检测装置和物体检测方法
US20090303234A1 (en) Method for object formation
CN105699964A (zh) 一种基于汽车防撞雷达的道路多目标跟踪方法
KR20160071162A (ko) 라이다를 이용한 멀티 오브젝트 추적 장치 및 그 방법
US10095238B2 (en) Autonomous vehicle object detection
CN109814113B (zh) 一种超声波雷达障碍物检测结果处理方法及系统
CN113223326A (zh) 基于路侧的多车多控多源低速辅助停车系统
CN113581181B (zh) 智能车辆超车轨迹的规划方法
CN113933858A (zh) 定位传感器的异常检测方法、装置及终端设备
CN116872921A (zh) 一种车辆规避风险方法、系统、车辆及存储介质
CN114647246A (zh) 一种时间空间耦合搜索的局部路径规划方法及系统
CN118092455B (zh) 一种智能仓库的安全保护系统和方法
CN110843767A (zh) 一种基于样条理论的自动入库泊车方法及系统
KR20210025613A (ko) 자동차용 레이더 센서를 이용한 정적 레이더 표적들의 검출 방법
CN118092455A (zh) 一种智能仓库的安全保护系统和方法
CN115123897B (zh) 对象检测方法、装置及设备
US11169259B2 (en) Method and surroundings detection device for determining the presence and/or properties of one or multiple objects in the surroundings of a motor vehicle

Legal Events

Date Code Title Description
PB01 Publication
SE01 Entry into force of request for substantive examination
GR01 Patent grant