สารบัญ:

ROS Robotic Controller ที่ใช้ Matlab: 9 ขั้นตอน
ROS Robotic Controller ที่ใช้ Matlab: 9 ขั้นตอน

วีดีโอ: ROS Robotic Controller ที่ใช้ Matlab: 9 ขั้นตอน

วีดีโอ: ROS Robotic Controller ที่ใช้ Matlab: 9 ขั้นตอน
วีดีโอ: Getting Started with MATLAB and ROS 2024, พฤศจิกายน
Anonim
Image
Image
ROS Robotic Controller ที่ใช้ Matlab
ROS Robotic Controller ที่ใช้ Matlab

ตั้งแต่ฉันยังเป็นเด็ก ฉันใฝ่ฝันที่จะเป็นไอรอนแมนมาตลอดและยังคงทำเช่นนั้น Iron Man เป็นหนึ่งในตัวละครเหล่านั้นซึ่งเป็นไปได้ตามความเป็นจริง และเพียงแค่ทำให้ฉันปรารถนาที่จะเป็น Iron Man สักวันหนึ่ง แม้ว่าผู้คนจะหัวเราะเยาะหรือพูดว่าเป็นไปไม่ได้ เพราะ "มันเป็นไปไม่ได้จนกว่าจะมีคนทำ" - อาร์โนลด์ ชวาร์เซเน็กเกอร์

ROS เป็นเฟรมเวิร์กที่เกิดขึ้นใหม่ซึ่งใช้สำหรับการพัฒนาระบบหุ่นยนต์ที่ซับซ้อน การใช้งานรวมถึง: ระบบประกอบอัตโนมัติ, Teleoperation, แขนเทียมและเครื่องจักรกลหนักของภาคอุตสาหกรรม

นักวิจัยและวิศวกรใช้ประโยชน์จาก ROS ในการพัฒนาต้นแบบ ในขณะที่ผู้ขายหลายรายใช้ ROS เพื่อสร้างผลิตภัณฑ์ของตน มีสถาปัตยกรรมที่ซับซ้อนซึ่งทำให้คนง่อยจัดการได้ยาก การใช้ MATLAB เพื่อสร้างลิงก์อินเทอร์เฟซกับ ROS เป็นแนวทางใหม่ที่สามารถช่วยนักวิจัย วิศวกร และผู้ขายในการพัฒนาโซลูชันที่มีประสิทธิภาพยิ่งขึ้น

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

เครดิตการตัดต่อวิดีโอ: Ammar Akher ที่ [email protected]

เสบียง

ส่วนประกอบต่อไปนี้จำเป็นสำหรับโครงการ:

(1) ROS PC/หุ่นยนต์

(2) เราเตอร์

(3) พีซีที่มี MATLAB (เวอร์ชัน: 2014 ขึ้นไป)

ขั้นตอนที่ 1: รับการตั้งค่าทุกอย่าง

กำลังตั้งค่าทุกอย่าง
กำลังตั้งค่าทุกอย่าง

สำหรับคำแนะนำนี้ ฉันใช้ Ubuntu 16.04 สำหรับ linux pc และ ros-kinetic ดังนั้นเพื่อหลีกเลี่ยงความสับสน ฉันขอแนะนำให้ใช้ ros kinetic และ ubuntu 16.04 เนื่องจากมีการสนับสนุน ros-kinetic ที่ดีที่สุด สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการติดตั้ง ros kinetic ไปที่ https://wiki.ros.org/kinetic/Installation/Ubuntu สำหรับ MATLAB คุณซื้อใบอนุญาตหรือดาวน์โหลดเวอร์ชันทดลองจากที่นี่

ขั้นตอนที่ 2: ทำความเข้าใจว่าคอนโทรลเลอร์ทำงานอย่างไร

ทำความเข้าใจว่าคอนโทรลเลอร์ทำงานอย่างไร
ทำความเข้าใจว่าคอนโทรลเลอร์ทำงานอย่างไร

พีซีใช้งานตัวควบคุมหุ่นยนต์บน MATLAB คอนโทรลเลอร์รับที่อยู่ IP และพอร์ตของ ros pc/robot

ros-topic ใช้ในการสื่อสารระหว่างคอนโทรลเลอร์กับ ros pc/robot ซึ่งคอนโทรลเลอร์ก็ใช้เป็นอินพุตเช่นกัน จำเป็นต้องใช้โมเด็มเพื่อสร้าง LAN (เครือข่ายท้องถิ่น) และเป็นสิ่งที่กำหนดที่อยู่ IP ให้กับอุปกรณ์ทั้งหมดที่เชื่อมต่อกับเครือข่าย ดังนั้น ros pc/robot และ pc ที่ใช้งานคอนโทรลเลอร์จะต้องเชื่อมต่อกับเครือข่ายเดียวกัน (เช่น เครือข่ายของโมเด็ม) ตอนนี้คุณรู้แล้วว่า "มันทำงานอย่างไร" มาที่ "วิธีสร้าง" กัน…

ขั้นตอนที่ 3: การสร้างอินเทอร์เฟซ ROS-MATLAB

การสร้างอินเทอร์เฟซ ROS-MATLAB
การสร้างอินเทอร์เฟซ ROS-MATLAB
การสร้างอินเทอร์เฟซ ROS-MATLAB
การสร้างอินเทอร์เฟซ ROS-MATLAB
การสร้างอินเทอร์เฟซ ROS-MATLAB
การสร้างอินเทอร์เฟซ ROS-MATLAB

ROS-MATLABInterface เป็นอินเทอร์เฟซที่มีประโยชน์สำหรับนักวิจัยและนักศึกษาในการสร้างต้นแบบอัลกอริธึมหุ่นยนต์ใน MATLAB และทดสอบกับหุ่นยนต์ที่เข้ากันได้กับ ROS อินเทอร์เฟซนี้สามารถสร้างขึ้นโดยกล่องเครื่องมือระบบหุ่นยนต์ใน MATLAB และเราสามารถสร้างต้นแบบอัลกอริทึมของเราและทดสอบได้ หุ่นยนต์ที่เปิดใช้งาน ROS หรือในหุ่นยนต์จำลอง เช่น Gazebo และ V-REP

ในการติดตั้งกล่องเครื่องมือระบบหุ่นยนต์บน MATLAB ของคุณ เพียงไปที่ตัวเลือก Add-on บนแถบเครื่องมือ แล้วค้นหากล่องเครื่องมือหุ่นยนต์ในโปรแกรมสำรวจส่วนเสริม การใช้กล่องเครื่องมือหุ่นยนต์ เราสามารถเผยแพร่หรือสมัครสมาชิกหัวข้อ เช่น โหนด ROS และเราสามารถทำให้เป็นต้นแบบ ROS ได้ อินเทอร์เฟซ MATLAB-ROS มีฟังก์ชัน ROS ส่วนใหญ่ที่คุณต้องการสำหรับโครงการของคุณ

ขั้นตอนที่ 4: รับที่อยู่ IP

การรับที่อยู่ IP
การรับที่อยู่ IP
การรับที่อยู่ IP
การรับที่อยู่ IP

เพื่อให้คอนโทรลเลอร์ทำงานได้ คุณจำเป็นต้องทราบที่อยู่ IP ของหุ่นยนต์/พีซี ROS ของคุณและพีซีที่ใช้งานคอนโทรลเลอร์บน MATLAB

ในการรับ IP ของพีซีของคุณ:

บน Windows:

เปิดพรอมต์คำสั่งแล้วพิมพ์คำสั่ง ipconfig และจดที่อยู่ IPv4

สำหรับลินุกซ์:

พิมพ์คำสั่ง ifconfig และจดที่อยู่ inet เมื่อคุณมีที่อยู่ IP แล้ว ก็ถึงเวลาสร้าง GUI…

ขั้นตอนที่ 5: สร้าง GUI สำหรับคอนโทรลเลอร์

สร้าง GUI สำหรับคอนโทรลเลอร์
สร้าง GUI สำหรับคอนโทรลเลอร์
สร้าง GUI สำหรับคอนโทรลเลอร์
สร้าง GUI สำหรับคอนโทรลเลอร์
สร้าง GUI สำหรับคอนโทรลเลอร์
สร้าง GUI สำหรับคอนโทรลเลอร์

ในการสร้าง GUI ให้เปิด MATLAB และพิมพ์ guide ในหน้าต่างคำสั่ง ซึ่งจะเป็นการเปิดแอพแนะนำ ซึ่งเราจะสร้าง GUI ของเรา คุณยังสามารถใช้ตัวออกแบบแอปบน MATLAB เพื่อออกแบบ GUI ของคุณได้

เราจะสร้างปุ่มทั้งหมด 9 ปุ่ม (ดังแสดงในรูป):

ปุ่มกด 6 ปุ่ม: เดินหน้า ถอยหลัง ซ้าย ขวา เชื่อมต่อกับหุ่นยนต์ ตัดการเชื่อมต่อ

3 ปุ่มที่แก้ไขได้: Ros pc ip, พอร์ตและชื่อหัวข้อ

ปุ่มที่แก้ไขได้คือปุ่มที่จะใช้ ip ของ ROS pc เป็นพอร์ตและชื่อหัวข้อเป็นอินพุต ชื่อหัวข้อคือสิ่งที่ตัวควบคุม MATLAB และโรบ็อต/พีซี ROS สื่อสารผ่าน หากต้องการแก้ไขสตริงบนปุ่มที่แก้ไขได้ ให้คลิกขวาที่ปุ่ม >> ไปที่คุณสมบัติตัวตรวจสอบ >>สตริง และแก้ไขข้อความของปุ่ม

เมื่อ GUI ของคุณเสร็จสมบูรณ์ คุณสามารถตั้งโปรแกรมปุ่มต่างๆ ได้ นี่คือจุดเริ่มต้นของความสนุกที่แท้จริง…

ขั้นตอนที่ 6: การเขียนโปรแกรมปุ่ม GUI ที่แก้ไขได้

การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้
การเขียนโปรแกรมปุ่ม GUI แก้ไขได้

GUI ถูกบันทึกเป็นไฟล์.fig แต่ฟังก์ชันโค้ด/การโทรกลับจะถูกบันทึกในรูปแบบ.m ไฟล์.m มีรหัสสำหรับปุ่มทั้งหมดของคุณ หากต้องการเพิ่มฟังก์ชันการโทรกลับให้กับปุ่มของคุณ ให้คลิกขวาที่ปุ่ม > >ดูการโทรกลับ>>โทรกลับ ซึ่งจะเปิดไฟล์.m สำหรับ GUI ของคุณไปยังตำแหน่งที่กำหนดปุ่มนั้นไว้

การโทรกลับครั้งแรกที่เราจะเขียนโค้ดคือปุ่มที่แก้ไข ROS IP ได้ ภายใต้ฟังก์ชัน edit1_Callback เขียนโค้ดต่อไปนี้:

ฟังก์ชัน edit1_Callback(hObject, eventdata, handles)

ros_master_ip ทั่วโลก

ros_master_ip = รับ (hObject, 'สตริง')

ในที่นี้ ฟังก์ชันถูกกำหนดเป็น edit1_Callback ซึ่งหมายถึงปุ่มแรกที่แก้ไขได้ เมื่อเราป้อนที่อยู่ IP จากเครือข่าย ROS ในปุ่มที่แก้ไขได้ ระบบจะเก็บที่อยู่ IP เป็นสตริงในตัวแปรส่วนกลางที่เรียกว่า ros_master_ip

จากนั้นภายใต้ _OpeningFcn(hObject, eventdata, handles, varargin) ให้กำหนดสิ่งต่อไปนี้ (ดูรูปที่):

ros_master_ip ทั่วโลก

global ros_master_port

โกลบอล teleop_topic_name

ros_master_ip = '192.168.1.102';

ros_master_port = '11311';

teleop_topic_name = '/cmd_vel_mux/input/teleop';

คุณเพิ่งฮาร์ดโค้ดทั่วโลก ros-pc ip (ros_master_ip) พอร์ต (ros_master_port) และชื่อ Teleop Topic สิ่งนี้ทำคือถ้าคุณปล่อยปุ่มที่แก้ไขได้ว่างไว้ ค่าที่กำหนดไว้ล่วงหน้าเหล่านี้จะถูกใช้เมื่อคุณเชื่อมต่อ

การโทรกลับครั้งต่อไปที่เราจะเขียนโค้ดคือปุ่มแก้ไขพอร์ต

ภายใต้ฟังก์ชัน edit2_Callback เขียนโค้ดต่อไปนี้:

ฟังก์ชัน edit2_Callback(hObject, ข้อมูลเหตุการณ์, แฮนเดิล)

global ros_master_port

ros_master_port = รับ (hObject, 'สตริง')

ในที่นี้ ฟังก์ชันถูกกำหนดเป็น edit2_Callback ซึ่งหมายถึงปุ่มที่แก้ไขได้ที่สอง เมื่อเราป้อนพอร์ตของ ros pc/robot ที่นี่จากเครือข่าย ROS ในปุ่มที่แก้ไขได้นี้ ระบบจะเก็บพอร์ตดังกล่าวเป็นสตริงในตัวแปรส่วนกลางที่เรียกว่า ros_master_port

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

ภายใต้ฟังก์ชัน edit3_Callback เขียนโค้ดต่อไปนี้:

ฟังก์ชัน edit3_Callback(hObject, ข้อมูลเหตุการณ์, แฮนเดิล)

โกลบอล teleop_topic_name

teleop_topic_name = รับ (hObject, 'สตริง')

คล้ายกับ ros_master_port สิ่งนี้ถูกจัดเก็บเป็นสตริงในตัวแปรส่วนกลาง

ต่อไปเราจะมาดูฟังก์ชั่นการโทรกลับของปุ่มกด…

ขั้นตอนที่ 7: การเขียนโปรแกรมปุ่มกด GUI

การเขียนโปรแกรม GUI Push Buttons
การเขียนโปรแกรม GUI Push Buttons
การเขียนโปรแกรม GUI Push Buttons
การเขียนโปรแกรม GUI Push Buttons

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

เช่น. ฟังก์ชัน pushbutton6_Callback(hObject, eventdata, handles)

หมายเหตุ: ขึ้นอยู่กับลำดับที่คุณสร้างปุ่มกด ปุ่มเหล่านั้นจะถูกกำหนดหมายเลขตามลำดับ ดังนั้นฟังก์ชั่น pushbutton6 ในไฟล์.m ของฉันอาจเป็น Forward ในขณะที่ในไฟล์.m ของคุณ อาจเป็น Backwards ดังนั้นโปรดจำไว้เสมอว่า หากต้องการทราบฟังก์ชันที่แน่นอนสำหรับปุ่มกดของคุณ เพียงคลิกขวา>>ดูการเรียกกลับ>>การโทรกลับ และมันจะเปิดฟังก์ชันสำหรับปุ่มกดของคุณ แต่สำหรับคำสั่งนี้ ฉันคิดว่ามันเหมือนกับของฉัน

สำหรับปุ่มเชื่อมต่อกับหุ่นยนต์:

ภายใต้ฟังก์ชัน pushbutton6_Callback(hObject, eventdata, handles):

ฟังก์ชั่น pushbutton6_Callback(hObject, eventdata, handles) global ros_master_ip

global ros_master_port

โกลบอล teleop_topic_name

หุ่นยนต์ระดับโลก

โลก velmsg

ros_master_uri = strcat('https://', ros_master_ip, ':', ros_master_port)

setenv('ROS_MASTER_URI', ros_master_uri)

โรซินิท

หุ่นยนต์ = rospublisher (teleop_topic_name, 'geometry_msgs/Twist');

velmsg = rosmessage(หุ่นยนต์);

การเรียกกลับนี้จะตั้งค่าตัวแปร ROS_MASTER_URI โดยการต่อ ros_master_ip กับพอร์ต จากนั้นคำสั่ง rosinit จะเริ่มต้นการเชื่อมต่อ หลังจากเชื่อมต่อแล้ว จะสร้างผู้เผยแพร่ของ geometry_msgs/Twist ซึ่งจะใช้สำหรับส่งคำสั่งความเร็ว ชื่อหัวข้อคือชื่อที่เราให้ในกล่องแก้ไข เมื่อการเชื่อมต่อสำเร็จ เราจะสามารถกดปุ่ม Forward, Backward, Left, Right ได้

ก่อนเพิ่มการเรียกกลับไปยังปุ่มกดเดินหน้า ถอยหลัง เราจำเป็นต้องเริ่มต้นความเร็วของความเร็วเชิงเส้นและความเร็วเชิงมุม

ดังนั้นด้านล่าง _OpeningFcn(hObject, eventdata, handles, varargin) กำหนดสิ่งต่อไปนี้ (ดูรูปที่):

global left_spinVelocity ทั่วโลก right_spinVelocity

Global forwardVelocity

โกลบอลย้อนกลับVelocity

left_spinVelocity = 2;

right_spinVelocity = -2;

ความเร็วไปข้างหน้า = 3;

ย้อนกลับความเร็ว = -3;

หมายเหตุ: ความเร็วทั้งหมดอยู่ใน rad/s

เมื่อกำหนดตัวแปรส่วนกลางแล้ว เรามาตั้งโปรแกรมปุ่มกดเคลื่อนไหวกัน

สำหรับปุ่มกดไปข้างหน้า:

ฟังก์ชัน pushbutton4_Callback(hObject, eventdata, handles) global velmsg

หุ่นยนต์ระดับโลก

โกลบอล teleop_topic_name

Global forwardVelocity

velmsg. Angular. Z = 0;

velmsg. Linear. X = ความเร็วไปข้างหน้า;

ส่ง(หุ่นยนต์, velmsg);

latchpub = rospublisher (teleop_topic_name, 'IsLatching', จริง);

ในทำนองเดียวกันสำหรับปุ่มกดย้อนกลับ:

ฟังก์ชัน pushbutton5_Callback(hObject, eventdata, handles)

โลก velmsg

หุ่นยนต์ระดับโลก

โกลบอลย้อนกลับVelocity

โกลบอล teleop_topic_name

velmsg. Angular. Z = 0;

velmsg. Linear. X = ย้อนกลับความเร็ว;

ส่ง(หุ่นยนต์, velmsg);

latchpub = rospublisher (teleop_topic_name, 'IsLatching', จริง);

ในทำนองเดียวกันสำหรับปุ่มกดซ้าย: ฟังก์ชั่น pushbutton3_Callback(hObject, eventdata, handles)

global velmsgglobal หุ่นยนต์ global left_spinVelocity

โกลบอล teleop_topic_name

velmsg. Angular. Z = left_spinVelocity;

velmsg. Linear. X = 0;

ส่ง(หุ่นยนต์, velmsg);

latchpub = rospublisher (teleop_topic_name, 'IsLatching', จริง);

ในทำนองเดียวกันสำหรับปุ่มกดขวา:

โลก velmsgglobal หุ่นยนต์

ทั่วโลก right_spinVelocity

โกลบอล teleop_topic_name

velmsg. Angular. Z = right_spinVelocity;

velmsg. Linear. X = 0;

ส่ง(หุ่นยนต์, velmsg);

latchpub = rospublisher (teleop_topic_name, 'IsLatching', จริง);

เมื่อเพิ่มฟังก์ชันการโทรกลับทั้งหมดและบันทึกไฟล์แล้ว เราสามารถทดสอบตัวควบคุมของเราได้

ขั้นตอนที่ 8: การตั้งค่าการกำหนดค่าเครือข่ายบน ROS PC (Linux)

การตั้งค่าการกำหนดค่าเครือข่ายบน ROS PC (Linux)
การตั้งค่าการกำหนดค่าเครือข่ายบน ROS PC (Linux)
การตั้งค่าการกำหนดค่าเครือข่ายบน ROS PC (Linux)
การตั้งค่าการกำหนดค่าเครือข่ายบน ROS PC (Linux)

เราจะทำการทดสอบคอนโทรลเลอร์บน ros pc (Linux) ซึ่งจะต้องมีการตั้งค่าคอนฟิกเครือข่าย หากคุณใช้งานคอนโทรลเลอร์บน linux pc ด้วย คุณจะต้องตั้งค่าคอนฟิกเครือข่ายที่นั่นด้วย

การกำหนดค่าเครือข่าย:

เปิดหน้าต่างเทอร์มินัลแล้วพิมพ์ gedit.bashrc

เมื่อเปิดไฟล์แล้วให้เพิ่มสิ่งต่อไปนี้:

#การกำหนดค่าเครื่องหุ่นยนต์

ส่งออก ROS_MASTER_URI=https://localhost:11311

#IP address ของ ROS master node

ส่งออก ROS_HOSTNAME=

ส่งออก ROS_IP=

echo "ROS_HOSTNAME: " $ROS_HOSTNAME

echo "ROS_IP:"$ROS_IP

echo "ROS_MASTER_URI:"$ROS_MASTER_URI

คุณต้องทำตามขั้นตอนนี้ทุกครั้งเนื่องจากการกำหนด IP แบบไดนามิก

ขั้นตอนที่ 9: เรียกใช้คอนโทรลเลอร์

เรียกใช้คอนโทรลเลอร์
เรียกใช้คอนโทรลเลอร์

เราจะทดสอบคอนโทรลเลอร์ของเรากับ Turtle bot ใน Gazebo

หากต้องการติดตั้ง Gazebo โปรดดู

หากต้องการติดตั้ง Turtle bot โปรดดูที่

เปิดโฟลเดอร์ที่คุณบันทึกไฟล์.fig และ.m บน MATLAB แล้วกด Run (ดังแสดงในรูปภาพ) ซึ่งจะเป็นการเปิดคอนโทรลเลอร์บนพีซี ก่อนกดเชื่อมต่อ ตรวจสอบให้แน่ใจว่าโปรแกรมจำลองบอทเต่าของคุณทำงาน

วิธีทดสอบการจำลอง TurtleBot ของคุณ:

เปิด Terminal บน Ros pc แล้วพิมพ์: $ roslaunch turtlebot_gazebo turtlebot_world.launch นี่จะเป็นการเปิดการจำลอง Turtlebot บนพีซีเครื่องนั้น ชื่อหัวข้อของ TurtleBot คือ /cmd_vel_mux/input/teleop ซึ่งเราได้ระบุไว้ในแอปพลิเคชันแล้ว พิมพ์ที่อยู่ IP ของ ros pc พอร์ต และชื่อหัวข้อในปุ่มที่แก้ไขได้ และกดปุ่ม เชื่อมต่อกับหุ่นยนต์ บอทเต่าของคุณควรเริ่มเคลื่อนไหวเมื่อคุณกด Forward, Backward ฯลฯ

ในการดูความเร็วเชิงเส้นและเชิงมุม:

เปิดเทอร์มินัลใหม่และพิมพ์คำสั่ง: $ rostopic echo /cmd_vel_mux/input/teleop

และที่นั่น คุณมี ROS Robotic Controller ที่ใช้ Matlab ของคุณเอง หากคุณชอบคำแนะนำของฉันโปรดให้คะแนนในการประกวดผู้แต่งครั้งแรกและแชร์กับผู้คนให้มากที่สุด ขอขอบคุณ.

แนะนำ: