سبق 11.1: کیمرہ سمولیشن (Camera Simulation)
روبوٹس کے لیے کیمرے کیوں اہم ہیں؟
ایک ایسے روبوٹ کا تصور کریں جو دیکھ سکتا ہو۔ ایک فیکٹری بوٹ کیمرے سے مصنوعات کا معائنہ کرتا ہے۔ ایک ڈیلیوری روبوٹ کیمرے سے رکاوٹوں کو پہچانتا ہے۔ ایک ہیومنوائڈ روبوٹ کیمرے کی فیڈ سے ہاتھ کے اشاروں پر ردعمل ظاہر کرتا ہے۔ وژن (بینائی) روبوٹ کے لیے سب سے طاقتور سینسرز میں سے ایک ہو سکتی ہے۔
سمولیشن میں، کیمرہ شامل کرنا سیدھا سادا ہے: اپنے روبوٹ کی SDF فائل میں مخصوص پیرامیٹرز کے ساتھ ایک کیمرہ سینسر کی وضاحت کریں، اور Gazebo اس نقطہ نظر سے تصاویر رینڈر کرے گا۔ وہ تصاویر ایک ROS 2 ٹاپک پر پبلش ہوتی ہیں، اور آپ کے وژن نوڈز انہیں پروسیس کر سکتے ہیں—آبجیکٹ ڈیٹیکشن، لین فالوئنگ، اشارے کی شناخت، جو کچھ بھی آپ کو درکار ہو۔
یہ سبق آپ کو سکھائے گا کہ کس طرح سمولیٹڈ روبوٹس میں کیمرے شامل کیے جائیں اور کنفیگریشن کے اختیارات کو سمجھیں۔
کیمرہ پیرامیٹرز کو سمجھنا
کیمرہ شامل کرنے سے پہلے، سمجھیں کہ ہر پیرامیٹر کیا کنٹرول کرتا ہے:
ریزولوشن (تصویر کا سائز)
کیمرہ پکسلز کی ایک 2D گرڈ کیپچر کرتا ہے۔ ریزولوشن اس گرڈ کے سائز کو متعین کرتا ہے۔
عام ریزولوشنز:
- 640x480: تفصیل اور رفتار کا اچھا توازن
- 1920x1080: اعلیٰ تفصیل، سست پروسیسنگ
- 320x240: تیز پروسیسنگ، کم تفصیل (موبائل/ایمبیڈڈ)
SDF میں:
<image>
<width>640</width>
<height>480</height>
</image>
یہ کیوں اہم ہے: زیادہ ریزولوشن زیادہ تفصیلات حاصل کرتا ہے لیکن بڑے میسجز اور سست وژن پروسیسنگ پیدا کرتا ہے۔ کم ریزولوشن تیزی سے چلتا ہے لیکن باریک تفصیلات کھو دیتا ہے۔
فیلڈ آف ویو (FOV)
فیلڈ آف ویو بیان کرتا ہے کہ کیمرے کا نظارہ کتنا وسیع ہے، جسے ریڈیئنز میں ماپا جاتا ہے۔
عام FOVs:
- 1.047 ریڈیئنز (~60 ڈگری): ٹیلی فوٹو، زوم ان، تنگ نظارہ
- 1.571 ریڈیئنز (~90 ڈگری): نارمل، انسانی آنکھ کی طرح
- 2.356 ریڈیئنز (~135 ڈگری): وائڈ اینگل، پینورامک نظارہ
SDF میں:
<horizontal_fov>1.047</horizontal_fov>
یہ کیوں اہم ہے: وسیع FOV منظر کا زیادہ حصہ دیکھتا ہے لیکن مسخ (distortion) پیدا کرتا ہے۔ تنگ FOV زوم ان کرتا ہے، کم علاقہ لیکن زیادہ تفصیل دیکھتا ہے۔
نیئر اور فار کلپ پلینز (Near and Far Clip Planes)
کیمروں کی ایک گہرائی کی حد ہوتی ہے۔ نیئر کلپ پلین سے قریب یا فار کلپ پلین سے دور کوئی بھی چیز رینڈر نہیں ہوتی۔
عام اقدار:
- نیئر (Near): 0.01 سے 0.1 میٹر (کیمرہ کتنی قریب فوکس کر سکتا ہے)
- فار (Far): 10 سے 100 میٹر (یہ کتنا دور دیکھ سکتا ہے)
SDF میں:
<clip>
<near>0.1</near>
<far>100</far>
</clip>
یہ کیوں اہم ہے: اس حد سے باہر کی اشیاء تصویر میں ظاہر نہیں ہوتیں۔ اگر کوئی روبوٹ ایک کمرے (5 میٹر چوڑا) میں نیویگیٹ کرتا ہے، تو فار کلپ کو کم از کم 5 میٹر پر سیٹ کریں۔ اگر چھوٹے پرزوں (سینٹیمیٹر) کا معائنہ کر رہے ہیں، تو نیئر کلپ کو بہت چھوٹا سیٹ کریں۔
اپ ڈیٹ ریٹ (فریم ریٹ)
کیمرہ کتنی بار فریم کیپچر اور پبلش کرتا ہے، Hz (فریم فی سیکنڈ) میں۔
عام شرحیں:
- 10 Hz: رئیل ٹائم کنٹرول، سست سسٹم
- 30 Hz: ویڈیو سٹریمنگ، تفصیل اور رفتار کے درمیان توازن
- 60 Hz: تیز کنٹرول لوپس، تیز رفتار ردعمل
SDF میں:
<always_on>1</always_on>
<update_rate>30</update_rate>
یہ کیوں اہم ہے: زیادہ فریم ریٹ کا مطلب ہے آپ کے ROS نیٹ ورک پر زیادہ میسجز اور زیادہ پروسیسنگ لوڈ۔ کم شرحیں تاخیر (latency) کی حساسیت کو کم کرتی ہیں۔
اپنے روبوٹ میں کیمرہ شامل کرنا
مرحلہ 1: SDF میں کیمرہ سینسر کی وضاحت کریں
اپنی روبوٹ کی SDF فائل میں ترمیم کریں۔ جس لنک پر آپ کیمرہ لگانا چاہتے ہیں (عام طور پر روبوٹ کا سر یا بیس) اس میں <sensor> ایلیمنٹ شامل کریں۔
مثال: روبوٹ بیس پر سامنے کی طرف کیمرہ
<model name="my_robot">
<link name="base_link">
<!-- Robot body geometry... -->
</link>
<link name="camera_link">
<!-- Camera physical representation (small box) -->
<inertial>
<mass>0.05</mass>
</inertial>
<visual>
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
</visual>
<!-- CAMERA SENSOR DEFINITION -->
<sensor name="camera" type="camera">
<!-- Camera parameters -->
<camera>
<horizontal_fov>1.047</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
</image>
<clip>
<near>0.1</near>
<far>100</far>
</clip>
</camera>
<!-- Publishing behavior -->
<always_on>1</always_on>
<update_rate>30</update_rate>
<!-- Topic name where images publish -->
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<camera_name>camera</camera_name>
<frame_name>camera_link</frame_name>
</plugin>
</sensor>
</link>
<!-- Mount camera on base_link -->
<joint name="camera_joint" type="fixed">
<parent>base_link</parent>
<child>camera_link</child>
<origin xyz="0.1 0 0.1" rpy="0 0 0"/>
</joint>
</model>
کیا ہو رہا ہے:
<sensor type="camera">اس کی وضاحت کرتا ہے کہ یہ ایک کیمرہ سینسر ہے۔<camera>پیرامیٹرز (FOV، ریزولوشن، کلپ پلینز) رکھتا ہے۔<always_on>کا مطلب ہے کہ کیمرہ ہمیشہ پبلش کر رہا ہے (صرف درخواست پر نہیں)<update_rate>30</update_rate>30 فریم فی سیکنڈ پر پبلش کرتا ہے۔<plugin>ROS انٹیگریشن کو کنفیگر کرتا ہے (ٹاپکس پر پبلش کرتا ہے)<joint>کیمرے کو base_link پر پوزیشن (0.1, 0, 0.1) پر ماؤنٹ کرتا ہے۔
مرحلہ 2: کیمرہ پبلشنگ کی تصدیق کریں
اپنے روبوٹ کے ساتھ Gazebo لانچ کرنے کے بعد، چیک کریں کہ کیمرہ ڈیٹا پبلش کر رہا ہے۔
کیمرہ ٹاپکس کی فہرست بنائیں:
ros2 topic list | grep camera
متوقع آؤٹ پٹ:
/camera/camera_info
/camera/image_raw
دو ٹاپکس:
/camera/image_raw: خام پکسل ڈیٹا (height x width x 3 برائے RGB)/camera/camera_info: کیمرہ کیلیبریشن (فوکل لینتھ، پرنسپل پوائنٹ، مسخ)
تصویر کے ڈیٹا کا معائنہ کریں:
ros2 topic echo /camera/image_raw --once
آپ کو تصویر کے بارے میں میٹا ڈیٹا نظر آئے گا۔ اصل پکسل ڈیٹا بائنری ہے (پرنٹ کرنے کے لیے بہت بڑا)۔
مرحلہ 3: Gazebo GUI میں کیمرہ آؤٹ پٹ کا بصری جائزہ لیں
Gazebo GUI براہ راست کیمرہ آؤٹ پٹ دکھا سکتا ہے۔ یہ پہلا حقیقی تصدیق ہے کہ کیمرہ کام کر رہا ہے۔
طریقہ 1: بلٹ ان کیمرہ ڈسپلے
- Gazebo GUI میں، Plugins → Camera → Camera Name پر جائیں
- ایک ونڈو کھلے گی جس میں لائیو کیمرہ فیڈ نظر آئے گی
طریقہ 2: RViz (ROS Visualization) استعمال کرنا
- RViz لانچ کریں:
rviz2 - Image ڈسپلے شامل کریں
/camera/image_rawٹاپک منتخب کریں- لائیو کیمرہ آؤٹ پٹ دیکھیں
کیمرہ ڈیٹا فلو کو سمجھنا
یہاں بتایا گیا ہے کہ کیمرہ ڈیٹا سسٹم میں کیسے بہتا ہے:
Robot SDF
↓
Camera Sensor (تصویر رینڈر کرتا ہے)
↓
ROS 2 Plugin (پیغام میں تبدیل کرتا ہے)
↓
/camera/image_raw Topic (geometry_msgs/Image)
↓
Your Vision Node
↓
اشیاء کا پتہ چلا، لینز مل گئیں، وغیرہ
ہر قدم اہم ہے:
- SDF تعریف: کیمرہ پیرامیٹرز کی وضاحت کرتی ہے۔
- Gazebo رینڈرنگ: سینسر کے نقطہ نظر سے پکسل ڈیٹا تیار کرتا ہے۔
- ROS پلگ ان: ROS میسجز کے طور پر پبلش کرتا ہے۔
- ROS ٹاپک: آپ کے نوڈز کے لیے ڈیٹا دستیاب کرتا ہے۔
- آپ کا نوڈ: تصویر پر عملدرآمد کرتا ہے (OpenCV، TensorFlow، یا کسٹم کوڈ)۔
مشق: ایک سامنے کی طرف کیمرہ شامل کریں
اس مشق میں، آپ ایک سادہ روبوٹ ماڈل میں کیمرہ شامل کریں گے اور تصدیق کریں گے کہ یہ پبلش ہو رہا ہے۔
اسٹارٹر روبوٹ SDF (سادہ باکس روبوٹ):
<?xml version="1.0"?>
<sdf version="1.9">
<model name="simple_robot">
<static>false</static>
<!-- Main body -->
<link name="base_link">
<inertial>
<mass>1.0</mass>
<inertia>
<ixx>0.1</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.1</iyy>
<iyz>0</iyz>
<izz>0.1</izz>
</inertia>
</inertial>
<visual name="visual">
<geometry>
<box>
<size>0.2 0.2 0.2</size>
</box>
</geometry>
<material>
<ambient>0.5 0.5 0.5 1</ambient>
<diffuse>0.7 0.7 0.7 1</diffuse>
</material>
</visual>
<collision name="collision">
<geometry>
<box>
<size>0.2 0.2 0.2</size>
</box>
</geometry>
</collision>
</link>
<!-- TODO: Add camera_link here -->
<!-- TODO: Add camera sensor in camera_link -->
<!-- TODO: Add joint to mount camera on base_link -->
</model>
</sdf>
آپ کا کام:
- اس SDF کو
my_robot.sdfنامی فائل میں کاپی کریں۔ - ایک
camera_linkشامل کریں جس میں کیمرہ سینسر ہو (مرحلہ 1 سے پیرامیٹرز استعمال کریں) - base_link پر پوزیشن (0.1, 0, 0.1) پر اسے ماؤنٹ کرنے کے لیے ایک جوائنٹ شامل کریں۔
- Gazebo لانچ کریں:
gazebo my_robot.sdf - کیمرہ پبلشنگ کی تصدیق کریں:
ros2 topic list - Gazebo GUI میں آؤٹ پٹ دیکھیں (Plugins → Camera)
متوقع نتیجہ: آپ کو اپنے روبوٹ کے نقطہ نظر سے Gazebo منظر کی لائیو کیمرہ فیڈ نظر آئے۔
عام کیمرہ مسائل اور حل
مسئلہ 1: کوئی کیمرہ ٹاپکس نہیں
علامت: آپ ros2 topic list چلاتے ہیں اور کوئی /camera/* ٹاپک نظر نہیں آتا۔
ممکنہ وجہ:
- SDF فائل میں کیمرہ سینسر شامل نہیں ہے
- ROS پلگ ان صحیح طریقے سے کنفیگر نہیں کیا گیا ہے
- ROS 2 سپورٹ کے ساتھ Gazebo نہیں بنایا گیا ہے
حل:
- ڈبل چیک کریں کہ SDF فائل میں
<sensor type="camera">بلاک موجود ہے۔ - تصدیق کریں کہ
<plugin filename="libgazebo_ros_camera.so">موجود ہے۔ - یقینی بنائیں کہ Gazebo ROS 2 کے ساتھ لانچ کیا گیا ہے:
LIBgazebo_PLUGIN_PATH=/opt/ros/humble/lib:$LIBGAZEBO_PLUGIN_PATH gazebo my_robot.sdf
مسئلہ 2: مکمل طور پر سیاہ کیمرہ فیڈ
علامت: کیمرہ تصاویر پبلش کرتا ہے، لیکن وہ سب سیاہ پکسلز ہیں۔
ممکنہ وجہ:
- کیمرہ کسی چیز کی طرف نہیں دیکھ رہا (غلط سمت)
- فار کلپ پلین بہت قریب ہے (ہر چیز مرئی حد سے باہر ہے)
- Gazebo منظر میں روشنی بند ہے
حل:
- جوائنٹ
<origin rpy="...">میں کیمرہ کی سمت چیک کریں (سامنے کی طرف اشارہ کرنا چاہیے:rpy="0 0 0") - فار کلپ پلین بڑھائیں:
<far>1000</far> - تصدیق کریں کہ Gazebo منظر میں روشنی ہے (مینو میں "Lighting" چیک کریں)
مسئلہ 3: کیمرہ بہت آہستہ پبلش کرتا ہے
علامت: فریم آتے ہیں لیکن طویل تاخیر کے ساتھ (متوقع فریم ریٹ پر نہیں)
ممکنہ وجہ:
- اپ ڈیٹ ریٹ بہت کم سیٹ کیا گیا ہے
- GPU رینڈرنگ میں رکاوٹ (اعلی ریزولوشن، پیچیدہ منظر)
حل:
- ریزولوشن کم کریں:
<width>320</width><height>240</height> - اگر 30 Hz بہت زیادہ ہے تو اپ ڈیٹ ریٹ کم کریں:
<update_rate>10</update_rate> - اگر آپ Tier 1 (کلاؤڈ) پر ہیں، تو رینڈرنگ فطری طور پر سست ہے—یہ متوقع ہے۔
توثیق چیک لسٹ (Validation Checklist)
کیمرہ شامل کرنے کے بعد:
- SDF میں مناسب پیرامیٹرز کے ساتھ کیمرہ سینسر کی وضاحت کی گئی ہے۔
- ایک کیمرہ لنک بنایا گیا ہے اور جوائنٹ کے ساتھ ماؤنٹ کیا گیا ہے۔
- Gazebo بغیر کسی خرابی کے لانچ ہوتا ہے۔
-
ros2 topic listمیں/camera/image_rawاور/camera/camera_infoنظر آتے ہیں۔ - Gazebo GUI لائیو کیمرہ فیڈ دکھاتا ہے۔
- کیمرہ کی تصاویر مکمل طور پر سیاہ یا مکمل طور پر سفید نہیں ہیں۔
- فریم ریٹ متوقع شرح سے میل کھاتا ہے (
ros2 topic bw /camera/image_rawسے چیک کریں)
AI کے ساتھ کوشش کریں
سیٹ اپ: Claude (یا اپنے پسندیدہ AI اسسٹنٹ) کے ساتھ ایک چیٹ کھولیں اور کیمرہ کنفیگریشن چیلنج بیان کریں۔
پرامپٹ سیٹ:
Prompt 1 (بنیادی): "میں Gazebo میں ایک روبوٹ میں کیمرہ شامل کر رہا ہوں۔
کیمرے کو روبوٹ کے ارد گرد 5 میٹر کا دائرہ دیکھنا چاہیے۔
مجھے کون سی FOV اور کلپ پلین ویلیوز استعمال کرنی چاہئیں؟"
Prompt 2 (انٹرمیڈیٹ): "میرے کیمرے تصاویر پبلش کر رہے ہیں لیکن وہ سب سیاہ ہیں۔
کیمرہ پوزیشن (0.1, 0, 0.1) پر اور سمت (0, 0, 0) پر نصب ہے۔
منظر میں زمین، دیواریں، اور 3 میٹر دور ایک نیلی بکس موجود ہے۔
کیا غلط ہو سکتا ہے اور میں اسے کیسے ٹھیک کروں؟"
Prompt 3 (ایڈوانسڈ): "مجھے اپنے روبوٹ کے لیے دو کیمرے استعمال کرنے کی ضرورت ہے:
ایک نیویگیشن کے لیے وائڈ اینگل (180 ڈگری FOV) اور ایک باریک آبجیکٹ معائنہ کے لیے تنگ (30 ڈگری)۔
کیا یہ الگ لنکس پر ہونے چاہئیں یا ایک ہی لنک پر؟
میں ہر ایک کے لیے کون سا ریزولوشن اور فریم ریٹ تجویز کروں گا؟"
متوقع نتائج:
- AI استعمال کے معاملے کی بنیاد پر مناسب FOV اقدار تجویز کرتا ہے۔
- AI جیومیٹری اور رینڈرنگ کے بارے میں سوچ کر کیمرہ کے مسائل کی تشخیص میں مدد کرتا ہے۔
- AI ریزولوشن، فریم ریٹ، اور پروسیسنگ لوڈ کے درمیان توازن پر غور کرتا ہے۔
حفاظتی نوٹ: کیمرہ فیڈز اس مرحلے میں صرف سمولیشن کے لیے ہیں۔ جب حقیقی روبوٹس پر حقیقی کیمرے تعینات کیے جائیں، تو یقینی بنائیں کہ آپ فوکل لینتھ، سینسر سائز، اور لینس مسخ کو سمجھتے ہیں—سمولیٹڈ کیمرے حقیقی ہارڈ ویئر سے بالکل مماثل نہیں ہوتے۔ پہلے سمولیشن میں تصدیق کریں، پھر حقیقی ہارڈ ویئر پر تجربہ کریں۔
اختیاری توسیع: ایک سادہ ROS 2 نوڈ لکھیں جو /camera/image_raw کو سبسکرائب کرے اور گنے کہ کتنے نیلے پکسل نظر آ رہے ہیں۔ یہ آپ کو بعد کے اسباق میں حقیقی وژن پروسیسنگ کے لیے تیار کرتا ہے۔