ROS2 üzerinde çalışan, GPS, Lidar ve IMU verilerini kullanarak otonom navigasyon sağlayan bir Python paketidir. Araç, belirlenen hedefler arasında, engel algılama ve kaçınma özellikleriyle, Ackermann direksiyon modeliyle hareket eder.
- Çoklu Hedef Noktası: Araç, önceden tanımlanmış GPS tabanlı hedef konumlar arasında otomatik olarak hareket eder.
- Lidar Tabanlı Engel Algılama ve Kaçınma: Lidar verisiyle önündeki engelleri algılar, gerekirse dairesel manevra ile engelden kaçınır.
- IMU ve Odometri: Araç konumu ve yönelimi için IMU ve odometri verilerini kullanır.
- Beklemeli Navigasyon: Belirli hedeflere ulaşıldığında araç, tanımlı bir süre bekleyerek navigasyona devam eder.
- Ackermann Direksiyon Modeli: Gerçekçi araç hareketleri için Ackermann kinematiği ile hız ve yön kontrolü sağlar.
- kontrol.py
Tüm navigasyon mantığını içeren ana Python scriptidir.
Temel sınıf:AckermannSteering
- Hedef listesi ve oryantasyonlar
- Lidar ve odometri abonelikleri
- Engel algılama, kaçınma algoritması, hedefe ilerleme
- Belirli hedeflerde bekleme ve navigasyona devam etme
- Hareket komutlarını cmd_vel üzerinden yayınlama
- ROS2 ve Python 3.8+ kurulu olmalıdır.
- Bağımlılıklar:
pip install rclpy geometry_msgs nav_msgs sensor_msgs
- Python dosyasını ROS2 workspace'inizde uygun bir pakete ekleyin.
Terminalde aşağıdaki gibi başlatabilirsiniz:
ros2 run <paket_adı> kontrol.py
veya doğrudan:
python3 kontrol.py
Not: Lidar (
/scan
), Odometri (/odom
) ve IMU topic'leri uygun şekilde eşlenmiş olmalıdır.
- Hedeflere sırasıyla gidilir.
- Engel algılandığında 10 saniye boyunca dairesel hareketle kaçınma uygulanır.
- Engel yoksa hedefe yönelme ve pozisyon/oryantasyon kontrolü yapılır.
- Bazı hedeflerde (örn. 10. ve 22. nokta) araç 30 saniye bekler ve sonra devam eder.
- Tüm hedeflere ulaşıldığında "All goals reached!" mesajı yayınlanır.
Engel Algılama:
def is_obstacle_detected(self):
front_ranges = self.laser_data[len(self.laser_data)//2 - 15 : len(self.laser_data)//2 + 15]
min_distance = min(front_ranges)
return min_distance < 8.0
Hedefe Hareket:
def move_to_goal(self):
# ... mesafe ve açı hesabı
if distance > 1.75:
cmd_msg.linear.x = 2.0
cmd_msg.angular.z = 0.2 * angular_error
self.publisher_.publish(cmd_msg)
else:
self.stop_robot()
# hedefe ulaştıktan sonra bekleme veya sıradaki hedefe geçiş
Pull request ve issue açarak katkıda bulunabilirsiniz.
Proje sahibi: Mertsr