ROS MoveIt Robotic Arm Part 2: Robot Controller: 6 ขั้นตอน
ROS MoveIt Robotic Arm Part 2: Robot Controller: 6 ขั้นตอน
Anonim
Image
Image

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 RobotCommander Interface
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 สำหรับตัวควบคุมหุ่นยนต์
รหัส Arduino สำหรับตัวควบคุมหุ่นยนต์
รหัส Arduino สำหรับตัวควบคุมหุ่นยนต์
รหัส Arduino สำหรับตัวควบคุมหุ่นยนต์
รหัส Arduino สำหรับตัวควบคุมหุ่นยนต์
รหัส Arduino สำหรับตัวควบคุมหุ่นยนต์

ในกรณีของเรา 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 ที่กำลังทำงานอยู่

คอยติดตามในส่วนที่สามของบทความ ฉันจะใช้กล้องสเตอริโอในการตรวจจับวัตถุและดำเนินการเลือกและวางไปป์ไลน์สำหรับวัตถุธรรมดา!