هدف جلسه
p.connect- GUI
- DIRECT
- reset
- disconnect
در پایان این جلسه باید بتوانی:
Python
↓
PyBullet
↓
Simulation Connection
↓
GUI
↓
Disconnect
و تفاوت این دو را بفهمی:
p.GUI
و:
p.DIRECT
فعلاً زمین، ربات، سنسور و فیزیک نمیسازیم. آنها مربوط به جلسات بعد هستند.
قدم ۱ — مطمئن شو Environment درست فعال است
در PyCharm لازم نیست فعلاً Conda Prompt را باز کنی.
داخل PyCharm برو به:
File → Settings → Project → Python Interpreter
باید Interpreter چیزی شبیه این باشد:
D:\MyProjects\Anaconda_PyEnv_pybullet_forge\python.exe
اگر همین است، خوب است.
قدم ۲ — main.py را باز کن
فعلاً تمام کدهای قبلی main.py را پاک کن.
این را بنویس:
import pybullet as p
این اولین خط جلسه ۶ است.
این خط یعنی چه؟
کتابخانه PyBullet را وارد برنامه میکنیم و اسم کوتاه p برایش قرار میدهیم.
یعنی بعداً به جای:
pybullet.connect()
میتوانیم بنویسیم:
p.connect()
این فقط یک نام مستعار (alias) است.
قدم ۳ — اتصال به PyBullet
زیر آن بنویس:
import pybullet as p
p.connect(p.GUI)
حالا main.py را اجرا کن.
باید یک پنجره مربوط به PyBullet Physics Server / GUI باز شود.
ممکن است فعلاً پنجره تقریباً خالی باشد.
این کاملاً طبیعی است.
چون هنوز هیچ World یا Objectی نساختهایم.
قدم ۴ — معنی p.connect() را بفهمیم
این خط:
p.connect(p.GUI)
یعنی:
Python را به یک Physics Server در PyBullet متصل کن و رابط گرافیکی را نمایش بده.
ساختار دستور:
p.connect(...)
│
└── اتصال به PyBullet
و:
p.GUI
میگوید:
اتصال را به صورت گرافیکی ایجاد کن.
قدم ۵ — disconnect
حالا برنامه را کاملتر کن:
import pybullet as p
p.connect(p.GUI)
p.disconnect()
ولی یک مشکل داریم.
برنامه بلافاصله این کار را انجام میدهد:
Connect
↓
Disconnect
↓
Program ends
بنابراین ممکن است پنجره را ببینی و بلافاصله بسته شود.
برای همین فعلاً یک مکث اضافه میکنیم.
import pybullet as p
import time
p.connect(p.GUI)
time.sleep(5)
p.disconnect()
حالا اجرا کن.
پنجره PyBullet باید حدود ۵ ثانیه باز بماند و سپس بسته شود.
قدم ۶ — حالا GUI و DIRECT
این یکی از مفاهیم مهم PyBullet است.
دو روش مهم اتصال داریم:
حالت GUI
p.connect(p.GUI)
یعنی:
PyBullet با پنجره گرافیکی اجرا شود.
برای یادگیری و مشاهده Simulation از این استفاده میکنیم.
حالت DIRECT
p.connect(p.DIRECT)
یعنی:
PyBullet بدون نمایش پنجره گرافیکی اجرا شود.
Simulation در پسزمینه اجرا میشود.
مثلاً:
import pybullet as p
client = p.connect(p.DIRECT)
print("Connected!")
p.disconnect(client)
خروجی:
Connected!
ولی هیچ پنجرهای باز نمیشود.
چرا client نوشتم؟
فعلاً فقط مفهومش را بدان؛ بعداً بیشتر با آن کار میکنیم.
وقتی مینویسی:
client = p.connect(p.GUI)
PyBullet یک شناسه اتصال (connection ID) برمیگرداند.
مثلاً:
0
بعد میتوانی بگویی:
p.disconnect(client)
یعنی همان اتصال را قطع کن.
برای پروژههای ساده میتوانی حتی بنویسی:
p.connect(p.GUI)
p.disconnect()
اما از اینجا به بعد بهتر است عادت کنیم Connection ID را ذخیره کنیم.
قدم ۷ — تست نهایی جلسه ۶
حالا main.py را به این تبدیل کن:
import pybullet as p
import time
print("Connecting to PyBullet...")
client = p.connect(p.GUI)
print("Connected!")
print("Connection ID:", client)
time.sleep(5)
p.disconnect(client)
print("Disconnected!")
اجرا کن.
باید چیزی شبیه این ببینی:
Connecting to PyBullet...
Connected!
Connection ID: 0
پنجره PyBullet باز میشود.
بعد از ۵ ثانیه:
Disconnected!
و پنجره بسته میشود.
چیزی که امروز باید واقعاً یاد گرفته باشی
فعلاً فقط این زنجیره را در ذهنت داشته باش:
import pybullet as p
↓
کتابخانه PyBullet را وارد کن
client = p.connect(p.GUI)
↓
به PyBullet وصل شو و GUI را باز کن
↓
Simulation
↓
p.disconnect(client)
↓
اتصال را ببند
و:
p.GUI
↓
پنجره گرافیکی
p.DIRECT
↓
بدون پنجره
یک نکته مهم برای پروژه AGV
فعلاً هیچ چیز دیگری به main.py اضافه نکن.
نه:
AGV
Lidar
Ground
Gravity
URDF
چون هرکدام جلسه خودش را دارد.
وقتی این تست را انجام دادی، خروجی main.py را بفرست. اگر درست بود، میرویم سراغ جلسه ۷ — ساخت اولین World در PyBullet: زمین + Gravity + Object.