Skip to main content

ہفتہ 6: ہیومنوائڈ روبوٹس کے لئے فزکس کنفیگریشن

Physics Engines Comparison شکل 2.1: فزکس انجن کا موازنہ - ODE، بُلیٹ، اور PhysX ان کے متعلقہ فوائد اور نقصانات کے ساتھ ہیومنوائڈ سیمولیشن کے لئے

گریویٹی اور ورلڈ پیرامیٹرز

ہیومنوائڈ روبوٹس گریویٹی کی ترتیبات کے لئے انتہائی حساس ہیں۔ حقیقی چالن کے لئے زمین کی گریویٹی (9.81 m/s²) کو درست طور پر ماڈل کیا جانا چاہیے۔

<!-- ورلڈ فائل میں گریویٹی کنفیگر کریں -->
<world name="humanoid_world">
<gravity>0 0 -9.81</gravity> <!-- معیاری زمین کی گریویٹی (Z-axis نیچے) -->

<!-- دوسرے سیاروں پر ٹیسٹ کے لئے -->
<!-- چاند: 0 0 -1.62 -->
<!-- مریخ: 0 0 -3.71 -->

<physics name="precise_physics" type="bullet">
<max_step_size>0.001</max_step_size> <!-- استحکام کے لئے 1ms -->
<real_time_factor>1.0</real_time_factor>

<!-- کانٹیکٹ ریزولوشن کے لئے سالور پیرامیٹرز -->
<bullet>
<solver>
<type>sequential_impulse</type>
<iters>50</iters> <!-- زیادہ اٹریشن = زیادہ درست کانٹیکٹس -->
<sor>1.3</sor> <!-- سکسیسیو اوور-ریلیکسیشن فیکٹر -->
</solver>
<constraints>
<cfm>0.0</cfm> <!-- کنٹرینٹ فورس مکسنگ (نرمی) -->
<erp>0.2</erp> <!-- ایرر ریڈکشن پیرامیٹر (0-1) -->
<contact_surface_layer>0.001</contact_surface_layer>
<split_impulse>true</split_impulse> <!-- زمین میں دھنسنے سے بچاؤ -->
</constraints>
</bullet>
</physics>
</world>

اہم پیرامیٹرز:

  • ERP (ایرر ریڈکشن پیرامیٹر): کنٹرول کرتا ہے کہ کتنی جلدی انٹرپینیٹریشنز کو حل کیا جاتا ہے۔ بہت زیادہ (0.5 سے زیادہ) آسیلیشنز کا سبب بنتا ہے؛ بہت کم (0.1 سے کم) ڈھلکنے کی اجازت دیتا ہے۔ 0.2 ہیومنوائڈز کے لئے اچھی شروعات کی قیمت ہے۔
  • CFM (کنٹرینٹ فورس مکسنگ): کانٹیکٹس میں نرمی شامل کرتا ہے۔ 0.0 = مکمل طور پر سخت۔ مطیع پاؤں کے لئے 1e-5 تک بڑھائیں۔

کولیژن جیومیٹری اور کانٹیکٹ فورسز

ہیومنوائڈ فُٹ-گراؤنڈ کانٹیکٹ کو کولیژن ٹیوننگ کی احتیاط کی ضرورت ہوتی ہے۔

<!-- حقیقی کولیژن خصوصیات کے ساتھ ہیومنوائڈ فُٹ -->
<link name="right_foot">
<pose>0 0 0.1 0 0 0</pose>
<inertial>
<mass>1.2</mass> <!-- فُٹ ماس: 1.2 kg -->
<inertia>
<ixx>0.002</ixx> <ixy>0</ixy> <ixz>0</ixz>
<iyy>0.003</iyy> <iyz>0</iyz> <izz>0.001</izz>
</inertia>
</inertial>

<collision name="foot_collision">
<geometry>
<!-- سادہ کانٹیکٹ کے لئے باکس استعمال کریں (تیز تر) -->
<box><size>0.2 0.1 0.05</size></box> <!-- لمبائی چوڑائی اونچائی -->
</geometry>

<surface>
<contact>
<!-- کانٹیکٹ سٹفنس اور ڈیمپنگ -->
<ode>
<kp>1e6</kp> <!-- سٹفنس: 1 ملین N/m (سخت زمین) -->
<kd>100</kd> <!-- ڈیمپنگ: اچھلنے سے بچاؤ -->
<max_vel>0.01</max_vel> <!-- ڈھلکنے کی اصلاح کی رفتار کو محدود کریں -->
<min_depth>0.001</min_depth> <!-- کم از کم کانٹیکٹ گہرائی -->
</ode>
</contact>

<friction>
<ode>
<mu>1.2</mu> <!-- فرکشن کوائفیشینٹ (کنکریٹ پر ربر) -->
<mu2>1.0</mu2> <!-- آرتھو گونل فرکشن (ان ایسو ٹروپک) -->
<fdir1>1 0 0</fdir1> <!-- بنیادی فرکشن سمت (آگے) -->
<slip1>0.0</slip1> <!-- بنیادی سمت میں کوئی سلپ نہیں -->
<slip2>0.01</slip2> <!-- تھوڑا لیٹرل سلپ کی اجازت -->
</ode>
</friction>
</surface>
</collision>

<visual name="foot_visual">
<geometry>
<box><size>0.2 0.1 0.05</size></box>
</geometry>
<material>
<ambient>0.3 0.3 0.3 1</ambient> <!-- گہرا گرے فُٹ -->
</material>
</visual>
</link>

فرکشن کوائفیشینٹس: مواد کا حوالہ

مواد جوڑیμ (فرکشن کوائفیشینٹ)استعمال کا کیس
ربر آن ڈرائی کنکریٹ1.0 - 1.2آؤٹ ڈور ہیومنوائڈ فُٹس
ربر آن ویٹ کنکریٹ0.7 - 0.9بارش کی حالتیں
پلاسٹک آن لکڑی0.3 - 0.5ان ڈور وہیلڈ روبوٹس
میٹل آن میٹل0.15 - 0.25جوائنٹ انٹرفیسز (کم فرکشن)
سافٹ ربر (مطیع)1.5 - 2.0ہائی ٹریکشن گریپرز

سیمولیشن ٹِپ: فُٹ-گراؤنڈ کانٹیکٹ کے لئے μ=1.0 سے شروع کریں۔ اگر روبوٹ پش ریکوری کے دوران سلپ ہو جائے تو 1.2-1.5 تک بڑھائیں۔ پھسلن والی سطحوں (برف، گیلا فلور) کے لئے 0.7-0.8 تک کم کریں۔

ریجیڈ باڈی ڈائنامکس اور استحکام

ہیومنوائڈ استحکام درست انرٹیا ٹینسرز پر منحصر ہے۔ غلط اقدار غیر حقیقی گردش یا ٹپنگ کا سبب بنتی ہیں۔

سادہ شکلوں کے لئے انرٹیا کا حساب:

# عام شکلوں کے لئے پائیتھن یوٹیلٹی
import numpy as np

def box_inertia(mass, width, depth, height):
"""
ایک باکس کے لئے انرٹیا ٹینسر کا حساب لگائیں۔
آرگس:
mass: kg
width: x-میں طول (m)
depth: y-میں طول (m)
height: z-میں طول (m)
واپسی:
ixx، iyy، izz کے ساتھ ڈکٹ
"""
ixx = (mass / 12.0) * (depth**2 + height**2)
iyy = (mass / 12.0) * (width**2 + height**2)
izz = (mass / 12.0) * (width**2 + depth**2)
return {'ixx': ixx, 'iyy': iyy, 'izz': izz}

def cylinder_inertia(mass, radius, length):
"""
ایک سلنڈر کے لئے انرٹیا کا حساب (Z-axis کے ساتھ)۔
آرگس:
mass: kg
radius: m
length: m (سلنڈر کی اونچائی)
واپسی:
ixx، iyy، izz کے ساتھ ڈکٹ
"""
ixx = iyy = (mass / 12.0) * (3 * radius**2 + length**2)
izz = 0.5 * mass * radius**2
return {'ixx': ixx, 'iyy': iyy, 'izz': izz}

# مثال: ہیومنوائڈ ٹورسو (30cm x 40cm x 60cm، 15kg)
torso_inertia = box_inertia(15.0, 0.3, 0.4, 0.6)
print(f"ٹورسو انرٹیا: {torso_inertia}")
# آؤٹ پٹ: {'ixx': 0.5, 'iyy': 0.5625, 'izz': 0.3125}

عام غلطی: غیر مکعب شکلوں کے لئے یونیفارم انرٹیا (تمام قطری عناصر برابر) استعمال کرنا۔ اس سے غیر حقیقی جھومنا ہوتا ہے۔

استحکام ٹیسٹنگ: زیرو مومنٹ پوائنٹ (ZMP)

ایک ہیومنوائڈ سٹیٹک طور پر مستحکم ہے جب زیرو مومنٹ پوائنٹ (ZMP) سپورٹ پولی گون (فُٹ پرنٹ) کے اندر رہتا ہے۔

# ROS2 نوڈ سکچ تاکہ ZMP مانیٹر کریں (فُٹس پر فورس-ٹورک سینسرز کی ضرورت ہوتی ہے)
import rclpy
from geometry_msgs.msg import WrenchStamped

class ZMPMonitor:
def __init__(self):
self.left_foot_force = None
self.right_foot_force = None

def foot_callback(self, msg, foot_name):
# عمودی فورس (Z-axis) نکالیں
fz = msg.wrench.force.z
if foot_name == 'left':
self.left_foot_force = fz
else:
self.right_foot_force = fz

def calculate_zmp(self):
# سادہ ZMP حساب (فُٹس 0.3m دور ہیں کا فرض کریں)
if self.left_foot_force and self.right_foot_force:
total_force = self.left_foot_force + self.right_foot_force
zmp_y = (0.3 * self.right_foot_force) / total_force
print(f"ZMP لیٹرل پوزیشن: {zmp_y:.3f} m")
# مستحکم اگر 0 < zmp_y < 0.3 (فُٹس کے درمیان)
return 0 < zmp_y < 0.3

ورزش: Gazebo میں ایک سادہ دو-لیگڈ روبوٹ تخلیق کریں۔ ign service کمانڈ کا استعمال کرتے ہوئے ٹورسو پر ایک لیٹرل فورس (پش) لاگو کریں۔ روبوٹ کے ٹپنے سے پہلے زیادہ سے زیادہ فورس کو ناپیں۔ مختلف فرکشن کوائفیشینٹس (μ=0.5 vs μ=1.5) کا موازنہ کریں۔


اگلا: ہفتہ 7 - سینسر سیمولیشن - LiDAR، ڈیپتھ کیمرز، IMUs، اور نوائس ماڈلنگ۔