مدلسازی سه بعدی ربات در ROS
اولین گام برای ساخت یک ربات واقعی طراحی و مدلسازی آن است. برای مدلسازی سه بعدی یک ربات میتوانیم از نرمافزارهای CAD نظیر CATIA ،SolidWorks، AutoCAD و امثال آن استفاده کنیم. یکی از اهداف مدلسازی یک ربات، استفاده از آن برای شبیهسازی است. در شبیهسازی است که میتوان بدون صرف وقت و هزینه، عیوب و مشکلات طراحی را شناسایی و آنها را قبل از ساخت برطرف کرد.
مدلی که برای شبیهسازی استفاده میشود بایستی تمامی خواص فیزیکی ربات واقعی را داشته باشد، البته شکل ظاهری ربات میتواند سادهتر از مدل واقعی باشد.
در ROS از شبیه ساز قدرتمند Gazebo برای شبیهسازی رفتار ربات در شرایط گوناگون و بررسی عملکرد کنترلکنندهها و … استفاده میشود، اما لازمه استفاده از این شبیهساز این است که ربات طبق استانداردهای ROS تعریف شده باشد. برای طراحی و ساخت مدل سهبعدی ربات، رآس بسته متایی به نام robot_model در اختیار دارد که شامل بستههایی نظیر urdf، kdl_parser، robot_state_publisher، collada_urdf و امثال آن است که به ما کمک میکنند تا یک مدل سهبعدی از ربات را با تطبیق خوبی با واقعیت ایجاد کنیم.همچنین رآس این امکان را به ما میدهد تا فایل CAD طراحی شده برای اجزای ربات خودمان را نیز به آن بدهیم تا در نمایش گرافیکی شبیهسازی از آن استفاده کند.
در ادامه نحوه ایجاد یک ربات در رآس را به صورت گام به گام آموزش میدهیم.
بستههای ROS برای مدلسازی ربات
رآس دارای بستههای بسیار خوبی است که میتوان از آنها برای مدلسازی سهبعدی ربات استفاده کرد. در این قسمت تعدادی از مهمترین بستههای مرسوم برای ساخت مدل ربات بررسی میشود.
- متا-بسته robot_model: این متا-بسته شامل بستههای مهمی برای مدلسازی است که از جمله مهمترین آنها به شرح زیر است:
- urdf: یکی از مهمترین بستههای موجود در متا-بسته robot_model، بسته urdf است. این بسته حاوی یک تجزیهکننده (پارسر) C++ برای فرمت یکپارچه تعریف ربات (URDF)، به صورت یک فایل xml برای بیان مدل ربات است.
- joint_state_publisher : این ابزار زمانی که مدل ربات را با استفاده از urdf طراحی میکنیم بسیار به ما کمک میکند. این بسته حاوی نودی به نام joint_state_publisher است که مدل تعریف شده برای ربات را میخواند سپس مفاصل آن را شناسایی کرده و مقادیر ارسالی از کاربر را بر روی مفاصل اعمال میکند. امکان تغییر مقادیر هر کدام از مفاصل توسط جابجایی اسلایدر و نمایش گرافیکی حرکت ربات توسط Rviz قابل انجام است. در اینصورت کاربر در هنگام طراحی urdf این امکان را دارد تا دوران و انتقال هر مفصل را با استفاده از این ابزار به خوبی تشخیص بدهد.
- kdl_parser : کتابخانه سینماتیک و دینامیک(KDL) بستهای در ROS است که میتواند با استفاده از اطلاعات فایل urdf یک زنجیره سینماتیکی از ربات ایجاد کند. از این زنجیره سینماتیکی برای انتشار حالت مفاصل و همچنین برای سینماتیک مستقیم و معکوس ربات استفاده میشود.
- robot_state_publisher : این بسته وضعیت فعلی مفاصل ربات را خوانده و سپس با توجه به روابط سینماتیکی ربات که در urdf تعیین شده است، موقعیت فضایی هر کدام از لینکها را محاسبه میکند. لازم به ذکر است که موقعیت فضایی ربات در ROS به صورت ماتریس انتقال(tf) که بیانگر ارتباط بین دستگاهها مختصات ربات است، منتشر میشود.
استفاده از xacro-macro در URDF
xacro : xacro مخفف (XML macro) است و امکان برنامه برنامهنویسی ماکروها به زبان XML رو مهیا میکند. (ماکرو مجموعه ای از دستورات هست که یکبار نوشته میشه و بارها مورد استفاده قرار میگیره). از xacro میتوان برای مدلسازی رباتهای پیچیده استفاده کرد، زیرا در urdf امکان برنامه نویسی، استفاده مجدد از کدها، تعریف ثابتها و پارامترها و عملیات ریاضی وجود ندارد و این باعث طولانی و نامفهوم شدن کدها میشود. درصورتی که با استفاده از xacro میتوان مدل ربات را خواناتر، سادهتر و با قابلیت برنامهنویسی نوشت. این امکان نیز وجود دارد که با ابزارهای رآس، xacro ها را به urdf تبدیل کنیم.
بررسی ساختار URDF
در بخش قبل با urdf آشنا شدید. در این قسمت قصد داریم تا مدلسازی ربات با استفاده از urdf را آموزش دهیم.
برای مدلسازی یک ربات لازم است تا ارتباط بین لینکها و مفاصل آن در فایلی با پسوند .urdf مشخص شود.
در urdf میتوان خصوصیات سینماتکی و دینامیکی ربات اعم از نحوه اتصال لینکها، جرم و اینرسی آن و همچنین مدل مربوط به نمایش گرافیکی(visual) و مدل مربوط به برخورد(collision) را تعریف کرد، برای این کار از یک سری تگهای مخصوص استفاده میشودکه در ادامه به آنها میپردازیم.
تذکر: برای درک بهتر ساختار تگها لازم است تا مقداری با xml آشنایی داشته باشید.
در urdf برای هر تگ خواص و المانهایی تعریف شده است که بنابر نیاز میتوان از آنها استفاده کرد، البته بعضی از آنها اجباری هستند. در شکل زیر این المانهای به صورت کلی آورده شدهاند.
در ادامه به توضیح هر کدام از این بخش های میپردازیم
۱-تگ Link:
تگ link معرف یک لینک یا عضو مجزا از ربات میباشد. با استفاده از این تگ ما میتوانیم یک لینک از ربات را به همراه خصوصیات هندسی( نظیر اندازه، شکل، رنگ و حتی مدل CAD سه بعدی) و همچنین خصوصیات فیزیکی ( نظیر جرم، اینرسی و خواص برخورد)، مدل کنیم.
ساختار کلی این تگ به صورت زیر است:
<link name="my_link">
<inertial>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" iyz="0" izz="100" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="1 1 1" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder radius="1" length="0.5"/>
</geometry>
</collision>
</link>
همانطور که در مثال بالا مشاهده میکنید تگ link از سه المان اصلی زیر تشکیل شده است:
<link name="<name of the link>">
<inertial>...........</inertial>
<visual> ............</visual>
<collision>..........</collision>
</link>
اجازه دهید تا برای درک بهتر، ساختار این تگ را به صورت درختی نشان دهیم:
که هر کدام از این المانها نیز دارای المانها و خواصی میباشند.
۱- تگ Inertial
تگ inertial برای تعیین خصوصیات دینامیکی لینک مورد نظر میباشد به این ترتیب شما میتوانید با استفاده از پارامترهای زیر خصوصیات دینامیکی لینک مورد نظر خودتان را مشخص کنید.
xyz بیانگر مختصات مرکز جرم لینک و مرکز دستگاه مختصات اینرسی(inertial)، نسبت به دستگاه مرجع لینک(link origin) بوده و همچنینrpy نیز دوران دستگاه مختصات اینرسی نسبت به دستگاه مرجع لینک را بیان میکند.(به شکل زیر نگاه کنید) .
در این تگ جرم لینک بر اساس کیلوگرم تعیین میشود.
در این قسمت ماتریس اینرسی دورانی لینک موردنظر حول محورهای تعیین شده در تگ origine بیان میشود. از آنجایی که ماتریس اینرسی دورانی متقارن است با تعیین ۶ پارامتر مستقل ixx, ixy, ixz, iyy, iyz, izz. این ماتریس توصیف میشود. دقت داشته باشید که مقادیر این ماتریس باید بر اساس قرارگیری محورهای دستگاه اینرسی در مرکزجرم لینک محاسبه شده باشند. برای استخراج این مقادیر برای لینکهای دارای پیچیدگی هندسی میتوانید از نرمافزارهای CAD استفاده کنید.
۲-تگ های <visual> و <collision>
مدل <visual> بیانگر ناحیه واقعی لینک با شکل ظاهری احتمالاً پیچیده است و مدل <collision> بیانگر ناحیه دربرگیرنده مدل واقعی لینک، با ظاهری ساده است که از آن برای محاسبات برخورد در شبیهسازی استفاده میشود.
در المان های <visual> و <collision> تگ <origin> بیانگر وضعیت این المانها نسبت به دستگاه مرجع لینک میباشد.
در تگ <geometry> میتوان شکل هندسی مدل را در هر دو حالت <visual> و <collision> تعیین کرد. برای این کار دو روش موجود است:
-
استفاده از المانهای استاندارد مکعب، استوانه و کره
- <box> : شامل سه ضلع یک مکعب به صورت( size=”1 1 1″ )و مبدأ مختصات در مرکز
- <cylinder> : شامل شعاع و طول استوانه به صورت (radius=”1″ length=”0.5″) و مبدأ مختصات در مرکز با جهت گیری به صورت زیر :
- <sphere> : شامل شعاع به صورت (radius=”1″) و مبدأ مختصات در مرکز
-
ارجاع به یک فایل CAD با استفاده از تگ <mesh>
در این حالت باید فایل CAD مربوط به لینک مورد نظر را با پسوندهای.dae و یا .stl در پوشه محلی پکیج مورد نظر قرار داد و آدرس آن را در این تگ به صورت زیر وارد کرد.
<mesh filename="package://package_name/meshes/link.dae" scale="1 1 1" />
در تگ <color> نیز میتوانید رنگ دلخواه را برای هر لینک انتخاب کنید.
۲-تگ Joint :
تگ joint مشخص کننده مفاصل ربات است. در این تگ نیز ما میتوانیم ویژگیهای سینماتیکی و دینامیکی مفاصل را تعیین کنیم. همچنین میتوانیم محدودههای مجاز برای جابجایی و سرعت مفاصل را مشخص کنیم. تگ joint انواع مختلف مفاصل نظیر دورانی(revolute)، کشویی(prismatic)، پیوسته(continuous )، ثابت(fixed)، شناور(floating ) و صفحهای(planar) را پشتیبانی میکند.
ساختار کلی المانها و خواص این تگ به صورت زیر است:
<joint name="my_joint" type="floating">
<origin xyz="0 0 1" rpy="0 0 3.1416"/>
<parent link="link1"/>
<child link="link2"/>
<calibration rising="0.0"/>
<dynamics damping="0.0" friction="0.0"/>
<limit effort="30" velocity="1.0" lower="-2.2" upper="0.7" />
<safety_controller k_velocity="10" k_position="15" soft_lower_limit="-2.0" soft_upper_limit="0.5" />
</joint>
یک مفصل در urdf از اتصال بین دو لینک تشکیل میشود، به این صورت که لینک اول Parent و لینک دوم Child نامیده میشود. در شکل زیر یک مفصل به همراه لینکهای آن مشاهده میشود.
المانها و خواص تگ joint
ابتدا اجازه بدهید تا تعریفی از هر کدام از انواع این مفاصل ارائه دهیم.
- دورانی: در این نوع اتصال که به آن لولایی نیز میگویند چرخش حول یک محور است و دارای حد بالا و حد پایین است.
- پیوسته: این اتصال همانند اتصال دورانی است با این تفاوت که محدویت دوران ندارد
- کشویی: در این نوع اتصال، حرکت لغزشی در امتداد یک محور و در یک محدوده بالا و پایین انجام میشود.
- ثابت: در واقع مفصل نیست زیرا حرکتی ندارد و تمام درجات آزادی در آن قفل است.
- شناور: در این اتصال هر شش درجه آزادی قابلیت حرکت دارد.
- صفحهای: در این اتصال قابلیت حرکت در یک صفحه عمود بر یک محور وجود دارد.
تگ joint دارای ویژگیهای زیر است:
- name : مشخص کردن نام مفصل
- type : مشخص کردن نوع مفصل
المانها
در این تگ، فاصله محل قرارگیری مبدأ لینک child از مبدأ دستگاه parent که به عنوان مفصل این دو لینک شناخته خواهد شد، تعیین میشود. برای درک بیشتر تصویر بالا را نگاه کنید. به صورت پیشفرض اگر این مقدار تنظیم نشود، مبدأ دو لینک روی هم قرار میگیرد.
در این قسمت نام لینک parent آورده میشود.
در این قسمت نام لینک child آورده میشود.
این تگ برای مشخص کردن محور دوران در مفاصل دورانی، راستای حرکت در مفاصل کشویی و بردار نرمال صفحه در مفاصل صفحهای است، که تعیین میکند لینک حول چه محوری دوران یا حرکت کند. مقدار پیشفرض آن (۱,۰,۰) است که به معنی دوران در جهت محور x دستگاه متصل به لینک parent است. دقت داشته باشید که برای دوران حول محوری غیر از محورهای اصلی باید بردار مربوطه نرمال شده باشد. البته به این نکته نیز توجه داشته باشید که بهتر است محورها را به صورت استاندارد تعریف کنید تا همیشه دوران حول محورهای اصلی باشد.
این گزینه آپشنال بوده و ضروری نیست و برای مواردی استفاده میشود که نیاز باشد موقعیت مرجع یک مفصل کالیبره شود تا موقعیت مطلق آن بدست آید.
این گزینه هم، آپشنال بوده و توسط آن میتوان خواص فیزیکی مفصل را مشخص کرد، این دادهها برای قسمت شبیهسازی مفید است. این خواص شامل damping و friction است.
این گزینه تنها برای مفاصل دورانی و کشویی ضروری است و محدودیت های مفاصل در آن تعیین میشود و شامل موارد زیر است.
- Lower : حد پایین حرکت مفصل(مقادیر بر حسب رادیان برای مفاصل دورانی و متر برای مفاصل کشویی، درصورتی که مفصل پیوسته باشد این پارامتر نباید مقداردهی شود.)
- Upper : حد بالای حرکت مفصل.
- Effort : این گزینه برای تعیین کردن حداکثر نیرو یا گشتاور مجاز اعمالی به مفصل میباشد.
- velocity : این گزینه برای تعیین کردن حداکثر سرعت مجاز مفصل میباشد.
- Mimic (optional)
از این تگ زمانی استفاده میشود که بخواهیم بین دو مفصل قید حرکتی ایجاد کنیم به گونهای که یک مفصل حرکت دیگری را تقلیدکند. برای این کار دو پارامتر multiplier و offset برای تعیین حرکت مفصل جدید از طریق رابطه زیر در این تگ قابل تنظیماند.
value = multiplier * other_joint_value + offset.
-
safety_controller (optional)
در این تگ پارامترهای زیر تعیین میشوند:
- soft_lower_limit : این پارامتر حد پایین مقداری است که کنترلر برای حفظ ایمنی، با رسیدن مفصل به آن شروع به محدود کردن موقعیت مفصل میکند.
- soft_upper_limit : این پارامتر حد بالای حالت بالایی است.
- k_position : این پارامتر بیانگر ارتباط بین محدودههای سرعت و موقعیت است.
- k_velocity : این پارامتر بیانگر ارتباط بین محدودههای نیرو و سرعت است.
برای درک بهتر میتوانید نمودارهای زیر را مشاهده کنید.
تگهای transmission و gazebo برای تنظیمات تخصصی تر میباشد که در آینده به توضیح آنها خواهیم پرداخت.
تگGazebo ، transmission