สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
github.com/AIWintermuteAI/ros-moveit-arm.git
ในส่วนก่อนหน้าของบทความ เราได้สร้างไฟล์ URDF และ XACRO สำหรับแขนหุ่นยนต์ของเรา และเปิดตัว RVIZ เพื่อควบคุมแขนหุ่นยนต์ของเราในสภาพแวดล้อมจำลอง
คราวนี้เราจะทำกับแขนหุ่นยนต์ของจริงกัน! เราจะเพิ่มกริปเปอร์ เขียนตัวควบคุมหุ่นยนต์ และ (ทางเลือก) สร้างตัวแก้จลนศาสตร์ผกผัน IKfast
เจโรนิโม!
ขั้นตอนที่ 1: การเพิ่มกริปเปอร์
การเพิ่มกริปเปอร์ค่อนข้างสับสนในตอนแรก ดังนั้นฉันจึงข้ามส่วนนี้ไปในบทความที่แล้ว มันกลับกลายเป็นว่าไม่ยากเลย
คุณจะต้องแก้ไขไฟล์ URDF เพื่อเพิ่มลิงก์และข้อต่อกริปเปอร์
ไฟล์ URDF ที่แก้ไขสำหรับหุ่นยนต์ของฉันถูกแนบมากับขั้นตอนนี้ โดยพื้นฐานแล้วมันเป็นไปตามตรรกะเดียวกันกับส่วนแขน ฉันเพิ่งเพิ่มลิงก์ใหม่สามลิงก์ (claw_base, claw_r และ claw_l) และข้อต่อใหม่สามข้อ (joint5 ได้รับการแก้ไขแล้ว และ joint6, joint7 เป็นข้อต่อแบบหมุนวน)
หลังจากที่คุณแก้ไขไฟล์ URDF แล้ว คุณจะต้องอัปเดตแพ็คเกจที่สร้างโดย MoveIt และไฟล์ xacro โดยใช้ตัวช่วยการตั้งค่า MoveIt
เรียกใช้ผู้ช่วยการตั้งค่าด้วยคำสั่งต่อไปนี้
roslaunch moveit_setup_assistant setup_assistant.launch
คลิกที่ แก้ไขการกำหนดค่า MoveIt ที่มีอยู่ และเลือกโฟลเดอร์ที่มีแพ็คเกจ MoveIt ของคุณ
เพิ่มกริปเปอร์กลุ่มการวางแผนใหม่ (พร้อมข้อต่อและข้อต่อสำหรับกริปเปอร์) และเอ็นด์เอฟเฟคเตอร์ การตั้งค่าของฉันอยู่ในภาพหน้าจอด้านล่าง สังเกตว่าคุณไม่ได้เลือกตัวแก้ปัญหาจลนศาสตร์สำหรับกริปเปอร์ ไม่จำเป็น สร้างแพ็คเกจและเขียนทับไฟล์
วิ่ง
ทำแมว
คำสั่งในพื้นที่ทำงาน catkin ของคุณ
เอาล่ะ ตอนนี้เรามีแขนพร้อมกริปเปอร์แล้ว!
ขั้นตอนที่ 2: สร้างแขน
ดังที่ได้กล่าวไว้ก่อนหน้านี้ว่าโมเดล arm 3D นั้นสร้างโดย Juergenlessner ขอขอบคุณสำหรับการทำงานที่น่าทึ่ง คุณสามารถดูคำแนะนำการประกอบโดยละเอียดได้หากคุณคลิกลิงก์
ฉันต้องปรับเปลี่ยนระบบควบคุมแม้ว่า ฉันใช้ Arduino Uno พร้อมตัวป้องกันเซ็นเซอร์เพื่อควบคุมเซอร์โว แผงป้องกันเซ็นเซอร์ช่วยอย่างมากในการลดความซับซ้อนของการเดินสายและยังช่วยให้การจ่ายพลังงานภายนอกไปยังเซอร์โวทำได้ง่าย ฉันใช้อะแดปเตอร์จ่ายไฟ 12V 6A ที่ต่อสายผ่านโมดูลสเต็ปดาวน์ (6V) กับ Sensor Shield
หมายเหตุเกี่ยวกับเซอร์โว ฉันใช้เซอร์โว MG 996 HR ที่ซื้อจาก Taobao แต่คุณภาพแย่มาก เป็นเครื่องเคาะประตูแบบจีนราคาถูกอย่างแน่นอน ข้อต่อข้อศอกไม่ให้แรงบิดเพียงพอ และเริ่มมีควันเมื่อใช้งานหนัก ฉันต้องเปลี่ยนเซอร์โวข้อต่อข้อศอกด้วย MG 946 HR จากผู้ผลิตที่มีคุณภาพดีกว่า
เรื่องสั้นสั้น - ซื้อเซอร์โวคุณภาพ หากควันวิเศษออกมาจากเซอร์โวของคุณ ให้ใช้เซอร์โวที่ดีกว่า 6V เป็นแรงดันไฟฟ้าที่ปลอดภัยมาก อย่าเพิ่มมัน มันจะไม่เพิ่มแรงบิด แต่อาจทำให้เซอร์โวเสียหายได้
การเดินสายไฟสำหรับเซอร์โวดังนี้:
ฐาน2
ไหล่2 4ไหล่1 3
ข้อศอก 6
กริปเปอร์ 8
ข้อมือ 11
คุณสามารถเปลี่ยนได้ตราบเท่าที่คุณอย่าลืมเปลี่ยนร่าง Arduino
หลังจากเสร็จสิ้นฮาร์ดแวร์แล้ว มาดูภาพใหญ่กัน!
ขั้นตอนที่ 3: MoveIt RobotCommander Interface
แล้วตอนนี้ล่ะ? ทำไมคุณถึงต้องการ MoveIt และ ROS คุณไม่สามารถควบคุมแขนผ่านรหัส Arduino โดยตรงได้หรือไม่?
ใช่คุณสามารถ.
โอเค ทีนี้แล้วการใช้ GUI หรือโค้ด Python/C++ เพื่อจัดเตรียมท่าหุ่นยนต์ให้ไปที่ล่ะ? Arduino สามารถทำได้หรือไม่?
ประเภทของ เพื่อที่คุณจะต้องเขียนตัวแก้จลนศาสตร์ผกผันซึ่งจะใช้หุ่นยนต์โพสท่า (พิกัดการแปลและการหมุนในพื้นที่ 3 มิติ) และแปลงเป็นข้อความมุมร่วมสำหรับเซอร์โว
แม้ว่าคุณจะทำเองได้ แต่ก็เป็นงานที่ต้องทำมากมาย ดังนั้น MoveIt และ ROS จึงมีอินเทอร์เฟซที่ดีสำหรับตัวแก้ปัญหา IK (จลนศาสตร์ผกผัน) เพื่อทำการยกตรีโกณมิติที่หนักหน่วงสำหรับคุณ
คำตอบสั้น ๆ: ใช่ คุณสามารถทำแขนหุ่นยนต์ง่ายๆ ที่จะรันภาพร่าง Arduino แบบฮาร์ดโค้ดเพื่อเปลี่ยนจากท่าหนึ่งไปอีกท่าหนึ่งได้ แต่ถ้าคุณต้องการทำให้หุ่นยนต์ของคุณฉลาดขึ้นและเพิ่มความสามารถในการมองเห็นด้วยคอมพิวเตอร์ MoveIt และ ROS เป็นวิธีที่จะไป
ฉันสร้างไดอะแกรมที่เรียบง่ายมากเพื่ออธิบายว่าเฟรมเวิร์ก MoveIt ทำงานอย่างไร ในกรณีของเรา มันจะง่ายยิ่งขึ้นไปอีก เนื่องจากเราไม่มีข้อเสนอแนะจากเซอร์โวของเรา และจะใช้หัวข้อ /joint_states เพื่อให้ตัวควบคุมหุ่นยนต์มีมุมสำหรับเซอร์โว เราขาดเพียงองค์ประกอบเดียวคือตัวควบคุมหุ่นยนต์
เรารออะไรอยู่? มาเขียนตัวควบคุมหุ่นยนต์กันเถอะ หุ่นยนต์ของเราจะ … ควบคุมได้มากขึ้น
ขั้นตอนที่ 4: รหัส Arduino สำหรับ Robot Controller
ในกรณีของเรา Arduino Uno ที่รันโหนด ROS ที่มี rosserial จะเป็นตัวควบคุมหุ่นยนต์ รหัสร่าง Arduino แนบมากับขั้นตอนนี้และมีอยู่ใน GitHub
โดยทั่วไปแล้วโหนด ROS ที่ทำงานบน Arduino Uno จะสมัครรับข้อมูลหัวข้อ /JointState ที่เผยแพร่บนคอมพิวเตอร์ที่ใช้ MoveIt จากนั้นจะแปลงมุมร่วมจากอาร์เรย์จากเรเดียนเป็นองศาและส่งผ่านไปยังเซอร์โวโดยใช้ไลบรารี Servo.h มาตรฐาน
โซลูชันนี้ค่อนข้างแฮ็กและไม่ใช่วิธีการทำกับหุ่นยนต์อุตสาหกรรม ตามหลักการแล้วคุณควรเผยแพร่วิถีการเคลื่อนที่ในหัวข้อ /FollowJointState จากนั้นรับคำติชมในหัวข้อ /JointState แต่ในอ้อมแขนของเรา เซอร์โวอดิเรกไม่สามารถให้ข้อเสนอแนะได้ ดังนั้นเราจะสมัครรับข่าวสารโดยตรงต่อหัวข้อ /JointState ซึ่งเผยแพร่โดยโหนด FakeRobotController โดยพื้นฐานแล้วเราจะสมมติว่ามุมใดก็ตามที่เราส่งผ่านไปยังเซอร์โวนั้นได้รับการดำเนินการอย่างเหมาะสม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของ rosserial คุณสามารถอ่านบทช่วยสอนต่อไปนี้
wiki.ros.org/rosserial_arduino/Tutorials
หลังจากที่คุณอัปโหลดภาพสเก็ตช์ไปยัง Arduino Uno แล้ว คุณจะต้องเชื่อมต่อมันด้วยสายเคเบิลอนุกรมกับคอมพิวเตอร์ที่ใช้การติดตั้ง ROS ของคุณ
ในการเรียกใช้ทั้งระบบให้รันคำสั่งต่อไปนี้
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
ตอนนี้คุณสามารถใช้เครื่องหมายแบบโต้ตอบใน RVIZ เพื่อขยับแขนหุ่นยนต์ไปยังท่าทาง จากนั้นกด Plan และ Execute เพื่อให้มันเคลื่อนเข้าสู่ตำแหน่งได้จริง
มายากล!
ตอนนี้เราพร้อมที่จะเขียนโค้ด Python สำหรับการทดสอบทางลาดแล้ว อืม เกือบ…
ขั้นตอนที่ 5: (ไม่บังคับ) การสร้าง IKfast Plug-in
ตามค่าเริ่มต้น MoveIt แนะนำให้ใช้ตัวแก้ปัญหา KDL kinematics ซึ่งใช้งานไม่ได้กับแขน DOF น้อยกว่า 6 ตัว หากคุณติดตามบทช่วยสอนนี้อย่างใกล้ชิด คุณจะสังเกตเห็นว่ารุ่นแขนใน RVIZ ไม่สามารถไปยังท่าบางท่าที่ควรสนับสนุนโดยการกำหนดค่าแขน
วิธีแก้ปัญหาที่แนะนำคือการสร้างตัวแก้จลนศาสตร์แบบกำหนดเองโดยใช้ OpenRave มันไม่ได้ยากขนาดนั้น แต่คุณจะต้องสร้างมันขึ้นมาและเป็นการพึ่งพาจากแหล่งที่มาหรือใช้คอนเทนเนอร์นักเทียบท่า แล้วแต่ว่าคุณต้องการอะไร
ขั้นตอนได้รับการบันทึกไว้เป็นอย่างดีในบทช่วยสอนนี้ ได้รับการยืนยันแล้วว่าทำงานบน VM ที่ใช้ Ubuntu 16.04 และ ROS Kinetic
ฉันใช้คำสั่งต่อไปนี้เพื่อสร้างตัวแก้ไข
openrave.py --database inversekinematics --robot=arm.xml --iktype=translation3d --iktests=1000
แล้วก็วิ่ง
rosrun moveit_kinematics create_ikfast_moveit_plugin.py test_robot แขน my_arm_xacro ikfast0x1000004a. Translation3D.0_1_2_f3.cpp
เพื่อสร้างปลั๊กอิน MoveIt IKfast
ขั้นตอนทั้งหมดใช้เวลานานเล็กน้อย แต่ไม่ยากหากคุณปฏิบัติตามบทช่วยสอนอย่างใกล้ชิด หากคุณมีคำถามเกี่ยวกับส่วนนี้โปรดติดต่อฉันในความคิดเห็นหรือ PM
ขั้นตอนที่ 6: การทดสอบทางลาด
ตอนนี้เราพร้อมที่จะลองทดสอบทางลาดแล้ว ซึ่งเราจะดำเนินการโดยใช้ ROS MoveIt Python API
โค้ด Python แนบมากับขั้นตอนนี้ และยังมีอยู่ในที่เก็บ github หากคุณไม่มีทางลาดหรือต้องการลองการทดสอบอื่น คุณจะต้องเปลี่ยนท่าทางของหุ่นยนต์ในโค้ด สำหรับการดำเนินการครั้งแรกนั้น
rostopic echo /rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic/feedback
ในเทอร์มินัลเมื่อใช้งาน RVIZ และ MoveIt อยู่แล้ว จากนั้นย้ายหุ่นยนต์ที่มีเครื่องหมายโต้ตอบไปยังตำแหน่งที่ต้องการ ค่าตำแหน่งและการวางแนวจะแสดงในเทอร์มินัล เพียงคัดลอกไปยังรหัส Python
เพื่อดำเนินการทดสอบทางลาดรัน
rosrun my_arm_xacro เลือก/pick_2.py
ด้วย RVIZ และ rosserial node ที่กำลังทำงานอยู่
คอยติดตามในส่วนที่สามของบทความ ฉันจะใช้กล้องสเตอริโอในการตรวจจับวัตถุและดำเนินการเลือกและวางไปป์ไลน์สำหรับวัตถุธรรมดา!