سبق 10.3: فزکس کنفیگریشن (Physics Configuration)
آپ ماڈلز اور لائٹنگ کے ساتھ خوبصورت SDF دنیا بنا سکتے ہیں، لیکن اگر فزکس (طبیعیات) غلط ہے، تو آپ کا روبوٹ غلط طریقے سے کام کرے گا۔ ایک روبوٹ جسے غلط کشش ثقل (gravity) یا رگڑ (friction) والی دنیا میں چلنے کے لیے ٹرین کیا گیا ہو، جب اسے حقیقی دنیا میں تعینات کیا جائے گا تو وہ کام نہیں کرے گا۔
یہ سبق آپ کو Gazebo کے فزکس انجن کو کنفیگر کرنا سکھائے گا تاکہ سمولیشن (نقالی) حقیقت سے مماثل ہو۔ آپ فزکس انجن کا انتخاب کرنا، درستگی کے لیے سٹیپ سائز سیٹ کرنا، رگڑ اور رابطے کی خصوصیات کو کنفیگر کرنا، اور عام فزکس کے مسائل کو ڈیبگ کرنا سیکھیں گے۔
Gazebo میں فزکس انجن
Gazebo تین فزکس انجنوں کو سپورٹ کرتا ہے، جن میں درستگی اور کارکردگی کی مختلف خصوصیات ہیں:
DART (تجویز کردہ)
نام: Dynamic Animation and Robotics Toolkit طاقتیں: مستحکم (Stable)، درست (Accurate)، ملٹی باڈی سسٹمز کے لیے اچھا کمزوریاں: بہت بڑی دنیاؤں کے ساتھ سست ہو سکتا ہے بہترین: زیادہ تر روبوٹکس ایپلی کیشنز کے لیے (پہلے سے طے شدہ انتخاب)
کنفیگریشن:
<physics name="default_physics" type="dart">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
</physics>
ODE (Open Dynamics Engine)
نام: Open Dynamics Engine طاقتیں: تیز، سادہ مناظر کے لیے اچھا کمزوریاں: پیچیدہ ٹکراؤ (collisions) کے ساتھ کم مستحکم، جھنجھناہٹ (jittering) دکھا سکتا ہے بہترین: سادہ دنیاؤں کے لیے جہاں رفتار اہم ہو
کنفیگریشن:
<physics name="default_physics" type="ode">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
<solver>
<type>quick</type>
<iters>20</iters>
</solver>
</physics>
Bullet
نام: Bullet Physics Engine طاقتیں: بہت مستحکم، نرم باڈی فزکس (soft-body physics) کے لیے اچھا کمزوریاں: ODE سے سست ہو سکتا ہے بہترین: پیچیدہ رابطے کے منظرناموں (contact scenarios)، نرم باڈی اشیاء کے لیے
کنفیگریشن:
<physics name="default_physics" type="bullet">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
</physics>
تجویز: زیادہ تر روبوٹکس کام کے لیے DART استعمال کریں۔ صرف ODE پر سوئچ کریں اگر DART بہت سست ہے۔ اگر آپ کو جدید رابطے کی ماڈلنگ کی ضرورت ہو تو Bullet استعمال کریں۔
سٹیپ سائز کو سمجھنا (max_step_size)
فزکس انجن ایک فلم کی طرح کام کرتا ہے۔ یہ وقت کو "سٹیپس" نامی الگ فریموں میں تقسیم کرتا ہے۔ ہر سٹیپ پر، انجن یہ کرتا ہے:
- موجودہ حالت (پوزیشنز، ویلوسٹیز) پڑھتا ہے
- قوتوں اور ایکسلریشنز کا حساب لگاتا ہے
- نئی پوزیشنز اور ویلوسٹیز معلوم کرنے کے لیے حرکت کے مساوات کو انٹیگریٹ کرتا ہے
- ٹکراؤ کا پتہ لگاتا ہے
- ٹکراؤ کی قوتیں لاگو کرتا ہے
سٹیپ سائز یہ ہے کہ ہر ٹائم سٹیمپ کتنا طویل ہے (سیکنڈ میں)۔
چھوٹا سٹیپ سائز (درست لیکن سست)
<max_step_size>0.0001</max_step_size> <!-- 0.1 ملی سیکنڈ کے سٹیپس -->
فائدے: بہت درست، ہموار حرکت، مستحکم ٹکراؤ نقصانات: سمولیشن سست (ایک سیکنڈ میں 10,000 سٹیپس لیتا ہے) استعمال کا معاملہ: اہم فزکس تجربات، درست کنٹرول الگورتھم
درمیانہ سٹیپ سائز (متوازن)
<max_step_size>0.001</max_step_size> <!-- 1 ملی سیکنڈ کے سٹیپس -->
فائدے: درستگی اور رفتار کا اچھا توازن (روبوٹکس کے لیے معیاری) نقصانات: زیادہ تر ایپلی کیشنز کے لیے کوئی خاص نہیں استعمال کا معاملہ: تقریباً تمام روبوٹکس سمولیشنز (تجویز کردہ)
بڑا سٹیپ سائز (تیز لیکن غیر درست)
<max_step_size>0.01</max_step_size> <!-- 10 ملی سیکنڈ کے سٹیپس -->
فائدے: بہت تیز سمولیشن، فوری تکرار (iteration) نقصانات: ٹکراؤ چھوٹ سکتے ہیں، اشیاء ایک دوسرے سے گزر سکتی ہیں، جھٹکے والی حرکت استعمال کا معاملہ: فوری جانچ جہاں اعلیٰ درستگی کی ضرورت نہ ہو
عمومی اصول: اپنے ڈیفالٹ کے طور پر 0.001s (1 ملی سیکنڈ) استعمال کریں۔ اگر سمولیشن بہت سست ہے، تو 0.002s یا 0.005s آزما کریں۔ اگر فزکس غلط لگ رہا ہے (اشیاء ایک دوسرے سے گزر رہی ہیں)، تو چھوٹے سٹیپ سائز آزمائیں۔
ریئل ٹائم فیکٹر (Real-Time Factor)
real_time_factor وال-کلاک ٹائم (حقیقی وقت) کے مقابلے میں سمولیشن کی رفتار کو کنٹرول کرتا ہے:
<real_time_factor>1.0</real_time_factor>
real_time_factor = 1.0
- سمولیشن کا 1 سیکنڈ = حقیقی وقت کا 1 سیکنڈ
- روبوٹ نارمل رفتار سے چلتا ہے
- دیکھنے اور تکرار کے لیے آرام دہ
real_time_factor = 2.0
- سمولیشن کا 1 سیکنڈ = حقیقی وقت کا 0.5 سیکنڈ
- ہر چیز دوگنی تیزی سے ہوتی ہے
- فوری جانچ کے لیے اچھا
real_time_factor = 0.5
- سمولیشن کا 1 سیکنڈ = حقیقی وقت کا 2 سیکنڈ
- ہر چیز سست روی میں ہوتی ہے
- تیز حرکیات (dynamics) کو تفصیل سے دیکھنے کے لیے اچھا
اہم: real_time_factor کو تبدیل کرنے سے سٹیپ سائز یا سمولیشن کی درستگی پر اثر نہیں پڑتا۔ یہ صرف یہ تبدیل کرتا ہے کہ سمولیشن آپ کے وال کلاک کے مقابلے میں کتنی تیزی سے چلتا ہے۔ نارمل آپریشن اور ڈویلپمنٹ کے لیے 1.0 استعمال کریں۔
رگڑ اور رابطے کی خصوصیات (Friction and Contact Properties)
اشیاء رگڑ اور رابطے کی قوتوں کے ذریعے تعامل کرتی ہیں۔ Gazebo آپ کو ہر میٹریل کے لیے ان خصوصیات کو کنفیگر کرنے دیتا ہے۔
SDF میں رگڑ سیٹ کرنا
رگڑ ٹکراؤ کی سطح پر متعین کی جاتی ہے (فزکس کا پوشیدہ سائز، بصری سائز سے مختلف):
<collision name="collision">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu>0.5</mu>
<mu2>0.5</mu2>
</ode>
</friction>
</surface>
</collision>
mu اور mu2: رگڑ کے گتانک (coefficients) (0 سے بہت زیادہ)
- 0: کوئی رگڑ نہیں (فریشن لیس برف)
- 0.1 - 0.3: بہت پھسلن والا (شیشہ، چکنائی والی سطحیں)
- 0.5 - 0.7: نارمل رگڑ (لکڑی، کنکریٹ)
- 1.0+: زیادہ رگڑ (ربڑ، سینڈ پیپر)
میٹریل کے لحاظ سے عام اقدار:
- اسٹیل آن اسٹیل: mu = 0.6
- ربڑ آن کنکریٹ: mu = 0.8
- پلاسٹک آن پلاسٹک: mu = 0.5
- پہیہ آن زمین: mu = 1.0
رابطے کی خصوصیات (Contact Properties)
رگڑ کے علاوہ، آپ رابطے کی سختی (stiffness) اور ڈیمپنگ (damping) کو کنفیگر کر سکتے ہیں:
<surface>
<friction>
<ode>
<mu>0.5</mu>
<mu2>0.5</mu2>
</ode>
</friction>
<contact>
<ode>
<kp>10000000</kp> <!-- رابطے کی سختی (سپرنگ کانسٹنٹ) -->
<kd>1000</kd> <!-- رابطے کی ڈیمپنگ (رابطے میں رگڑ) -->
</ode>
</contact>
</surface>
kp (رابطے کی سختی):
- زیادہ اقدار = سخت رابطہ (اشیاء زیادہ نہیں دبتی ہیں)
- کم اقدار = نرم رابطہ (اشیاء زیادہ دبتی ہیں، اچھال والی)
- عام رینج: 1,000,000 سے 10,000,000
kd (رابطے کی ڈیمپنگ):
- زیادہ اقدار = زیادہ توانائی کا اخراج (کم اچھال والی)
- کم اقدار = کم ڈیمپنگ (زیادہ اچھال والی)
- عام رینج: 100 سے 10,000
عملی ٹیوننگ:
<!-- نرم، اچھال والا رابطہ (گیند، ٹینس بال) -->
<kp>1000000</kp>
<kd>100</kd>
<!-- نارمل، مستحکم رابطہ (زیادہ تر اشیاء) -->
<kp>10000000</kp>
<kd>1000</kd>
<!-- سخت، غیر اچھال والا رابطہ (دھات پر دھات) -->
<kp>100000000</kp>
<kd>10000</kd>
عام فزکس کے مسائل اور حل
مسئلہ 1: اشیاء زمین سے نیچے گرنا
علامت: آپ کا روبوٹ یا اشیاء زمین کے طیارے سے گزر کر غائب ہو جاتی ہیں۔
وجوہات:
- زمینی طیارے کی ٹکراؤ کی جیومیٹری غائب ہے یا غلط کنفیگر کی گئی ہے
- فزکس سٹیپ سائز بہت بڑا ہے (ٹکراؤ چھوٹ گئے)
- آبجیکٹ کو نیچے کی طرف ابتدائی رفتار کے ساتھ بنایا گیا ہے
حل:
<!-- حل 1: زمین کے طیارے کے لیے مناسب ٹکراؤ کو یقینی بنائیں -->
<model name="ground_plane">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
</collision>
</link>
</model>
<!-- حل 2: سٹیپ سائز کم کریں -->
<physics name="default_physics" type="dart">
<max_step_size>0.0005</max_step_size> <!-- چھوٹے سٹیپس -->
</physics>
<!-- حل 3: اسٹارٹ اپ پر آبجیکٹ کو زمین سے اوپر رکھیں -->
<include>
<uri>model://openrobotics/table</uri>
<pose>0 0 1.0 0 0 0</pose> <!-- z=1.0 اونچائی کو یقینی بناتا ہے -->
</include>
مسئلہ 2: اشیاء کا جھنجھنانا یا کمپن کرنا
علامت: اشیاء بے قابو ہو کر کانپتی ہیں، زمین پر جھنجھناتی ہیں۔
وجوہات:
- سٹیپ سائز بہت بڑا ہے (انٹیگریشن میں عدم استحکام)
- رابطے کی سختی بہت زیادہ ہے (اوسکیلیٹنگ قوتیں)
- رگڑ کے گتانک غیر حقیقی ہیں
حل:
<!-- حل 1: سٹیپ سائز کم کریں -->
<physics name="default_physics" type="dart">
<max_step_size>0.0005</max_step_size> <!-- ڈیفالٹ کا آدھا -->
</physics>
<!-- حل 2: رابطے کی خصوصیات کو ٹیون کریں -->
<contact>
<ode>
<kp>5000000</kp> <!-- کم سختی -->
<kd>2000</kd> <!-- توانائی جذب کرنے کے لیے زیادہ ڈیمپنگ -->
</ode>
</contact>
<!-- حل 3: حقیقی رگڑ استعمال کریں -->
<friction>
<ode>
<mu>0.7</mu> <!-- نارمل رگڑ گتانک -->
<mu2>0.7</mu2>
</ode>
</friction>
مسئلہ 3: اشیاء غیر متوقع طور پر اچھالنا
علامت: اشیاء زمین سے ٹکرانے پر اچھالتی ہیں، جیسے وہ ربڑ کی بنی ہوں۔
وجوہات:
- رابطے کی ڈیمپنگ (kd) بہت کم ہے
- رگڑ کے گتانک بہت کم ہیں
- اشیاء میں زیادہ ریسٹیٹیوشن (اچھال) ہے
حل:
<!-- اچھال کم کریں -->
<contact>
<ode>
<kp>10000000</kp>
<kd>10000</kd> <!-- بہت زیادہ ڈیمپنگ -->
</ode>
</contact>
<!-- پھسلنے سے روکنے کے لیے زیادہ رگڑ -->
<friction>
<ode>
<mu>1.0</mu>
<mu2>1.0</mu2>
</ode>
</friction>
<!-- متبادل: Bullet انجن استعمال کریں (زیادہ مستحکم ڈیمپنگ) -->
<physics name="default_physics" type="bullet">
<max_step_size>0.001</max_step_size>
</physics>
مسئلہ 4: سمولیشن بہت سست ہے
علامت: Gazebo آہستہ چلتا ہے، جس سے ڈویلپمنٹ مشکل ہو جاتی ہے۔
وجوہات:
- سٹیپ سائز بہت چھوٹا ہے
- فزکس انجن غیر ضروری حساب کر رہا ہے
- دنیا بہت پیچیدہ ہے (بہت سی اشیاء، تفصیلی میشز)
حل:
<!-- سٹیپ سائز بڑھائیں (رفتار کے لیے درستگی کی قربانی دیں) -->
<physics name="default_physics" type="dart">
<max_step_size>0.002</max_step_size> <!-- 1ms کے بجائے 2ms -->
</physics>
<!-- تیز سمولیشن کے لیے ODE استعمال کریں -->
<physics name="default_physics" type="ode">
<max_step_size>0.001</max_step_size>
<solver>
<type>quick</type>
</solver>
</physics>
<!-- دنیا کو سادہ بنائیں: غیر ضروری اشیاء ہٹائیں، سادہ میشز استعمال کریں -->
<!-- اگر ضرورت نہ ہو تو سائے (shadows) کو غیر فعال کریں -->
<scene>
<shadows>false</shadows> <!-- تیز رینڈرنگ -->
</scene>
ایک مکمل فزکس کنفیگریشن مثال
یہاں ایک دنیا ہے جس میں ایک موبائل روبوٹ کے لیے احتیاط سے ٹیون کی گئی فزکس ہے:
<?xml version="1.0"?>
<sdf version="1.6">
<world name="physics_tuned_world">
<!-- اعتدال پسند سٹیپ سائز کے ساتھ DART فزکس -->
<physics name="default_physics" type="dart">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
</physics>
<!-- زمین کی کشش ثقل -->
<gravity>0 0 -9.81</gravity>
<scene>
<ambient>0.4 0.4 0.4 1</ambient>
<background>0.7 0.7 0.7 1</background>
<shadows>true</shadows>
</scene>
<light type="directional" name="sun">
<cast_shadows>true</cast_shadows>
<pose>0 0 10 0 0 0</pose>
<diffuse>0.8 0.8 0.8 1</diffuse>
<direction>-0.5 0.5 -1</direction>
</light>
<!-- اچھی رگڑ کے ساتھ زمینی طیارہ -->
<model name="ground_plane">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
<surface>
<friction>
<ode>
<mu>1.0</mu>
<mu2>1.0</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
<material>
<ambient>0.8 0.8 0.8 1</ambient>
<diffuse>0.8 0.8 0.8 1</diffuse>
</material>
</visual>
</link>
</model>
<!-- ٹیبل: مستحکم رابطے کی خصوصیات -->
<include>
<uri>https://fuel.gazebosim.org/1.0/openrobotics/models/table/tip/master</uri>
<pose>2 2 0 0 0 0</pose>
<name>work_table</name>
</include>
</world>
</sdf>
فزکس کی توثیق: اپنی کنفیگریشن کی جانچ کرنا
فزکس سیٹ اپ کرنے کے بعد، اس کی توثیق کریں:
ٹیسٹ 1: کشش ثقل کا ٹیسٹ
- ایک چھوٹی سی چیز (ماڈل) کو z=1.0 پر رکھیں۔
- سمولیشن چلائیں۔
- تصدیق کریں کہ یہ زمین پر گر کر رک جاتا ہے (اچھالتا یا جھنجھناتا نہیں ہے)
ٹیسٹ 2: رگڑ کا ٹیسٹ
- ایک چیز کو افقی طور پر دھکیلیں (ROS 2 یا Gazebo GUI کا استعمال کرتے ہوئے)
- تصدیق کریں کہ یہ پھسلتی ہے اور پھر رک جاتی ہے (ہمیشہ کے لیے نہیں پھسلتی یا فوری نہیں رکتی)
ٹیسٹ 3: ٹکراؤ کا ٹیسٹ
- ایک چیز کو دوسری چیز پر گرائیں۔
- تصدیق کریں کہ وہ ٹکراتے ہیں اور رابطے میں رہتے ہیں (جھنجھناتے یا ایک دوسرے سے گزرتے نہیں ہیں)
ٹیسٹ 4: ملٹی-باڈی ٹیسٹ
- اگر آپ کے روبوٹ کے کئی چلنے والے حصے ہیں (پہیے، بازو)
- تصدیق کریں کہ تمام حصے ہموار طریقے سے ایک ساتھ حرکت کرتے ہیں
AI کے ساتھ کوشش کریں
سیٹ اپ: SDF ورلڈ فائلوں کے ساتھ ایک ٹیکسٹ ایڈیٹر تیار رکھیں۔ اپنے AI اسسٹنٹ تک رسائی حاصل کریں۔
پرامپٹ 1 (انتخاب):
میں کنکریٹ پر ایک موبائل روبوٹ کے لیے Gazebo سمولیشن بنا رہا ہوں۔
کیا مجھے DART، ODE، یا Bullet فزکس انجن استعمال کرنا چاہیے؟
آپ کون سا سٹیپ سائز تجویز کریں گے؟
ٹریڈ آف (tradeoffs) کی وضاحت کریں۔
متوقع نتیجہ: AI انجن کے فرق کی وضاحت کرتا ہے اور متوازن درستگی/رفتار کے لیے DART اور 0.001s سٹیپ سائز تجویز کرتا ہے۔
پرامپٹ 2 (کنفیگریشن):
میں مندرجہ ذیل کے لیے حقیقی رگڑ کو کنفیگر کرنا چاہتا ہوں:
1. کنکریٹ کا فرش (mu = ؟)
2. ربڑ کے پہیے (mu = ؟)
3. دھاتی روبوٹ فریم (mu = ؟)
ہر ایک کے لیے SDF رگڑ کنفیگریشن لکھیں۔
متوقع نتیجہ: AI حقیقی رگڑ کے گتانک تجویز کرتا ہے اور XML کے ٹکڑے فراہم کرتا ہے۔
پرامپٹ 3 (خرابیوں کا ازالہ):
جب میرا روبوٹ زمین پر بیٹھتا ہے تو وہ بری طرح جھنجھنا رہا ہے۔
میں DART استعمال کر رہا ہوں جس کا step_size=0.001 ہے، اور رابطے کی خصوصیات یہ ہیں:
kp=10000000, kd=1000
کیا غلط ہونے کا امکان ہے اور مجھے اسے کیسے ٹھیک کرنا چاہیے؟
متوقع نتیجہ: AI ڈیمپنگ (kd) بڑھانے اور بہتر استحکام کے لیے Bullet انجن استعمال کرنے کا مشورہ دیتا ہے۔