Geofencing — حصار جغرافیایی دیجیتال
Geofencing یعنی تعریف یک منطقه جغرافیایی (با مختصات GPS) و تعیین قانون برای رفتار UGV وقتی از آن منطقه خارج میشود — مثلاً توقف، بازگشت به خانه، یا ارسال هشدار. کاربردها: کشاورزی دقیق (UGV فقط در مزرعه خودت بماند)، تحویل ربات (فقط در محوطه مجاز)، و ایمنی عمومی.
الگوریتم Ray Casting (Point-in-Polygon) تعیین میکند آیا نقطه فعلی GPS داخل چند ضلعی تعریفشده است یا خارج — روشی ساده و کارآمد حتی برای آردوینو.
الگوریتم Ray Casting — کد آردوینو
#include <TinyGPS++.h>
// ===== تعریف مرز Geofence (چند ضلعی ۴ گوشه — مثال) =====
const int NUM_VERTS = 4;
double fenceLat[] = {35.7120, 35.7135, 35.7135, 35.7120};
double fenceLng[] = {51.4050, 51.4050, 51.4070, 51.4070};
bool pointInPolygon(double lat, double lng){
bool inside = false;
for(int i=0, j=NUM_VERTS-1; ilat) != (fenceLat[j]>lat)) &&
(lng < (fenceLng[j]-fenceLng[i])*(lat-fenceLat[i])/(fenceLat[j]-fenceLat[i])+fenceLng[i])){
inside = !inside;
}
}
return inside;
}
TinyGPSPlus gps;
void loop(){
while(Serial1.available()) gps.encode(Serial1.read());
if(gps.location.isValid()){
bool safe = pointInPolygon(gps.location.lat(), gps.location.lng());
if(!safe){
// مرز نقض شد!
stopMotors();
sendLoRaAlert("GEOFENCE BREACH!");
}
}
}
void stopMotors(){
analogWrite(ENA, 0); analogWrite(ENB, 0);
}
void sendLoRaAlert(String msg){
LoRa.beginPacket();
LoRa.print(msg);
LoRa.endPacket();
}
تعریف مرز از Google Earth
- در Google Earth Pro روی محدوده مورد نظر یک Polygon بکش.
- کلیکراست → Properties → Coordinates را کپی کن.
- مقادیر lat/lng را در آرایههای fenceLat و fenceLng قرار بده.
- دقت GPS ~۲.۵m است — مرز را حداقل ۱۰m از موانع واقعی دورتر تعریف کن.
جدول رفتار در نقض مرز
| سناریو | رفتار توصیهشده |
|---|---|
| نزدیک مرز (۵m) | کاهش سرعت به ۵۰٪ |
| روی مرز | توقف کامل |
| خارج از مرز | توقف + هشدار LoRa + بازگشت به خانه |