دوره: شبیهسازی AGV با PyBullet
جلسه: ۲
تاریخ: ۲۳ آگوست ۲۰۲۶
سطح: مقدماتی → متوسط
تمرکز: شناخت PyBullet بهعنوان موتور شبیهسازی در پروژه AGV ما


1. PyBullet چیست؟
قبل از اینکه ساخت AGV خود را شروع کنیم، باید نرمافزاری را که قرار است بهعنوان آزمایشگاه مجازی فیزیک ما عمل کند، بشناسیم.
PyBullet یک ماژول پایتون است که بر پایه Bullet Physics SDK ساخته شده است. این ابزار به ما اجازه میدهد شبیهسازیهای مبتنی بر فیزیک را برای رباتها، اشیا، محیطها و سنسورها مستقیماً از طریق کد پایتون ایجاد و کنترل کنیم.
به زبان ساده:
PyBullet به ما اجازه میدهد یک دنیای مجازی بسازیم که در آن ربات بتواند حرکت کند، با اشیا برخورد داشته باشد، محیط اطراف خود را از طریق سنسورها درک کند و به نیروهای فیزیکی واکنش نشان دهد؛ همه این کارها نیز از طریق کد پایتون انجام میشوند.
مستندات رسمی PyBullet آن را یک ماژول پایتون برای شبیهسازی فیزیک، رباتیک و یادگیری ماشین معرفی میکند. این ابزار از مدلهای رباتی مفصلی، شبیهسازی دینامیک، سینماتیک، تشخیص برخورد و پرسوجوهای مربوط به برخورد پرتوها پشتیبانی میکند.
برای دوره ما، این موضوع بسیار مهم است؛ زیرا هدف ما فقط این نیست که یک ربات را طوری نمایش دهیم که انگار در حال حرکت است.
ما میخواهیم ربات رفتاری شبیه یک ماشین فیزیکی واقعی داشته باشد.
برای مثال، اگر AGV ما:
- شتاب بگیرد،
- گردش کند،
- با یک مانع برخورد کند،
- کشش خود را از دست بدهد،
- اطلاعات سنسورها را دریافت کند،
- یک مسیر را دنبال کند،
- یک بار را حمل کند،
شبیهسازی باید این تعاملات را از طریق یک موتور فیزیکی مدل کند، نه اینکه فقط مختصات ربات را تغییر دهد.
2. چرا برای این دوره از PyBullet استفاده میکنیم؟
هدف نهایی ما صرفاً یادگیری PyBullet نیست.
هدف ما ساخت یک سیستم شبیهسازی AGV است که بتواند بهتدریج به سمت یک سیستم رباتیکی پیشرفتهتر توسعه پیدا کند.
مسیر کلی ما تقریباً به این شکل است:
Python
↓
PyBullet
↓
Robot Model
↓
Physics
↓
Sensors
↓
Control
↓
Navigation
↓
Computer Vision
↓
AI
↓
AGV Digital Twin
بنابراین PyBullet یکی از پایههای اصلی پروژه ما محسوب میشود.
در ادامه دوره میخواهیم AGV ما بتواند:
- درون یک کارخانه یا محیط صنعتی شبیهسازیشده قرار بگیرد،
- با استفاده از چرخهای خود حرکت کند،
- موانع را تشخیص دهد،
- اطلاعات سنسورها را دریافت کند،
- به سمت یک مقصد حرکت کند،
- مسیرها را دنبال کند،
- تصمیمگیری کند،
- با محیط اطراف خود تعامل داشته باشد،
- و در نهایت بخشی از یک شبیهسازی رباتیک / کارخانه هوشمند باشد.
به همین دلیل، ما PyBullet را بهعنوان یک ابزار مهندسی یاد میگیریم، نه صرفاً بهعنوان یک کتابخانه پایتون.
3. PyBullet چه کارهایی میتواند انجام دهد؟
PyBullet قابلیتهای مختلفی در اختیار ما قرار میدهد که مستقیماً برای رباتیک کاربرد دارند.
مهمترین قابلیتها عبارتاند از:
| قابلیت | معنای آن برای AGV ما |
|---|---|
| شبیهسازی فیزیک | شبیهسازی گرانش، حرکت و نیروها |
| تشخیص برخورد | تشخیص برخورد با دیوارها و موانع |
| شبیهسازی ربات | بارگذاری و شبیهسازی مدلهای ربات |
| کنترل مفاصل | کنترل مفاصل و مکانیزمهای ربات |
| سنسورها | شبیهسازی دوربینها و روشهای مختلف سنجش |
| سینماتیک | محاسبه وضعیت و پیکربندی مفاصل ربات |
| دینامیک | محاسبه حرکت تحت نیروها و گشتاورها |
| Ray Casting | تشخیص اشیا در امتداد پرتوهای مجازی |
| Python API | کنترل کل شبیهسازی با پایتون |
| نمایش | مشاهده شبیهسازی در یک محیط سهبعدی |
PyBullet از مدلهای رباتی مانند URDF، SDF و MJCF پشتیبانی میکند و قابلیتهایی مانند دینامیک مستقیم و معکوس، سینماتیک مستقیم و معکوس، تشخیص برخورد و Ray Query را در اختیار ما قرار میدهد.
4. PyBullet و فیزیک
این بخش یکی از مهمترین مفاهیم این دوره است.
یک انیمیشن سهبعدی معمولی میتواند باعث شود یک جسم به نظر برسد که در حال حرکت است.
اما یک شبیهساز رباتیک باید به یک سؤال بسیار مهمتر پاسخ دهد:
وقتی ربات با محیط اطراف خود تعامل میکند، از نظر فیزیکی چه اتفاقی باید رخ دهد؟
فرض کنید AGV ما در حال حرکت به سمت جلو است و ناگهان با یک دیوار مواجه میشود.
یک انیمیشن ساده ممکن است فقط موقعیت AGV را تغییر دهد:
AGV position:
Before:
[ AGV ] → → →
After:
[ AGV ]
اما در یک شبیهسازی فیزیکی، باید مشخص شود وقتی ربات به دیوار میرسد، چه اتفاقی رخ میدهد.
برای مثال:
WALL
│
│
[ AGV ] → → │
│
موتور فیزیک میتواند تشخیص دهد که دو جسم با یکدیگر برخورد کردهاند و تعامل فیزیکی حاصل از این برخورد را محاسبه کند.
اینجاست که Bullet Physics اهمیت پیدا میکند.
PyBullet یک رابط پایتونی در اختیار ما قرار میدهد که از طریق آن میتوانیم با موتور فیزیک Bullet ارتباط برقرار کنیم.

5. فیزیک در برابر انیمیشن
این تفاوت برای درک کل دوره ما بسیار مهم است.
انیمیشن
در یک انیمیشن میتوانیم بنویسیم:
robot_x += 0.01
یعنی:
جسم را یک سانتیمتر جابهجا کن.
در اینجا الزامی وجود ندارد که جسم قوانین فیزیکی را رعایت کند.
شبیهسازی فیزیکی
در یک شبیهسازی فیزیکی، مواردی مانند زیر را تعریف میکنیم:
- جرم،
- گرانش،
- سرعت،
- نیرو،
- گشتاور،
- اصطکاک،
- هندسه برخورد،
- قیود،
- مفاصل.
سپس موتور فیزیک محاسبه میکند که چه اتفاقی رخ خواهد داد.
از نظر مفهومی:
Forces
↓
Physics Engine
↓
Motion
↓
New Position
این تفاوت زمانی که کنترل AGV خود را شروع کنیم اهمیت بسیار زیادی پیدا میکند.

6. PyBullet در رباتیک
PyBullet بهخصوص برای رباتیک مفید است؛ زیرا رباتها فقط اجسام سهبعدی ساده نیستند.
یک ربات از چندین بخش تشکیل شده است که با یکدیگر تعامل دارند.
برای مثال، یک ربات متحرک ساده را در نظر بگیرید:
┌───────────────┐
│ AGV │
│ │
O────│ │────O
Wheel │ │ Wheel
└───────────────┘
ما باید موارد زیر را در سیستم خود مدل کنیم:
- بدنه ربات،
- چرخها،
- چرخش چرخها،
- جرم،
- اصطکاک،
- برخوردها،
- سنسورها،
- حرکت،
- و در نهایت کنترلکنندهها.
PyBullet به ما اجازه میدهد این عناصر را درون یک محیط مبتنی بر فیزیک ایجاد کنیم.
به همین دلیل، PyBullet برای پروژه AGV ما بسیار کاربردیتر از یک ابزار صرفاً سهبعدی است.
7. شبیهسازی رباتها
یکی از نقاط قوت اصلی PyBullet قابلیت بارگذاری توصیف رباتهاست.
یکی از فرمتهای رایج:
URDF — Unified Robot Description Format
فایل URDF ساختار یک ربات را توصیف میکند و میتواند اطلاعاتی مانند موارد زیر را در خود داشته باشد:
- لینکها،
- مفاصل،
- هندسه بصری،
- هندسه برخورد،
- جرم،
- ویژگیهای اینرسی،
- روابط بین مفاصل.
بهصورت مفهومی:
Robot
│
┌───────┴───────┐
│ │
Link 1 Link 2
│ │
Joint Joint
│ │
Link 3 Link 4
وقتی PyBullet یک مدل ربات را بارگذاری میکند، میتواند از این اطلاعات برای ایجاد یک نمایش فیزیکی از ربات استفاده کند.
این موضوع زمانی که بعداً مدل AGV خودمان را بسازیم اهمیت بسیار زیادی خواهد داشت.

8. شبیهسازی سنسورها
یک ربات بدون سنسور عملاً نمیتواند محیط اطراف خود را ببیند یا اندازهگیری کند.
AGV واقعی ما نیز در نهایت به اطلاعاتی درباره محیط اطراف خود نیاز خواهد داشت.
برای مثال:
Obstacle
█
█
█
↗ ↑ ↖
/ │ \
/ │ \
/ Sensor \
[=========================]
AGV
در محیط شبیهسازی میتوانیم سنسورهای مجازی ایجاد کنیم.
بسته به کاربرد، میتوانیم مواردی مانند زیر را شبیهسازی کنیم:
- دوربین،
- دوربین عمق،
- سنسورهای فاصله مبتنی بر Ray،
- سنسورهای برخورد،
- اطلاعات تماس،
- اندازهگیری نیرو و گشتاور.
PyBullet همچنین از رندر دوربین پشتیبانی میکند و میتواند تصاویر RGB، اطلاعات عمق و اطلاعات segmentation را در اختیار ما قرار دهد.
این قابلیت در ادامه دوره، زمانی که وارد مباحث زیر شویم، اهمیت ویژهای پیدا خواهد کرد:
Computer Vision → Perception → Navigation → AI
9. فیزیک و دینامیک
در این مرحله دانشجو باید بتواند دو مفهوم را بهخوبی از یکدیگر تفکیک کند:
Kinematics — سینماتیک
سینماتیک عمدتاً با این سؤال سروکار دارد:
ربات از نظر هندسی چگونه حرکت میکند؟
برای مثال:
Wheel rotation
↓
Robot displacement
↓
Robot position
Dynamics — دینامیک
دینامیک این سؤال را مطرح میکند:
چرا ربات به این شکل حرکت میکند؟
برای مثال:
Motor Torque
↓
Wheel Force
↓
Acceleration
↓
Velocity
↓
Position
بنابراین دینامیک کمیتهای فیزیکی مانند موارد زیر را در نظر میگیرد:
- جرم،
- نیرو،
- گشتاور،
- شتاب،
- سرعت،
- اصطکاک،
- گرانش،
- اینرسی.
PyBullet قابلیتهای دینامیک مستقیم و معکوس را در اختیار ما قرار میدهد و به همین دلیل برای مطالعه حرکت رباتها، فراتر از تبدیلهای هندسی ساده، ابزار مناسبی است.
10. PyBullet و Python
یکی از بزرگترین مزایای PyBullet برای دوره ما این است که میتوانیم شبیهساز را مستقیماً از طریق پایتون کنترل کنیم.
بهصورت مفهومی:
Python
│
│ PyBullet API
↓
PyBullet
│
↓
Bullet Physics Engine
│
↓
Simulated Robot
برای مثال، در نهایت میتوانیم کدی مانند زیر بنویسیم:
import pybullet as p
physicsClient = p.connect(p.GUI)
در اینجا پایتون از طریق PyBullet API با شبیهساز ارتباط برقرار میکند.
در ادامه دوره، از پایتون برای کارهای زیر استفاده خواهیم کرد:
- ایجاد شبیهسازی،
- بارگذاری محیط،
- بارگذاری AGV،
- کنترل چرخها،
- دریافت اطلاعات سنسورها،
- محاسبه فرمانهای ناوبری،
- پردازش تصاویر دوربین،
- پیادهسازی الگوریتمها،
- و اتصال ماژولهای مختلف سیستم رباتیک.
این یکی از دلایلی است که PyBullet برای دوره ما انتخاب بسیار مناسبی است.
11. PyBullet فقط یک نمایشگر سهبعدی نیست
این نکته بسیار مهم است.
یک دانشجوی مبتدی ممکن است وقتی پنجره گرافیکی PyBullet را میبیند تصور کند:
«PyBullet یک برنامه است که یک ربات را بهصورت سهبعدی نمایش میدهد.»
این برداشت صحیح نیست.
پنجره سهبعدی تنها نمایش بصری شبیهسازی است.
سیستم واقعی بیشتر شبیه ساختار زیر است:
PYTHON
│
▼
PyBullet API
│
▼
Physics Simulation
│
┌────────────┼────────────┐
▼ ▼ ▼
Robot Objects Sensors
│ │ │
└────────────┼────────────┘
▼
Simulation
│
▼
Sensor Data
│
▼
Controller
│
▼
Robot Motion
این معماری بسیار نزدیکتر به روشی است که باید پروژه AGV خود را درک کنیم.
12. یک مثال: AGV آینده ما
فرض کنید AGV ما داخل یک انبار در حال حرکت است.
┌─────────────────────────────────────────┐
│ │
│ █████ ███ │
│ █████ AGV → ███ │
│ │
│ █████ │
│ █████ │
│ │
└─────────────────────────────────────────┘
AGV یک مقصد مشخص دارد.
سیستم میتواند به شکل زیر عمل کند:
مرحله ۱ — Sensor
سنسور یک مانع را تشخیص میدهد.
Sensor → Obstacle detected
مرحله ۲ — Perception
نرمافزار اطلاعات سنسور را پردازش میکند.
Sensor Data
↓
Perception
مرحله ۳ — Decision
سیستم ناوبری تعیین میکند که چه کاری باید انجام شود.
Obstacle
↓
Navigation Algorithm
↓
New Direction
مرحله ۴ — Control
کنترلکننده فرمانهای لازم را برای چرخها تولید میکند.
Navigation
↓
Controller
↓
Left Wheel / Right Wheel
مرحله ۵ — Physics
PyBullet حرکت حاصل از این فرمانها را محاسبه میکند.
Wheel Commands
↓
Physics Engine
↓
Robot Motion
سپس این چرخه دوباره تکرار میشود.
این ساختار یک سیستم رباتیک حلقهبسته — Closed-Loop Robotic System ایجاد میکند:
┌──────────────────────┐
│ │
▼ │
Sensor │
│ │
▼ │
Perception │
│ │
▼ │
Navigation │
│ │
▼ │
Control │
│ │
▼ │
AGV │
│ │
▼ │
Physics ─────────────────┘
این معماری یکی از مفاهیم مرکزی دوره ما خواهد بود.
13. چرا قبل از ربات واقعی، شبیهسازی میکنیم؟
ساخت و آزمایش یک ربات واقعی از همان ابتدا میتواند هزینهبر و پرریسک باشد.
فرض کنید یک الگوریتم جدید ناوبری را روی یک AGV واقعی آزمایش کنیم.
یک خطای نرمافزاری ممکن است باعث شود ربات:
- با دیوار برخورد کند،
- به چرخهای خود آسیب بزند،
- به محموله آسیب بزند،
- واژگون شود،
- یا به تجهیزات دیگر آسیب وارد کند.
در محیط شبیهسازی، میتوانیم همان الگوریتم را در یک محیط کنترلشده آزمایش کنیم.
برای مثال:
Real Robot
Cost → High
Risk → High
Iteration → Slow
Hardware → Required
در مقابل:
Simulation
Cost → Low
Risk → Very low
Iteration → Fast
Hardware → Not initially required
البته این به معنی آن نیست که شبیهسازی کاملاً جایگزین آزمایش روی ربات واقعی میشود.
هدف ما این است که از شبیهسازی برای کاهش میزان آزمایشهای فیزیکی پرهزینه استفاده کنیم.
این موضوع ما را به یک مفهوم مهم در رباتیک میرساند که در ادامه دوره با آن مواجه خواهیم شد:
Sim-to-Real
ایده Sim-to-Real این است که الگوریتمها ابتدا در محیط شبیهسازی توسعه و آزمایش شوند و سپس در نهایت به یک سیستم رباتیک واقعی منتقل شوند.
14. محدودیتهای PyBullet
PyBullet قدرتمند است، اما نمیتواند نمایش کاملاً دقیقی از تمام جنبههای واقعیت ارائه دهد.
این یک اصل مهم مهندسی است:
شبیهسازی یک مدل از واقعیت است، نه خود واقعیت.
برای مثال، یک AGV واقعی ممکن است با موارد زیر مواجه شود:
- تغییر شکل پیچیده لاستیکها،
- سطوح ناهموار کف،
- لرزشها،
- نویز سنسورها،
- موتورهای غیرایدهآل،
- لقی گیربکس،
- تأخیرهای الکتریکی،
- تغییرات ولتاژ باتری،
- تلرانسهای ساخت.
یک شبیهسازی سادهشده ممکن است نتواند تمام این اثرات را با دقت بازتولید کند.
بنابراین:
Simulation ≠ Reality
بلکه:
Simulation
↓
Approximation of Reality
↓
Algorithm Development
↓
Testing
↓
Real Robot
↓
Validation
بنابراین PyBullet برای یادگیری، ساخت نمونه اولیه، توسعه الگوریتم، تحقیقات رباتیک و بسیاری از وظایف شبیهسازی بسیار مناسب است؛ اما دقت نتیجه نهایی به این بستگی دارد که مدل شبیهسازیشده تا چه اندازه بتواند سیستم واقعی را بهدرستی نمایش دهد.
15. PyBullet در دوره AGV ما چه نقشی خواهد داشت؟
ما PyBullet را صرفاً برای یادگیری PyBullet یاد نمیگیریم.
در این دوره، PyBullet بهتدریج تبدیل به موتور شبیهسازی سیستم AGV ما خواهد شد.
از آن برای موارد زیر استفاده خواهیم کرد:
فاز ۱ — پایه شبیهسازی
PyBullet
↓
World
↓
Gravity
↓
Objects
↓
Simulation Loop
فاز ۲ — AGV
AGV Model
↓
Wheels
↓
Motors
↓
Movement
فاز ۳ — سنسورها
AGV
├── Camera
├── Distance Sensor
└── Other virtual sensors
فاز ۴ — کنترل
Sensor Data
↓
Controller
↓
Wheel Commands
↓
AGV Motion
فاز ۵ — ناوبری
Map
↓
Path Planning
↓
Trajectory
↓
AGV
فاز ۶ — بینایی ماشین و هوش مصنوعی
Camera
↓
Image
↓
Computer Vision
↓
AI
↓
Decision
↓
AGV
در این مرحله است که پروژه ما از یک شبیهسازی ساده به سمت یک سیستم رباتیک کاملتر حرکت میکند.
16. مهمترین مدل ذهنی
در این مرحله میخواهم یک مفهوم ساده را به خاطر بسپارید.
به PyBullet به شکل زیر نگاه نکنید:
«برنامهای که یک ربات را نمایش میدهد.»
بلکه به PyBullet اینگونه نگاه کنید:
«یک آزمایشگاه مجازی و قابل برنامهریزی است که در آن میتوانیم سیستمهای رباتیک را بسازیم، کنترل کنیم، مشاهده کنیم و آزمایش کنیم.»
داشتن این مدل ذهنی باعث میشود درک جلسات بعدی بسیار آسانتر شود.
17. PyBullet در یک دیاگرام
PYTHON
│
▼
┌─────────────┐
│ PyBullet │
│ API │
└──────┬──────┘
│
▼
┌─────────────────┐
│ Bullet Physics │
│ Engine │
└────────┬────────┘
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
Robot Objects Sensors
│ │ │
└────────────┼────────────┘
│
▼
Simulation
│
▼
Sensor Data
│
▼
Control / AI
│
▼
Robot Motion
│
└──────────────►
18. پس از پایان این جلسه چه چیزهایی باید بدانید؟
پس از پایان این جلسه، باید بتوانید به سؤالات زیر پاسخ دهید:
1. PyBullet چیست؟
یک رابط پایتونی برای شبیهسازی مبتنی بر فیزیک است که بهخصوص برای رباتیک، شبیهسازی و یادگیری ماشین کاربرد دارد.
2. Bullet چیست؟
موتور / SDK فیزیکی زیربنایی است که PyBullet بر پایه آن ساخته شده است.
3. چرا از PyBullet استفاده میکنیم؟
زیرا به ما اجازه میدهد سیستم رباتیک خود را در یک محیط قابل برنامهریزی و مبتنی بر فیزیک توسعه داده و آزمایش کنیم.
4. آیا PyBullet میتواند رباتها را شبیهسازی کند؟
بله. PyBullet میتواند مدلهای رباتی مفصلی را بارگذاری و شبیهسازی کند و از طریق پایتون با آنها تعامل داشته باشد.
5. آیا PyBullet میتواند سنسورها را شبیهسازی کند؟
بله. PyBullet میتواند دادههای دوربین شبیهسازیشده تولید کند و از روشهایی مانند Ray Intersection پشتیبانی میکند. خروجی دوربین نیز میتواند شامل RGB، عمق و اطلاعات segmentation باشد.
6. آیا PyBullet جایگزین ربات واقعی میشود؟
خیر.
PyBullet یک محیط شبیهسازی برای توسعه، آزمایش و بررسی سیستم است و نمیتواند بهطور کامل جای آزمایش و اعتبارسنجی روی ربات واقعی را بگیرد.
7. هدف نهایی ما چیست؟
هدف ما صرفاً این نیست که:
«PyBullet را یاد بگیریم.»
هدف ما این است که:
یک شبیهسازی کاربردی AGV بسازیم و بهتدریج فیزیک، سنسورها، کنترل، ناوبری، بینایی ماشین و هوش مصنوعی را در یک سیستم رباتیک منسجم با یکدیگر ادغام کنیم.
نکات کلیدی
PyBullet = Python + Physics Simulation + Robotics
این پنج مفهوم را به خاطر بسپارید:
1. PyBullet یک ابزار شبیهسازی رباتیک است.
2. Bullet موتور فیزیک زیربنایی آن را فراهم میکند.
3. پایتون شبیهسازی را کنترل میکند.
4. سنسورها به ربات شبیهسازیشده اجازه میدهند محیط اطراف خود را درک کند.
5. AGV ما بهتدریج از یک ربات شبیهسازیشده ساده
به یک سیستم رباتیک کامل تبدیل خواهد شد.
گام بعدی → جلسه ۳: آشنایی با محیط PyBullet و اتصال Python به شبیهساز
در جلسه بعد، از «PyBullet چیست؟» به سمت «چگونه واقعاً PyBullet را از طریق Python اجرا کنیم؟» حرکت خواهیم کرد و اولین ارتباط میان برنامه پایتون و محیط شبیهسازی را ایجاد خواهیم کرد.
