İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
github.com/AIWintermuteAI/ros-moveit-arm.git
Yazının bir önceki bölümünde robotik kolumuz için URDF ve XACRO dosyaları oluşturmuş ve simüle ortamda robotik kolumuzu kontrol etmek için RVIZ'i başlatmıştık.
Bu sefer gerçek robotik kolla yapacağız! Yakalayıcıyı ekleyeceğiz, bir robot denetleyicisi yazacağız ve (isteğe bağlı) IKfast ters kinematik çözücü oluşturacağız.
Geronimo!
Adım 1: Kıskaç Ekleme
Gripper eklemek ilk başta biraz kafa karıştırıcıydı, bu yüzden bir önceki makalede bu kısmı atladım. Sonuçta o kadar da zor olmadığı ortaya çıktı.
Kavrayıcı bağlantılar ve eklemler eklemek için URDF dosyanızı değiştirmeniz gerekecektir.
Robotum için değiştirilmiş URDF dosyası bu adıma eklenmiştir. Temelde kol kısmı ile aynı mantığı takip ediyor, sadece üç yeni bağlantı (claw_base, claw_r ve claw_l) ve üç yeni bağlantı (eklem5 sabit ve eklem6, eklem7 döner eklemlerdir) ekledim.
URDF dosyanızı değiştirdikten sonra, MoveIt kurulum yardımcısını kullanarak MoveIt tarafından oluşturulan paketi ve xacro dosyasını da güncellemeniz gerekir.
Aşağıdaki komutla kurulum yardımcısını başlatın
roslaunch moveit_setup_assistant setup_assistant.launch
Mevcut MoveIt Yapılandırmasını Düzenle'ye tıklayın ve MoveIt paketinizin bulunduğu klasörü seçin.
Yeni planlama grubu tutucusu (kavrayıcı için bağlantılar ve bağlantılarla birlikte) ve ayrıca bir uç efektör ekleyin. Ayarlarım aşağıdaki ekran görüntülerinde. Kavrayıcı için kinematik çözücü seçmediğinize dikkat edin, bu gerekli değildir. Paketi oluşturun ve dosyaların üzerine yazın.
Çalıştırmak
kedicik yapmak
catkin çalışma alanınızda komut.
Pekala, şimdi kıskaçlı bir kolumuz var!
Adım 2: Kolu İnşa Etme
Daha önce de bahsettiğim gibi kol 3D modeli Juergenlessner tarafından yapılmış, harika bir çalışma için teşekkürler. Bağlantıyı takip ederseniz ayrıntılı montaj talimatlarını bulabilirsiniz.
Yine de kontrol sistemini değiştirmek zorunda kaldım. Servoları kontrol etmek için Sensör kalkanlı Arduino Uno kullanıyorum. Sensör kalkanı, kablolamayı basitleştirmeye çok yardımcı olur ve ayrıca servolara harici güç sağlamayı kolaylaştırır. Alçak modül (6V) üzerinden Sensör Kalkanına bağlanan 12V 6A güç adaptörü kullanıyorum.
Servolar hakkında bir not. Taobao'dan aldığım MG 996 HR servoları kullanıyorum ama kalitesi gerçekten çok kötü. Kesinlikle ucuz bir Çin nakavtı. Dirsek eklemi için olan yeterli tork sağlamadı ve hatta ağır yük altında bir kez duman çıkarmaya başladı. Dirsek eklem servosunu daha kaliteli bir üreticiden MG 946 HR ile değiştirmek zorunda kaldım.
Uzun lafın kısası - kaliteli servolar satın alın. Servolarınızdan sihirli duman çıkarsa, daha iyi servolar kullanın. 6V çok güvenli bir voltajdır, arttırmayın. Torku artırmaz ancak servolara zarar verebilir.
Servolar için kablolama aşağıdaki gibidir:
taban 2
omuz2 4omuz1 3
dirsek 6
tutucu 8
bilek 11
Arduino taslağını değiştirmeyi de hatırladığınız sürece değiştirmekten çekinmeyin.
Donanımla işiniz bittiğinde, büyük resme bir bakalım!
Adım 3: MoveIt RobotCommander Arayüzü
Peki, şimdi ne? Neden MoveIt ve ROS'a ihtiyacınız var? Kolu doğrudan Arduino koduyla kontrol edemez misin?
Evet yapabilirsin.
Tamam, şimdi gidecek robot pozu sağlamak için GUI veya Python/C++ kodunu kullanmaya ne dersiniz? Arduino bunu yapabilir mi?
Bir çeşit. Bunun için bir robot pozu (3 boyutlu uzayda çevirme ve döndürme koordinatları) alacak ve servolar için eklem açı mesajlarına dönüştürecek bir ters kinematik çözücü yazmanız gerekecek.
Bunu kendin yapabilmene rağmen, yapacak çok iş var. Bu nedenle, MoveIt ve ROS, IK (ters kinematik) çözücünün tüm ağır trigonometrik kaldırma işlemlerini sizin için yapması için güzel bir arayüz sağlar.
Kısa cevap: Evet, bir pozdan diğerine gitmek için sabit kodlanmış bir Arduino taslağını yürütecek basit bir robotik kol yapabilirsiniz. Ancak robotunuzu daha akıllı hale getirmek ve bilgisayarla görme yetenekleri eklemek istiyorsanız, MoveIt ve ROS tam size göre.
MoveIt çerçevesinin nasıl çalıştığını açıklayan çok basitleştirilmiş bir diyagram yaptım. Bizim durumumuzda daha da basit olacak, çünkü servolarımızdan geri bildirim almayacağız ve /joint_states konusunu robot kontrolörüne servolar için açılar sağlamak için kullanacağız. Robot denetleyicisi olan yalnızca bir bileşenimiz yok.
Biz ne bekliyoruz? Bazı robot kontrolörleri yazalım, böylece robotumuz … bilirsiniz, daha kontrol edilebilir olur.
Adım 4: Robot Denetleyicisi için Arduino Kodu
Bizim durumumuzda, rosserial ile bir ROS düğümü çalıştıran Arduino Uno, robot kontrolörü olacaktır. Arduino çizim kodu bu adıma eklenmiştir ve GitHub'da da mevcuttur.
Arduino Uno üzerinde çalışan ROS düğümü, temelde MoveIt çalıştıran bilgisayarda yayınlanan /JointState konusuna abone olur ve ardından standart Servo.h kütüphanesini kullanarak dizideki eklem açılarını radyandan dereceye çevirir ve servolara iletir.
Bu çözüm biraz zor ve endüstriyel robotlarla nasıl yapıldığını değil. İdeal olarak, hareket yörüngesini /FollowJointState konusunda yayınlamanız ve ardından /JointState konusu hakkında geri bildirim almanız gerekir. Ancak kolumuzdaki hobi servoları geri bildirim sağlayamıyor, bu yüzden FakeRobotController düğümü tarafından yayınlanan /JointState konusuna doğrudan abone olacağız. Temel olarak, servolara geçtiğimiz açıların ideal olarak yürütüldüğünü varsayacağız.
Rosserial'ın nasıl çalıştığı hakkında daha fazla bilgi için aşağıdaki eğitimlere başvurabilirsiniz.
wiki.ros.org/rosserial_arduino/Tutorials
Krokiyi Arduino Uno'ya yükledikten sonra, ROS kurulumunuzu çalıştıran bilgisayara seri kablo ile bağlamanız gerekir.
Tüm sistemi getirmek için aşağıdaki komutları yürütün
roslaunch my_arm_xacro demo.launch rviz_tutorial:=true
sudo chmod -R 777 /dev/ttyUSB0
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 _baud:=115200
Artık robot kolunu bir poza getirmek için RVIZ'deki etkileşimli işaretçileri kullanabilir ve ardından gerçekten pozisyona geçmesi için Planla ve Yürüt'e basabilirsiniz.
Büyü!
Artık rampa testimiz için Python kodunu yazmaya hazırız. Eh, neredeyse…
Adım 5: (İsteğe bağlı)IKfast Eklentisi Oluşturma
Varsayılan olarak MoveIt, 6 DOF kolundan daha azıyla gerçekten çalışmayan KDL kinematik çözücünün kullanılmasını önerir. Bu öğreticiyi yakından takip ederseniz, RVIZ'deki kol modelinin kol konfigürasyonu tarafından desteklenmesi gereken bazı pozlara gidemediğini fark edeceksiniz.
Önerilen çözüm, OpenRave kullanarak özel kinematik çözücü oluşturmaktır. O kadar zor değil, ancak onu inşa etmeniz ve kaynaktan gelen bağımlılıkları veya hangisini tercih ederseniz, docker konteynerini kullanmanız gerekecek.
Prosedür bu eğitimde çok iyi belgelenmiştir. Ubuntu 16.04 ve ROS Kinetic çalıştıran VM üzerinde çalıştığı onaylanmıştır.
Çözücüyü oluşturmak için aşağıdaki komutu kullandım
openrave.py --database ters kinematik --robot=arm.xml --iktype=translation3d --iktests=1000
ve sonra koştu
rosrun moveit_kinematics create_ikfast_moveit_plugin.py test_robot arm my_arm_xacro ikfast0x1000004a. Translation3D.0_1_2_f3.cpp
MoveIt IKfast eklentisini oluşturmak için.
Tüm prosedür biraz zaman alıcıdır, ancak öğreticiyi yakından takip ederseniz çok zor değildir. Bu bölümle ilgili sorularınız varsa, lütfen yorumlarda veya PM'de benimle iletişime geçin.
Adım 6: Rampa Testi
Artık ROS MoveIt Python API kullanarak gerçekleştireceğimiz rampa testini denemeye hazırız.
Python kodu bu adıma eklenmiştir ve ayrıca github deposunda mevcuttur. Rampanız yoksa veya başka bir test denemek istiyorsanız, koddaki robot pozlarını değiştirmeniz gerekecektir. Bunun için ilk çalıştırma
rostopic yankı /rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic/feedback
zaten RVIZ ve MoveIt çalıştırırken terminalde. Ardından robotu etkileşimli işaretleyicilerle istenen konuma hareket ettirin. Konum ve yön değerleri terminalde görüntülenecektir. Bunları Python koduna kopyalamanız yeterlidir.
Rampa testi çalıştırmasını yürütmek için
rosrun my_arm_xacro pick/pick_2.py
RVIZ ve rosserial düğüm zaten çalışıyor.
Nesne algılama için stereo kamera kullanacağım ve basit nesneler için seç ve yerleştir boru hattını çalıştıracağım makalenin üçüncü bölümü için bizi izlemeye devam edin!