3-4- برنامه‌نویسی ‌شبیه‌سازی TurtleBot  با rospy

ربات‌های متعددی در بازار وجود دارند که به طور کامل در رآس و اوبونتو اجرا می‌شوند. سری­های TurtleBot روبات کم هزینه­ای هستند که برای آموزش و تحقیقات مورد استفاده قرار می‌گیرند. در مورد ربات TurtleBot 2 در وب[34] می توانید اطلاعات بیشتری کسب کنید. اگر می‌خواهید آخرین نسخه TurtleBot را بررسی کنید، به آدرس اینترنتی[35] آن بروید.

در این قسمت ما TurtleBot 2 را برنامه­نویسی می‌کنیم. به نحوه­ی نصب بسته‌های TurtleBot 2 و نحوه­ی شبیه‌سازی آن در Gazebo نگاه می‌کنیم و کد‌هایی که برای turtlesim توسعه دادیم را روی ربات‌های TurtleBot 2 و 3 به کار می گیریم. اولین گام نصب بسته TurtleBot 2 است.

3-4-1- نصب بسته TurtleBot 2

بسته‌های TurtleBot در حال حاضر در مخزن رآس موجود هستند، بنابراین فقط باید آنها را نصب کنیم.

اولین قدم این است که فهرست بسته‌ها را با استفاده از دستور زیر به­روز کنید.

$ sudo apt-get update

نصب بسته‌های شبیه‌سازی turtlebot با دستور زیر صورت می گیرد:

$ sudo apt-get install ros-kinetic-turtlebot-gazebo ros-kinetic-turtlebot-simulator ros-kinetic-turtlebot-description ros-kinetic-turtlebot-teleop

بسته‌های فوق محیط شبیه‌سازی TurtleBot را در Ubuntu 16.04 LTS نصب می‌کنند.

3-4-2- راه‌اندازی ‌شبیه‌سازی TurtleBot

بعد از نصب بسته‌های TurtleBot، شبیه‌ساز TurtleBot 2 را با استفاده از دستور زیر راه­اندازی کنید.

M نکته: ممکن است زمان بارگذاری محیط در Gazebo طول بکشد. در ابتدا پنجره Gazebo ممکن است سیاه باشد زیرا برخی از فایل‌های مش سه­بعدی در حال دانلود هستند. زمان لازم برای تکمیل دانلود وابسته به سرعت اینترنت شما است. اگر احساس می‌کنید Gazebo گیر کرده است، با فشار دادن Ctrl + C آن را لغو کرده و دوباره آن را اجرا کنید.

$ roslaunch turtlebot_gazebo turtlebot_world.launch

این دستور یک فایل راه‌اندازی رآس را از بسته turtlebot_gazebo راه‌اندازی می‌کند. اگر بارگذاری شبیه‌ساز با موفقیت انجام شود، پنجره­ای مانند شکل 5-30 دریافت می‌کنید.

شکل ‏5‑30: شبیه­سازی گزبو TurtleBot 2

اگر قصد دارید ربات را در محیط اطرافش حرکت دهید، ترمینال جدیدی را باز کرده و دستور زیر را اجرا کنید.

$ roslaunch turtlebot_teleop keyboard_teleop.launch

هنگام اجرای این دستور، پیام‌های زیر را در ترمینال دریافت می‌کنید. روی ترمینال با استفاده از ماوس کلیک کنید و کلیدهای ذکر شده در ترمینال را فشار دهید. شما می‌توانید ربات را با استفاده از کلیدهای I، J و L حرکت دهید (به شکل 5-31 نگاه کنید).

شکل ‏5‑31: برنامه کاربردی turtleBot 2 teleop

اگر می‌خواهید ربات را متوقف کنید، کلید اسپیس را فشار دهید، و اگر می‌خواهید شبیه‌سازی یا teleoperation را متوقف کنید، کافی است Ctrl + C را فشار دهید.

3-4-3- حرکت کردن یک مسافت ثابت با گره پایتون

در این بخش، ربات را در یک مسافت ثابت با استفاده از گره‌ای که در turtlesim استفاده کردیم حرکت می‌دهیم. برای این­کار تغییراتی در گره mov_distance.py ایجاد می­کنیم.

برای turtlebot

  • تاپیک پیام Twist سرعت به صورت /cmd_vel_mux/input/teleop است و نوع پیام آن  geometry_msgs/Twistمی باشد.
  • تاپیک بازخورد موقعیت ربات به صورت /odomاست و نوع پیام آن  nav_msgs/Odometry می باشد.

تعریف odometry را با دستور زیر دریافت می­کنیم.

$ rosmsg show nav_msgs/Odometry

این یک نوع پیام پیش­ساخته در رآس است.

برای استفاده از این پیام‌ها باید ماژول‌هایشان را وارد کنیم. منطق حرکت روبات همان است که در لاک‌پشت بود. مسافت جهانی مدنظر است. مبدأ اولیه ربات 0،0،0 است.

#!/usr/bin/env python

import rospy

from geometry_msgs.msg import Twist

from nav_msgs.msg import Odometry

import sys

robot_x = 0

def pose_callback(msg):

global robot_x

#Reading x position from the Odometry message

robot_x = msg.pose.pose.position.x

rospy.loginfo(“Robot X = %f\n”,robot_x)

def move_turtle(lin_vel,ang_vel,distance):

global robot_x

rospy.init_node(‘move_turtlebot’, anonymous=False)

#The Twist topic is /cmd_vel_muc/input/teleop

pub = rospy.Publisher(‘/cmd_vel_mux/input/teleop’, Twist,

queue_size=10)

#Position topic is /odom

rospy.Subscriber(‘/odom’,Odometry, pose_callback)

rate = rospy.Rate(10) # 10hz

vel = Twist()

while not rospy.is_shutdown():

vel.linear.x = lin_vel

vel.linear.y = 0

vel.linear.z = 0

vel.angular.x = 0

vel.angular.y = 0

vel.angular.z = ang_vel

#rospy.loginfo(“Linear Vel = %f: Angular Vel = %f”,lin_vel,ang_vel)

if(robot_x >= distance):

rospy.loginfo(“Robot Reached destination”)

rospy.logwarn(“Stopping robot”)

break

pub.publish(vel)

rate.sleep()

if __name__ == ‘__main__’:

try:

move_turtle(float(sys.argv[1]),float(sys.argv[2]),float(sys.argv[3]))

except rospy.ROSInterruptException:

pass

کد را با استفاده از دستور زیر اجرا کنید.

$ roslaunch turtlebot_gazebo turtlebot_world.launch

اکنون می­توانید شبیه‌سازی TurtleBot را شروع کنید.

گره مسافت حرکت را با گزاره خط‌فرمان اجرا کنید (به شکل 5-32 نگاه کنید).

$ rosrun hello_world move_turtlebot.py 0.2 0 3

شکل ‏5‑32: حرکت TurtlesBot2 به اندازه  3 متر از مبدا

3-4-4- یافتن موانع

با استفاده از منطق مشابه، می‌توانیم موانع اطراف TurtleBot را پیدا کنیم. کافی است مشترک تاپیک اسکن لیزر TurtleBot که محدوده موانع در اطراف ربات را بیان می کند، شوید.

Topic: /scan

Message Type: sensor_msgs/LaserScan

همچنین، با استفاده از دستور زیر، تمام فیلدهای داخل پیام را می­توانید دریافت ‌کنید.

$ rosmsg show sensor_msgs/LaserScan

ایجاد یک برنامه اجتناب از مانع در رآس یک تمرین خوب برای شما خواهد بود.

[34] www.turtlebot.com/turtlebot2

[35] http://emanual.robotis.com/docs/en/platform/turtlebot3/overview