مین مواد پر جائیں

Linux، Git اور ٹولنگ

Beginner35 minBefore this:Workstation setup

آپ کے روبوٹ کے کمپیوٹر میں کوئی ماؤس، کوئی ڈیسک ٹاپ اور اکثر کوئی اسکرین نہیں ہوتی۔ آپ ٹرمینل کے ذریعے نیٹ ورک پر اس تک پہنچتے ہیں۔ جب کل کام کرنے والا کوڈ آج کام کرنا بند کر دیتا ہے، تو آپ کو بالکل ٹھیک معلوم ہونا چاہیے کہ کیا بدلا ہے۔ اور جب کوئی ساتھی کہتا ہے "یہ میری مشین پر چلتا ہے"، تو آپ کو اسے اپنی مشین پر چلانے کا ایک طریقہ درکار ہوتا ہے۔ شیل، Git اور Docker وہ طریقے ہیں جن سے پیشہ ورانہ روبوٹکس ٹیمیں ان تینوں مسائل کو حل کرتی ہیں، اور یہ اب آپ کے وقت کے ایک گھنٹے کے مستحق ہیں۔

You will be able to

  • فائل سسٹم میں نیویگیٹ کریں اور پائپ (pipes) اور ری ڈائریکشن (redirection) کے ساتھ کمانڈز کو ملا کر استعمال کریں۔
  • ماحولیاتی متغیرات (environment variables) کو پڑھیں اور مرتب کریں، اور فائل کی اجازتوں (file permissions) کو سمجھیں۔
  • بغیر کسی خطرے کے کام محفوظ کرنے، برانچ بنانے، مرج کرنے اور غلطیوں کو واپس لینے کے لیے Git کا استعمال کریں۔
  • امیجز (images)، کنٹینرز (containers) اور والیومز (volumes) کی وضاحت کریں، اور ایک ROS 2 Jazzy کنٹینر چلائیں۔
  • ایک چھوٹا شیل اسکرپٹ (shell script) لکھیں جو سیٹ اپ کا ایک قدم خودکار بناتا ہے۔

دس منٹ میں شیل​

شیلشیل ایک ایسا پروگرام ہے جو آپ کے ٹائپ کردہ کمانڈز کو پڑھتا ہے اور انہیں چلاتا ہے؛ Ubuntu پر ڈیفالٹ bash ہے۔ کمپیوٹر کے لیے ایک ٹیکسٹ انٹرفیس ہے۔ ایک کمانڈ پروگرام کا نام ہوتا ہے جس کے بعد آپشنز اور آرگومنٹس ہوتے ہیں۔ یہ وہ کمانڈز ہیں جنہیں آپ روزانہ استعمال کریں گے۔

CommandWhat it does
pwdموجودہ ڈائریکٹری کا پرنٹ لیں
ls -laتفصیلات کے ساتھ پوشیدہ فائلوں سمیت تمام فائلوں کی فہرست بنائیں
cd pathڈائریکٹری تبدیل کریں (cd .. اوپر جاتا ہے، cd ~ ہوم ڈائریکٹری میں جاتا ہے)
mkdir -p a/bایک ڈائریکٹری اور تمام پیرنٹ ڈائریکٹریز بنائیں
cp a b / mv a bکاپی کریں / منتقل کریں یا نام تبدیل کریں
rm file / rm -r dirحذف کریں (کوئی ریسائیکل بن نہیں ہے: محتاط رہیں)
cat file / less fileفائل دکھائیں / صفحہ بہ صفحہ دیکھیں
grep -rn "text" .فائلوں میں متن تلاش کریں، ریکرسیو انداز میں
find . -name "*.py"نام کے ذریعے فائلیں تلاش کریں
man ls or ls --helpرہنما ہدایت نامہ (manual) پڑھیں

دو خصوصیات شیل کو طاقتور بناتی ہیں۔ ایک پائپ (|) ایک کمانڈ کے آؤٹ پٹ کو دوسرے کی ان پٹ بناتا ہے، اور ری ڈائریکشن (>, >>) آؤٹ پٹ کو فائل میں بھیجتا ہے۔

terminal
# Count how many Python files are in this project
find . -name "*.py" | wc -l

# Find every line mentioning "lidar", save the results
grep -rn "lidar" . > lidar_mentions.txt

# Append a timestamped note to a log
echo "$(date) calibrated camera" >> notes.log

اوپر والا تیر کا بٹن دبانے سے پچھلے کمانڈز یاد آتے ہیں، Tab ناموں کو مکمل کرتا ہے، اور Ctrl+C چلتے ہوئے پروگرام کو روکتا ہے۔ ان تینوں کو سیکھیں اور آپ دگنی رفتار سے کام کریں گے۔

کبھی بھی ایسا کمانڈ کاپی نہ کریں جسے آپ نہیں سمجھتے

انٹرنیٹ سے کوئی کمانڈ پیسٹ کرنے سے پہلے، خاص طور پر sudo، rm یا curl ... | bash والا، اسے پڑھیں۔ اگر آپ وضاحت نہیں کر سکتے کہ یہ کیا کرتا ہے، تو Rivet سے پوچھیں یا man کے ساتھ تلاش کریں۔ روٹ (root) کے طور پر چلائی گئی ایک غلط کمانڈ آپ کے سسٹم کو خراب کر سکتی ہے۔

ماحولیاتی متغیرات، PATH اور اجازتیں​

ایک ماحولیاتی متغیرایک ماحولیاتی متغیر (environment variable) ایک نامزد قیمت ہے، جیسے PATH یا ROS_DISTRO، جسے شیل اپنے شروع کردہ ہر پروگرام تک پہنچاتا ہے۔ ایک نامزد سیٹنگ ہے۔ آپ نے پہلے ROS_DISTRO دیکھا تھا۔ دو اہم متغیرات:

  • PATH ان فولڈرز کی فہرست ہے جنہیں شیل تلاش کرتا ہے جب آپ کوئی کمانڈ ٹائپ کرتے ہیں۔ اسی لیے source /opt/ros/jazzy/setup.bash سے ros2 کام کرتا ہے: یہ PATH میں فولڈرز شامل کرتا ہے۔
  • ROS_DOMAIN_ID روبوٹ نیٹ ورکس کو الگ کرتا ہے۔
terminal
echo $PATH # show it
export MY_ROBOT=kinemata1 # set it for this shell and its children
printenv MY_ROBOT # kinemata1

export کے ساتھ سیٹ کیا گیا متغیر ٹرمینل بند کرنے پر غائب ہو جاتا ہے۔ اسے برقرار رکھنے کے لیے، وہ لائن ~/.bashrc میں شامل کریں، جو ہر نئے ٹرمینل کے لیے چلتی ہے۔

اجازتیں (Permissions) یہ طے کرتی ہیں کہ کون فائل کو پڑھ، لکھ یا چلا سکتا ہے۔ ls -l کے ساتھ ان کی فہرست دیکھیں۔ -rwxr-xr-x جیسی لائن کا مطلب ہے کہ مالکان پڑھ، لکھ اور چلا سکتے ہیں، اور دیگر پڑھ اور چلا سکتے ہیں۔ اسکرپٹ کو چلانے کے قابل بنانے کے لیے:

terminal
chmod +x setup.sh
./setup.sh

sudo (ایڈمنسٹریٹر کے طور پر چلائیں) صرف تبھی استعمال کریں جب کسی کمانڈ کو واقعی اس کی ضرورت ہو، جیسے apt install۔ sudo کے ساتھ اپنا کوڈ چلانے سے root کی ملکیت والی فائلیں بن جاتی ہیں جو بعد میں الجھن کا باعث بنتی ہیں۔

پروسیس اور پیکجز​

ps aux | grep python چلتے ہوئے پروگراموں کی فہرست بناتا ہے۔ top لائیو استعمال دکھاتا ہے، اور kill PID نمبر کے ذریعے پروسیس کو روکتا ہے۔ سافٹ ویئر انسٹال کرنے کے لیے، sudo apt install name پیکج حاصل کرتا ہے، اور apt search word اسے تلاش کرتا ہے۔ آپ نے پچھلے سبق میں یہ کیا تھا۔

Git: آپ کے کوڈ کے لیے ایک ٹائم مشین​

GitGit ایک ورژن کنٹرول سسٹم ہے: یہ آپ کے پروجیکٹ کے اسنیپ شاٹس ریکارڈ کرتا ہے تاکہ آپ دیکھ سکیں کہ کیا بدلا ہے، پہلے والی حالت میں واپس جا سکیں، اور متوازی طور پر کئی ورژنز پر کام کر سکیں۔ آپ کے پروجیکٹ کے اسنیپ شاٹس کو ریکارڈ کرتا ہے، جنہیں commits کہا جاتا ہے۔ ہر کمٹ کے ساتھ ایک پیغام ہوتا ہے جس میں بتایا جاتا ہے کہ آپ نے تبدیلی کیوں کی۔ کچھ بھی ضائع نہیں ہوتا: آپ ہمیشہ واپس جا سکتے ہیں۔

بنیادی لوپ میں چار کمانڈز ہیں:

terminal
git init # start tracking this folder (once)
git status # what has changed?
git add transforms.py # stage a file for the next commit
git commit -m "Add transform helpers" # save the snapshot
git log --oneline # show the history

git add کے ساتھ اسٹیجنگ کرنے سے آپ کو یہ منتخب کرنے کی اجازت ملتی ہے کہ ہر کمٹ میں کیا جاتا ہے۔ git diff وہ تبدیلیاں دکھاتا ہے جو آپ نے ابھی تک اسٹیج نہیں کی ہیں۔

برانچز (Branches)​

ایک برانچ کام کی ایک الگ لائن ہے۔ آپ اپنے کام کرنے والے کوڈ کو خطرے میں ڈالے بغیر کسی خیال کو آزمانے کے لیے برانچز کا استعمال کرتے ہیں۔

terminal
git switch -c try-kalman-filter # create and move to a new branch
# ...edit, add, commit...
git switch main # go back
git merge try-kalman-filter # bring the work in
git branch -d try-kalman-filter # tidy up

اگر دو برانچز انہی لائنوں کو تبدیل کرتی ہیں، تو Git رک جاتا ہے اور آپ سے تنازعہ (conflict) حل کرنے کو کہتا ہے: یہ فائل میں دونوں ورژنز کی نشاندہی کرتا ہے، آپ اپنی مرضی کے مطابق ترمیم کرتے ہیں، پھر git add اور git commit کرتے ہیں۔

چیزیں کالعدم کرنا (Undoing)​

غلطیاں ہوتی ہیں۔ باہر نکلنے کے محفوظ طریقے یہ ہیں:

SituationCommand
ایک فائل میں تبدیلیاں مسترد کریںgit restore file.py
فائل کو ان اسٹیج (unstage) کریںgit restore --staged file.py
کمٹ منسوخ کریں لیکن نیا کمٹ ہسٹری میں رکھیںgit revert <commit>
پرانا ورژن دیکھیںgit show <commit>:file.py

ہسٹری کو دوبارہ لکھنے والی کمانڈز کے ساتھ محتاط رہیں، جیسے git reset --hard اور git push --force۔ وہ کام کو تباہ کر سکتی ہیں۔

ریموٹ اور کیا کمٹ نہیں کرنا چاہیے​

ایک ریموٹ جیسے GitHub سرور پر آپ کی ریپوزٹری کی ایک کاپی ہے۔ ایک بار git remote add origin URL استعمال کریں، پھر git push اور git pull کریں۔ ایک .gitignore فائل بنائیں جس میں ان چیزوں کی فہرست ہو جنہیں Git کو نظر انداز کرنا چاہیے:

.gitignore
__pycache__/
*.pyc
.venv/
build/
install/
log/
*.bag
.env

پاس ورڈز یا API کیز جیسے راز کبھی بھی کمٹ نہ کریں، اور بڑی جنریٹ شدہ فائلز (ROS 2 build/, install/, log/, اور ریکارڈ شدہ ڈیٹا) کو ریپوزٹری سے باہر رکھیں۔

Docker: ہر جگہ ایک جیسا ماحول​

ایک روبوٹکس پروجیکٹ آپریٹنگ سسٹم، ROS 2، لائبریریوں اور ان کے صحیح ورژنز پر انحصار کرتا ہے۔ DockerDocker ایک ایپلی کیشن کو اس کی آپریٹنگ سسٹم فائلوں اور انحصاروں (dependencies) کے ساتھ ایک امیج میں بنڈل کرتا ہے، جو ایک الگ تھلگ کنٹینر کے طور پر چلتا ہے۔ آپ کو اس تمام کو بنڈل کرنے دیتا ہے، تاکہ آپ کے کنٹینر میں چلنے والا پروجیکٹ آپ کے ساتھی کے کنٹینر، سرور، یا روبوٹ پر بھی چلے۔

جاننے کے لیے تین الفاظ:

  • ایک امیج (image) ایک منجمد ہدایت نامہ ہے: فائلیں اور انہیں چلانے کے لیے سیٹنگز۔
  • ایک کنٹینر (container) کسی امیج کا چلتا ہوا واقعہ (running instance) ہے۔ آپ آزادانہ طور پر کنٹینرز شروع اور ختم کر سکتے ہیں۔
  • ایک والیوم (volume) یا بائنڈ ماؤنٹ آپ کے کمپیوٹر اور کنٹینر کے درمیان ایک فولڈر کا اشتراک کرتا ہے، تاکہ کنٹینر ختم ہونے کے بعد بھی کام محفوظ رہے۔

Ubuntu کے لیے docs.docker.com پر سرکاری گائیڈ پر عمل کرتے ہوئے Docker انسٹال کریں (وہاں موجود موجودہ ہدایات پر عمل کریں)، پھر ایک آفیشل ROS 2 Jazzy امیج آزمائیں:

terminal
docker run --rm -it ros:jazzy
# inside the container:
ros2 --help
exit

--rm نکلنے پر کنٹینر کو حذف کر دیتا ہے، اور -it آپ کو ایک تفاعلی (interactive) ٹرمینل دیتا ہے۔ اپنے پروجیکٹ فولڈر کا اشتراک کرنے کے لیے:

terminal
docker run --rm -it -v "$PWD":/work -w /work ros:jazzy bash

یہاں -v موجودہ فولڈر کو /work پر ماؤنٹ کرتا ہے اور -w آپ کو اس میں شروع کرتا ہے۔ آپ وہاں جو فائلیں بناتے ہیں وہ آپ کے کمپیوٹر پر رہتی ہیں۔

اپنی امیج بنانے کے لیے، ایک Dockerfile لکھیں:

Dockerfile
FROM ros:jazzy
RUN apt-get update && apt-get install -y python3-numpy && rm -rf /var/lib/apt/lists/*
WORKDIR /work
CMD ["bash"]

اسے بنائیں اور چلائیں:

terminal
docker build -t kinemata-dev .
docker run --rm -it -v "$PWD":/work kinemata-dev
کنٹینرز اور گرافکس

کنٹینر سے Gazebo یا RViz چلانے کے لیے اضافی ڈسپلے سیٹنگز کی ضرورت ہوتی ہے۔ ہم سمیلیشن ماڈیول میں اس کی طرف لوٹیں گے۔ فی الحال، کنٹینرز کمانڈ لائن ورک اور قابلِ دوبارہ تخلیق بلڈز کے لیے ہیں۔

ایک چھوٹا اسکرپٹ جو سب کو جوڑتا ہے​

ایک شیل اسکرپٹشیل اسکرپٹ کمانڈز کی ایک ٹیکسٹ فائل ہے جسے شیل ترتیب سے چلاتا ہے، تاکہ ملٹی اسٹیپ کام ایک کمانڈ بن جائے۔ ایک روٹین کو ایک کمانڈ میں بدل دیتا ہے۔ یہ اسکرپٹ روبوٹکس ورک اسٹیشن کے لیے ایک تیز سیلف ہیلتھ رپورٹ پرنٹ کرتا ہے:

check_env.sh
#!/usr/bin/env bash
set -e # stop at the first error

echo "OS: $(lsb_release -ds)"
echo "Python: $(python3 --version)"
echo "Git: $(git --version)"

if command -v ros2 >/dev/null 2>&1; then
echo "ROS 2: ${ROS_DISTRO:-not sourced}"
else
echo "ROS 2: not found (did you source setup.bash?)"
fi

if command -v docker >/dev/null 2>&1; then
echo "Docker: $(docker --version)"
else
echo "Docker: not installed"
fi

chmod +x check_env.sh کے ساتھ اسے قابلِ عمل بنائیں اور ./check_env.sh چلائیں۔ پہلی لائن، shebang، بتاتی ہے کہ کون سا پروگرام فائل چلاتا ہے۔ set -e اسکرپٹ کو پہلے ناکام قدم پر روک دیتا ہے، جو غلطیوں کو خاموشی سے جمع ہونے سے روکتا ہے۔

عملی لیب (Hands-on lab)​

آپ اسکرپٹ کے ساتھ ایک ورژن شدہ ورک اسپیس بنائیں گے اور ایک ROS 2 کنٹینر چلائیں گے۔

  1. kinemata-workspace میں، اوپر والے اسکرپٹ کے ساتھ tools/check_env.sh بنائیں، اسے قابلِ عمل بنائیں، اور اسے چلائیں۔ جو بھی چیزیں غائب بتائی گئی ہیں انہیں ٹھیک کریں۔
  2. اوپر دیے گئے اندراجات کے ساتھ ایک .gitignore بنائیں اور اسے کمٹ کریں۔
  3. git switch -c add-tools کے ساتھ ایک برانچ بنائیں، اس برانچ پر اسکرپٹ کو کمٹ کریں، پھر git switch main اور git merge add-tools کے ساتھ اسے main میں مرج کریں۔
  4. git log --oneline چلائیں اور تصدیق کریں کہ آپ کو اس ماڈیول سے کم از کم تین کمٹ نظر آ رہے ہیں۔
  5. Docker انسٹال کریں (سرکاری گائیڈ پر عمل کرتے ہوئے)، پھر docker run --rm -it ros:jazzy چلائیں۔ اندر، ros2 --help اور پھر exit چلائیں۔
  6. اپنے فولڈر کے ساتھ کنٹینر کو ماؤنٹ کرکے چلائیں، /work کے اندر from_container.txt نامی فائل بنائیں، باہر نکلیں، اور ls کے ساتھ تصدیق کریں کہ فائل آپ کے ہوسٹ پر موجود ہے۔
  7. جائزہ: git log --oneline چند واضح کمٹ میسجز دکھاتا ہے، check_env.sh آپ کے ورژنز رپورٹ کرتا ہے، اور from_container.txt آپ کے فولڈر میں موجود ہے۔

مشقیں​

پائپ کا استعمالBeginner

ایک ایسی کمانڈ لکھیں جو موجودہ ڈائریکٹری ٹری میں پانچ سب سے بڑی فائلیں دکھائے۔

Show solutionHide solution
find . -type f -printf "%s %p\n" | sort -nr | head -5

find ہر فائل کو اس کے سائز کے ساتھ پرنٹ کرتا ہے، sort -nr سب سے بڑے کو پہلے رکھتے ہوئے عددی ترتیب دیتا ہے، اور head -5 پانچ لائنیں رکھتا ہے۔ ہر حصہ ایک کام کرتا ہے اور پائپ انہیں جوڑتا ہے۔

حذف شدہ فائل کی بحالیIntermediate

آپ نے notes.md کمٹ کی، پھر غلطی سے rm notes.md چلا دیا۔ آپ انٹرنیٹ پر تلاش کیے بغیر اسے واپس کیسے حاصل کریں گے؟

Show solutionHide solution

git restore notes.md چلائیں۔ Git آخری کمٹ سے فائل کو کاپی واپس کرتا ہے۔ اگر حذف کرنا پہلے ہی کمٹ ہو چکا تھا، تو git log --oneline -- notes.md کے ساتھ کمٹ تلاش کریں اور اس سے پچھلے والے سے git restore --source=<commit>~1 notes.md کے ساتھ بحال کریں۔ یہی وجہ ہے کہ آپ بار بار کمٹ کرتے ہیں۔

بائنڈ ماؤنٹ کیوں؟Intermediate

آپ docker run --rm -it ros:jazzy چلاتے ہیں، اندر کوڈ لکھتے ہیں، اور باہر نکلتے ہیں۔ آپ کا کوڈ غائب ہو گیا ہے۔ وضاحت کریں کہ ایسا کیوں ہوا اور اس کا حل دیں۔

Show solutionHide solution

--rm فلیگ کنٹینر کو حذف کر دیتا ہے، اور کنٹینر کے اپنے فائل سسٹم کے اندر لکھی گئی فائلیں اس کے ساتھ ہی ختم ہو جاتی ہیں۔ اپنے کمپیوٹر سے -v "$PWD":/work کے ساتھ ایک فولڈر ماؤنٹ کریں، اور /work کے اندر لکھیں۔ وہ فائلیں آپ کے ہوسٹ پر رہیں گی اور کنٹینر ہٹانے کے بعد بھی محفوظ رہیں گی۔

اپنی سمجھ کی جانچ کریں​

1find . -name "*.py" | wc -l میں پائپ (pipe) کیا کرتا ہے؟
2ROS setup اسکرپٹ کو سورس کرنے سے ros2 کیوں دستیاب ہوتا ہے؟
3چھوٹے اور بار بار کمٹ کرنے کی اہم وجہ کیا ہے؟
4Docker امیج اور کنٹینر میں کیا فرق ہے؟
0 of 4 answered

Takeaways

  • شیل پائپس اور ری ڈائریکشن کے ساتھ چھوٹی کمانڈز کو جوڑتا ہے، اور PATH یہ طے کرتا ہے کہ وہ کون سے پروگرام تلاش کر سکتا ہے۔
  • sudo کا استعمال احتیاط سے کریں، اور وہ کمانڈز پیسٹ نہ کریں جن کی آپ وضاحت نہیں کر سکتے۔
  • Git کمٹس سیو پوائنٹس ہیں: کمٹ چھوٹے کریں، وجہ لکھیں، اور محفوظ طریقے سے تجربات کرنے کے لیے برانچز کا استعمال کریں۔
  • رازوں اور جنریٹ شدہ فائلوں جیسے بلڈ فولڈرز کو .gitignore کے ساتھ Git سے باہر رکھیں۔
  • Docker ایک ماحول کو ایک امیج میں بنڈل کرتا ہے جو قابلِ تلف کنٹینرز کے طور پر چلتا ہے۔
  • اپنے پروجیکٹ فولڈر کو بائنڈ ماؤنٹ کریں تاکہ آپ کا کام کنٹینر کے بعد بھی محفوظ رہے۔

مزید گہرائی میں جائیں​

آگے: روبوٹ کی اناٹومی (Anatomy of a robot)

Finished the lab and the quiz?

Mark it done to track your progress through the course.