Robot kol mantığı, her eklemi ayrı bir hareket birimi olarak tanımlayıp hedef hareketi küçük ve sıralı adımlara bölerek kurulur.
Bir robot kolun nesneyi alması ya da bırakması, tek bir servo komutundan ibaret değildir. Tabanın yön değiştirmesi, ana kolun yüksekliği ayarlaması, bileğin ucu doğru açıya getirmesi ve kavrayıcının açılıp kapanması, birbirini takip eden durum değişimleridir.
Robot kol mantığı hareketi küçük adımlara bölmektir
Robot kol hareket planında her eklemin ayrı bir görevi vardır. Taban, kolun sağa veya sola yönelmesini sağlar. Ana kol, kavrayıcının hedef yüksekliğe yaklaşmasına yardım eder. Bilek, kavrayıcının nesneye uygun açıyla yaklaşmasını düzenler. Kavrayıcı ise nesneyi tutma ve serbest bırakma işini üstlenir.
Bu parçaları aynı anda rastgele hareket ettirmek yerine, hedefi aşamalara ayırmak daha kontrollü bir yöntemdir. Örneğin bir nesneyi almak için kol önce güvenli bir yüksekliğe gelebilir, ardından taban hedefe dönebilir, ana kol aşağı inebilir, bilek açısı düzeltilebilir ve son olarak kavrayıcı kapanabilir. Nesne tutulduktan sonra kolun yeniden yükselmesi, taşırken zemine veya kendi parçalarına çarpma riskini azaltmaya yardımcı olabilir.
Servo listesinden önce hareket planı yazın
Koda servo numaralarını veya açılarını eklemeden önce kısa bir hareket planı hazırlayın. Bu plan, hangi eklemin ne zaman ve hangi amaçla hareket edeceğini görünür hâle getirir. Başlangıç için aşağıdaki çerçeve yeterlidir:
- Başlangıç duruşunu tanımlayın.
- Hedef nesnenin yönünü ve yüksekliğini belirleyin.
- Kolun hedefe güvenli yaklaşma sırasını yazın.
- Kavrayıcının açılacağı ve kapanacağı anı ayırın.
- Nesne tutulduktan sonraki taşıma ve bırakma adımlarını ekleyin.
Açı değerleri mekanik tasarıma göre değişir. Örneğin bir projede tabanın 90 derece konumu ileri yönü gösterebilirken, başka bir projede aynı yön farklı bir açıya karşılık gelebilir. Bu nedenle açıları sabit kural olarak değil, kendi robot kolunuzda test ederek ayarlamanız gereken başlangıç değerleri olarak ele alın.
Servo sırası ile fiziksel hareket sırasını ayırın
Koddaki servo listesi, genellikle bağlantı ve kontrol düzenini temsil eder. Örneğin ilk tanımlanan servo tabana, ikinci servo ana kola bağlanmış olabilir. Ancak bu liste sırası, robot kolun fiziksel olarak mutlaka önce tabanı, sonra ana kolu hareket ettireceği anlamına gelmez.
Fiziksel hareket sırası; nesnenin bulunduğu konuma, kolun geometrisine, eklemlerin erişebildiği açılara ve olası çarpışmalara göre belirlenir. Bazı hareketlerde önce ana kolu yükseltmek, ardından tabanı çevirmek daha güvenli olabilir. Başka bir konumda ise tabanın önce dönmesi gerekebilir. Servo eşlemesi ve güvenli hareket dizisi her robot kol tasarımında farklı olabilir.
| Servo adı | Mekanik görevi | Hareket planındaki görevi |
|---|---|---|
| Taban servosu | Kolun yatay yönde dönmesini sağlar. | Kolun hedef nesnenin yönüne bakmasını sağlar. |
| Ana kol servosu | Kolun yukarı ve aşağı hareketini kontrol eder. | Hedef yüksekliğe yaklaşma ve yükü kaldırma adımında kullanılır. |
| Bilek servosu | Kavrayıcının açısını düzenler. | Nesneye uygun yaklaşma açısını oluşturur. |
| Kavrayıcı servosu | Kavrayıcıyı açar ve kapatır. | Nesneyi alma veya bırakma anını yönetir. |
Bu ayrımı kurduğunuzda, kod içindeki servo adları düzenli kalırken hareket planını ihtiyaca göre değiştirebilirsiniz. Böylece bir sorun oluştuğunda tüm sistemi değiştirmek yerine, hangi adımın hangi eklemle ilişkili olduğunu daha kolay inceleyebilirsiniz.
Hareketten önce başlangıç ve güvenlik kontrolü yapın
Robot kolun hareket planı, servolara komut göndermeden önce tanımlanan güvenli sınırlar üzerine kurulmalıdır. Her eklem için bir başlangıç konumu, ulaşılmak istenen hedef konum ve bu ikisi arasında kullanılabilecek açı aralığı belirlemek, rastgele hareketlerden kaynaklanabilecek mekanik zorlanmaları azaltmaya yardımcı olur.
Servo listesi hazırlamadan önce şu karar çerçevesini uygulayabilirsin:
- Her eklemin kol ilk açıldığında duracağı başlangıç açısını belirle.
- Eklem hareket ederken mekanik olarak ulaşabildiği sınırları gözlemle. Servo fiziksel sınıra dayanıyorsa yazılımdaki açı aralığını daha dar tut.
- Kol parçalarının, masa yüzeyinin veya taşınan nesnenin çarpışabileceği pozisyonları ayır ve bu konumları hareket planından çıkar.
- Hedef açıya tek komutla geçmek yerine ara geçiş adımları tanımla. Örneğin taban dönmeden önce omzu yükseltmek, kolun zemine sürtmesini önleyebilir.
- Hareket başlamadan önce kavrayıcının açık mı kapalı mı olması gerektiğini kontrol et.
Örneğin bir omuz eklemi için başlangıç açısı 90 derece, güvenli çalışma aralığı 40-140 derece olarak seçilebilir. Ancak bu değerler yalnızca örnektir. Servo yönü, kol uzunluğu, bağlantı noktaları ve kullanılan mekanik tasarım değiştiği için açıları kendi robot kolunda yeniden ayarlaman gerekir.
Kontrollü geçiş, yalnızca daha yavaş hareket etmek anlamına gelmez. Asıl amaç, hareketlerin birbirini güvenli biçimde hazırlamasıdır. Önce kavrayıcıyı açmak, sonra kolu nesnenin üstüne taşımak, ardından aşağı inmek gibi bir sıra; her eklemin bulunduğu konumu dikkate alan daha düzenli bir plan oluşturur.
Kavrayıcı durumunu ayrı bir değişken olarak yönetin
Kavrayıcı açık veya kapalı konumda olabilir, fakat bu bilgi yalnızca servo açısı değildir. Hareket planının sonraki adımını belirleyen bir durum bilgisidir. Örneğin kavrayıcı kapalıyken kol nesne taşıyor olabilir; bu durumda kolun doğrudan başlangıç konumuna dönmesi yerine önce bırakma noktasına gitmesi gerekir.
Kavrayıcı durumunu ayrı bir değişkende tutmak, aynı komutun gereksiz yere tekrar gönderilmesini de önler. Aşağıdaki örnekte servo sürme ayrıntısı ayrı bir fonksiyona bırakılmıştır:
enum class GripState {
Open,
Closed
};
const int GRIPPER_SERVO = 4;
const int OPEN_ANGLE = 70;
const int CLOSED_ANGLE = 25;
GripState gripperState = GripState::Open;
void moveServoTo(int servoNumber, int angle) {
// Kullandığın servo kütüphanesi veya sürücüsüyle
// hareket komutunu burada gönder.
}
void setGripper(GripState targetState) {
if (targetState == gripperState) {
return;
}
int targetAngle = targetState == GripState::Open
? OPEN_ANGLE
: CLOSED_ANGLE;
moveServoTo(GRIPPER_SERVO, targetAngle);
gripperState = targetState;
}
Bu kodda setGripper(GripState::Closed) çağrısı, kavrayıcı zaten kapalıysa yeni bir servo komutu göndermez. Durum farklıysa uygun açıya hareket komutu verilir ve değişken güncellenir. Açık ve kapalı açıları örnek değerlerdir; kavrayıcının mekanik yapısına göre yeniden belirlenmelidir.
Nesneyi alma ve bırakma hareketini sıralayın
Önce konumlandır, sonra yaklaş, kavra, kaldır ve bırak. Robot kolun nesne alma mantığında amaç, tüm servo motorlara aynı anda rastgele açı vermek değil; her hareketin bir sonraki hareket için güvenli bir zemin hazırlamasıdır. Servo listesindeki tanımlama sırası ile fiziksel hareket sırası aynı olmak zorunda değildir. Örneğin kodda önce taban servosu tanımlanmış olsa da, belirli bir harekette önce kavrayıcıyı açmak daha doğru olabilir.
Aşağıdaki sıra, farklı mekanik tasarımlara uyarlanabilecek temel bir alma ve bırakma planıdır. Açı değerleri örnektir; kol uzunluğu, servo yönü, bağlantı noktaları ve nesnenin boyutuna göre yeniden ayarlanmalıdır.
- Kolun çarpışma riski düşük olan başlangıç konumuna dönmesini sağlayın.
- Kavrayıcıyı nesneyi alabilecek kadar açın.
- Tabanı ve ana kol eklemlerini hedef nesnenin bulunduğu yöne çevirin.
- Kol ucunu nesneye doğru kontrollü biçimde yaklaştırın.
- Kavrayıcıyı kapatarak nesneyi kavrayın.
- Nesneyi zeminden veya engellerden uzaklaştıracak güvenli bir yüksekliğe kaldırın.
- Tabanı ve kolu bırakma noktasına yöneltin.
- Kavrayıcıyı açarak nesneyi bırakın.
- Kolun yeniden başlangıç konumuna dönmesini sağlayın.
Bu planı kodda durumlar hâlinde kurmak, hareketlerin neden gerçekleştiğini takip etmeyi kolaylaştırır. Özellikle kavrayıcının açık, kapalı veya açılmaya hazırlanıyor olması ayrı bir değişkenle yönetildiğinde, yanlış anda kapanma riski daha görünür olur.
durum = "baslangic"
kavrayiciAcik = false
baslangicKonumunaGit()
kavrayiciyiAc()
kavrayiciAcik = true
if guvenliAciMi(tabanAcisi, omuzAcisi, dirsekAcisi):
hedefeYonel()
nesneyeYaklas()
if kavrayiciAcik:
kavrayiciyiKapat()
kavrayiciAcik = false
guvenliYuksekligeKaldir()
birakmaNoktasinaGit()
kavrayiciyiAc()
kavrayiciAcik = true
baslangicKonumunaGit()
durum = "tamamlandi"
Buradaki guvenliAciMi() kontrolü, proje için belirlediğiniz açı sınırlarının dışına çıkmadan hareket etmeyi temsil eder. Beklenen sonuç, robot kolun hareketleri aynı anda vermek yerine çarpışma olasılığını gözeten sıralı bir planla yürütmesidir.
Hareket planı çalışmadığında sıralamayı yeniden değerlendirin
Robot kol hedefe ulaşamıyorsa sorun yalnızca servo açısında olmayabilir. Kol nesneye yaklaşırken uygunsuz bir konumda kalabilir, kavrayıcı hedefe erişmeden kapanabilir veya bir eklem mekanik sınırına yaklaşabilir. Bu durumlarda tüm kodu değiştirmek yerine, hareket planındaki adımları tek tek incelemek daha sağlıklı bir teşhis sağlar.
İlk olarak servo eşlemesini doğrulayın. Kodda verdiğiniz servo adının fiziksel olarak doğru eklemi hareket ettirdiğinden ve açı artış yönünün beklediğiniz yönde olduğundan emin olun. Ardından başlangıç konumunu kontrol edin. Başlangıç açısı çok alçakta, çok geride ya da kavrayıcı kapalıysa sonraki adımlar doğru yazılmış olsa bile hareket planı bozulabilir.
Her hareketi ayrı ayrı deneyin: yalnız tabanı çevirin, yalnız omzu kaldırın, yalnız dirseği indirin ve yalnız kavrayıcıyı açıp kapatın. Böylece sorun mekanik bağlantıda mı, servo yönünde mi, yoksa hareket sıralamasında mı daha kolay ayırt edilir. Güvenli açı aralıklarını da deneme sonucunda güncelleyin; her robot kolda aynı açıların güvenli olduğu varsayılamaz.
Son olarak fiziksel sıra ile kod sırasını karşılaştırın. Kod önce dirseği indiriyor, ancak fiziksel olarak önce omzun kalkması gerekiyorsa kol hedefe yanlış açıyla yaklaşabilir. Planı küçük adımlara ayırmak, her adımdan sonra kolun konumunu gözlemlemek ve gerekirse yaklaşma ile kaldırma aşamalarını yeniden sıralamak daha kontrollü sonuç verir.
Sık Sorulan Sorular
Servo motorlar kodda hangi sırayla tanımlanmalıdır?
Servo motorlar kodda okunabilirliği destekleyen bir sırayla tanımlanabilir. Taban, omuz, dirsek ve kavrayıcı gibi fiziksel görevlerine göre ad vermek yeterlidir. Tanımlama sırası, hareketlerin mutlaka aynı sırayla çalışacağı anlamına gelmez.
Robot kol neden nesneyi kavramadan önce hedefe yaklaşmalıdır?
Kavrayıcı erken kapanırsa nesneyi yakalayacak açıklık kalmayabilir veya kol hedefe ulaşırken çevredeki parçalara takılabilir. Önce hedefe uygun konumda yaklaşmak, ardından kavramak daha kontrollü bir hareket akışı sağlar.
Servo açıları her robot kol tasarımında aynı mı olmalıdır?
Hayır. Servo yönü, kolun bağlantı biçimi, eklem sınırları ve kullanılan kavrayıcı tasarımı açıları değiştirir. Örnek açıları başlangıç noktası olarak kullanıp her eklemin güvenli hareket alanını kendi düzeneğiniz üzerinde kontrol etmek gerekir.
İyi bir robot kol planı, karmaşık hesaplardan önce hareketlerin güvenli ve anlaşılır sıraya konulmasıyla başlar. Her aşamayı ayrı denemek, planı mekanik tasarıma göre geliştirmeyi kolaylaştırır.