TurtleSim দিয়ে PID নিয়ন্ত্রণ

প্রকল্পের GitLab রিপোজিটরি

সারসংক্ষেপ

Move Turtle একটি সহজ ROS পাইথন স্ক্রিপ্ট যা ROS-এর TurtleSim-এ টার্টলটিকে নির্দিষ্ট স্থানাঙ্ক (পয়েন্ট) এ সরায়। এই প্রকল্পটি CSCI473 ক্লাস প্রকল্প হিসেবে Colorado School of Mines (CSOM)-এ শুরু হয়েছিল এবং পরে এটি এমন একটি প্রকল্পে পরিণত হয় যা আমাকে ক্লোজ-লুপ সিস্টেম কিভাবে তৈরি করা যায় সেটা শেখাতে সহায়তা করেছে, যার জ্ঞানটি CSOM-এর Human Centered Robotics (HCR) ল্যাবে আমার কাজে সহায়ক ছিল।

প্রেক্ষাপট

পটভূমি হিসেবে, ROS হলো Robot Operating Systems এর সংক্ষিপ্ত রূপ। ROS একটি ওপেন-সোর্স রোবোটিক্স মিডলওয়্যার, সাধারণত উবুন্টু অপারেটিং সিস্টেমের সাথে যুক্ত থাকে, যা একটি রোবোটিক সিস্টেমের সফটওয়্যার কম্পোনেন্ট/ক্লাস্টারগুলো আরও ভালভাবে পরিচালনা করতে ব্যবহৃত হয়। আপনি ROS কিভাবে ব্যবহার করবেন তা ROS-এর অফিসিয়াল wiki থেকে আরও জানতে পারবেন। আপনি ROS-এ যে কোড লিখেন তা C++ বা পাইথন দুইটির যে কোনো একটিতে থাকে।

TurtleSim হলো একটি সহজ 2D রোবট সিমুলেটর যা ROS এবং ROS প্যাকেজগুলিতে নতুন ব্যবহারকারীদের পরিচয় করানোর জন্য ব্যবহৃত হয়। TurtleSim শুধু একটি সহজ 2D ডিসপ্লে দিয়ে একটি টার্টল খুলে দেয়। সেই টার্টলটি “রোবট” হিসেবে কাজ করে এবং আপনি সেই “রোবট”-এ মেসেজ পাঠাতে পারেন যাতে তা সরে যায় এবং/অথবা ঘোরে। চলমান থাকার সময়, TurtleSim বাস্তব বিশ্বের পদার্থবিজ্ঞানকে সহজভাবে অনুকরণ করার জন্য কিছু র্যান্ডম ত্রুটি তৈরি করে।

ROS এবং TurtleSim কী তা জানার পর, কেন আমি এগুলো ব্যবহার করছিলাম? ভালো, 2020-এর বসন্তে আমি Colorado School of Mines-এ “Human Centered Robotics” নামে একটি ক্লাস নিচ্ছিলাম আমার স্নাতক কম্পিউটার সায়েন্স ক্লাস লোডের অংশ হিসেবে। ক্লাসটি Dr. Hao Zhang দ্বারা পাঠানো হচ্ছিল। ক্লাসটি তিনটি প্রকল্প নিয়ে গঠিত ছিল এবং প্রথম প্রকল্পটি ছিল ROS সেটআপ করা, ROS ব্যবহার শেখা, এবং একটি ওপেন-লুপ বা ক্লোজ-লুপ অ্যালগরিদম বাস্তবায়ন করা যা TurtleSim-এর টার্টলকে M আকৃতি এঁকে দিতে পারবে। মূল প্রকল্পের বর্ণনা এখানে দেখা যেতে পারে।

আমি যখন ক্লাসটি নিচ্ছিলাম, আমি এই প্রকল্পটি ওপেন-লুপ অ্যালগরিদম বাস্তবায়ন করে সম্পন্ন করেছিলাম। এই সমাধানটি কাজ করেছিল কিন্তু এটি সত্যিই খারাপ ছিল এবং একটি A আঁকেছিল যা “যোগ্য” ছিল কিন্তু “চমৎকার” থেকে বহুদূরে ছিল। 2020 সালের ফেব্রুয়ারির মাঝামাঝি সময়ে প্রকল্প জমা দেওয়ার পর, প্রায় এক বছর পেরিয়ে 2021 সালের ফেব্রুয়ারিতে আমি এটি ভুলে গিয়েছিলাম।

চ্যালেঞ্জ

2021 সালের ফেব্রুয়ারিতে, আমি Human Centered Robotics (HCR) ল্যাবে রিসার্চ অ্যাসিস্ট্যান্ট হিসেবে নিযুক্ত হই Colorado School of Mines-এ যেখানে আমি Dr. Hao Zhang এর অধীনে কাজ করেছিলাম। ল্যাবের লক্ষ্য হলো “অনবরত সহযোগিতামূলক স্বায়ত্তশাসন” নিয়ে গবেষণা করা, যার উদ্দেশ্য হলো রোবটগুলোকে দীর্ঘ সময় ধরে অপারেট ও অভিযোজিত করা সক্ষম করা। ১-সেপ্টেম্বর-২০২২ তারিখে ল্যাবটি Colorado School of Mines থেকে University of Massachusetts Amherst-এ চলে গেছে। কিন্তু আমি যখন সেখানে কাজ করছিলাম তারা তখনো Colorado-তেই অবস্থান করত।

HCR ল্যাবে, আমার প্রথম কাজ ছিল Triton প্রকল্পে কাজ করা। Triton প্রকল্পে কয়েক ডজন Triton নামে রোবট ছিল। Triton গুলো ছিল ত্রিভুজাকৃতি omni wheel গ্রাউন্ড রোবট যেগুলো এই রকম দেখতে:

Triton গুলোর পাশাপাশি, আটটি IR ক্যামেরা OptiTrack থেকে মাটির উপরে কয়েক ফুট উচ্চতায় “অক্টাগন অর্ডারে” স্থাপন করা হয়েছিল। ঐ ক্যামারাগুলো, Optitrack-এর Motive সফটওয়্যার, একটি Windows 10 চালিত পিসি, এবং ROS ব্যবহার করে; 2 মিটার বাই 2 মিটার বাই 2 মিটার (x, y, z) একটি স্পেস তৈরি করা হয় যেখানে motion capture markers যুক্ত বস্তুগুলোর বাস্তব বিশ্ব অবস্থান নির্দিষ্টভাবে নির্ধারণ করা যায়।

Triton প্রকল্পে আমার প্রথম কাজ ছিল এমন স্ক্রিপ্ট তৈরি করা যা Triton রোবটটিকে একটি নির্দিষ্ট বাস্তব-যুগ্ম স্থানাঙ্কে নিয়ে যেতে পারে। তখন আমি নিশ্চিত ছিলেন না এটি কিভাবে অর্জন করা যায় কিন্তু আমি CSCI473-এর প্রথম প্রকল্পটি মনে করেছিলাম যেখানে ক্লোজ-লুপ সিস্টেমের ধারণা আমাকে পরিচয় করানো হয়েছিল, তাই আমি ক্লোজ-লুপ সিস্টেম এবং পরিণামে ফিডব্যাক সিস্টেম সম্পর্কে গভীরভাবে গবেষণা শুরু করলাম।

গবেষণা

গবেষণার সময়, আমি AerospaceControlsLab-এর এই চমৎকার ভিডিওটি আবিষ্কার করলাম:

এই ভিডিওতে, PID সিস্টেমের ধারণা প্রদর্শিত ও ব্যাখ্যা করা হয়। PID সিস্টেম হলো একটি ক্লোজ-লুপ, কনট্রোল লুপ, সিস্টেম যা বাস্তব বিশ্বের ডেটা থেকে নির্দিষ্ট আউটপুট(গুলি) উৎপন্ন করে। সহজ কথায়, এটি একটি ফিডব্যাক সিস্টেম যা কাঙ্ক্ষিত মান এবং পরিমাপিত মানের মধ্যে পার্থক্যের উপর ভিত্তি করে তার আউটপুট সমন্বয় করে। একটি PID কন্ট্রোলারের সূত্র হলো:

$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$

  • $u(t)$ হল নিয়ন্ত্রণ সিগন্যাল।
  • $K_p$, $K_i$, $K_d$ যথাক্রমে প্রোপোরশনাল, ইন্টেগ্রাল, এবং ডেরিভেটিভ গেইন।
  • $e(t)$ হল এরর সিগন্যাল (কাঙ্ক্ষিত এবং বাস্তব আউটপুটের মধ্যে পার্থক্য)।
  • $\int e(t) dt$ হল সময়ের উপর এররের ইন্টেগ্রাল।
  • $\frac{de(t)}{dt}$ হল এররের ডেরিভেটিভ।

এ সম্পর্কে আরও জানতে, AerospaceControlsLab-এর ভিডিও অথবা এই আশ্চর্য উইকিপিডিয়া প্রবন্ধ দেখুন যেখান থেকে এই সূত্র নেওয়া হয়েছে।

আমার গবেষণা এবং কিছু বন্ধু ও প্রফেসরদের সাহায্য নিয়ে, আমি নির্ধারণ করেছিলাম যে Proportional Controller, P Controller ব্যবহার করাই Triton-কে নির্দিষ্ট একটি স্থানাঙ্কে পৌঁছাতে সহায়ক হবে।

চونکہ Triton একটি গ্রাউন্ড রোবট, তাই আমাকে কেবল X এবং Y স্থানাঙ্ক নিয়ে চিন্তা করতে হবে। এটা জেনে, আমাকে সিদ্ধান্ত নিতে হয়েছিল কোন কাঙ্ক্ষিত মান এবং পরিমাপিত মানগুলি P Controller(গুলো)-এ পরিমাপ এবং প্রক্রিয়াজাত করা হবে। আমার গবেষণায় আমি ROS উইকির এই অসাধারণ পোস্টটি পেলাম যেটির নাম Go to Goal যেখানে তারা নিম্নলিখিত এররগুলোর উপর ফোকাস করেছে:

  • দূরত্বের এরর: কাঙ্ক্ষিত অবস্থান (X, Y) এবং বর্তমান অবস্থান (X, Y)-এর মধ্যে দূরত্বের পার্থক্য।
  • থিটা এরর: কাঙ্ক্ষিত অভিমুখীতা এবং বর্তমান অভিমুখীতার মধ্যে পার্থক্য।

প্রস্তাবিত সমাধান

এগুলো জেনে, Triton-কে নির্দিষ্ট বাস্তব-যুগ্ম স্থানাঙ্কে সরানোর সমাধান হলো Triton-এর লক্ষ্য স্থানাঙ্ক এবং বর্তমান স্থানাঙ্কের প্রতি সম্পর্কিত Triton-এর দূরত্ব এরর এবং থিটা এররের জন্য একটি Proportional Controller ব্যবহার করা। কিন্তু এটি বাস্তব সিস্টেমে বাস্তবায়নের আগে, আমি ধারণাটি একটি সিমুলেশনে পরীক্ষা করতে চেয়েছিলাম এবং তখন আমার মনেই হয়েছিল TurtleSim সিমুলেশনের জন্য সেরা পছন্দ।

সিমুলেশনে পরীক্ষা

তাত্ত্বিক সমাধানটি বর্ণনা করার পর, আমি প্রাথমিকভাবে সেটি সিমুলেশনে যাচাই করার সিদ্ধান্ত নিলাম, বাস্তব-বিশ্বের পরিস্থিতি না করে। বাস্তব বিশ্ব প্রায়ই শব্দে ভরা থাকে যা সমাধানের কার্যকারিতা ঝাপসা করে দিতে পারে এবং অপ্রাসঙ্গিক সমস্যাগুলোর সাথে মোকাবিলা করতে হতে পারে। এটি বিবেচনায় রেখে, আমি আমার CSCI473 প্রকল্প পুনরায় দেখলাম এবং এই তাত্ত্বিক সমাধানটির পরীক্ষার ময়দানি হিসেবে সেটি অভিযোজিত করলাম।

ROS Melodic ব্যবহার করা পুরনো কোডটি ROS Noetic ব্যবহার করার জন্য আপডেট করার পরে এবং কিছু পুনরাবৃত্তিমূলক পরিমার্জনের মাধ্যমে, আমি TurtleSim-এ প্রস্তাবিত সমাধানটি কার্যকর করতে সক্ষম হয়েছিলাম। এর কার্যকারিতার ডেমোনস্ট্রেশন, কিছু চমৎকার লক্ষ্য স্থানাঙ্ক পাথসহ, এই ব্লগ পোস্টটির শেষে দেখা যেতে পারে। এর সকল কোড এখানে দেখা যাবে।

উপসংহার

সংক্ষেপে, এই প্রকল্পের মাধ্যমে TurtleSim টার্টলটি ক্লোজ-লুপ সিস্টেম ব্যবহার করে নির্ধারিত স্থানাঙ্কে কার্যকরভাবে নেভিগেট করতে সক্ষম হয়েছে, যা আমার 2020 সালের প্রাথমিক ওপেন-লুপ সিস্টেমের চেয়ে অনেক উন্নত। সফলভাবে পরীক্ষা করে, আমি এই সমাধানটি Triton রোবটগুলোর সাথে বাস্তবায়ন করেছি। কিন্তু বাস্তব-জগতের শব্দ অপ্রত্যাশিত সমস্যা সৃষ্টি করে যা সপ্তাহব্যাপী ডিবাগিং এবং বাস্তব বিশ্বের পরীক্ষার প্রয়োজন পড়ে। সেসব সপ্তাহের পর, আমি শেষ পর্যন্ত TurtleSim-এ পরীক্ষিত পদ্ধতি ব্যবহার করে Triton-কে নির্দিষ্ট বাস্তব-যুগ্ম স্থানাঙ্কে পৌঁছে দিতে সক্ষম হয়েছি। এখানে TurtleSim-এ পরীক্ষিত পদ্ধতি ব্যবহার করে Triton-এর নির্দিষ্ট বাস্তব-যুগ্ম স্থানাঙ্কে চলে যাওয়ার একটি ডেমো রয়েছে:

পুনর্মূল্যায়নে, আমি ক wish ইচ্ছা করতাম যে আমি এমন একটি সিমুলেশন ব্যবহার করতাম যা বাস্তব বিশ্বের পদার্থবিজ্ঞানকে আরও ভালভাবে অনুকরণ করে। TurtleSim শেখার জন্য দারুণ কিন্তু বাস্তব-জগতের রোবোটিক্স আইডিয়াগুলি পরীক্ষার জন্য ততটা উপযুক্ত নয়। তখন আমার ধারণা ছিল এটি আমার সহজ ব্যবহারের ক্ষেত্রে যথেষ্ট হবে কিন্তু পরবর্তীতে তা প্রমাণিত হয়নি।

এই ব্লগ পোস্টের প্রধান উদ্দেশ্য ছিল একটি ক্লোজড-লুপ সিস্টেম তৈরি করা ব্যাখ্যা করা যাতে TurtleSim-এ টার্টল এবং পরবর্তীতে Triton রোবটগুলি নির্দিষ্ট লক্ষ্য অবস্থান (X, Y) তে সঠিকভাবে নেভিগেট করতে পারে। আমি বিশ্বাস করি এই লক্ষ্যটি অর্জিত হয়েছে, এবং এটি আমার HCR ল্যাবে কাজের প্রতি কিছু আগ্রহও আকর্ষণ করেছে। এটি জেনে আমি HCR ল্যাবে আমার কাজের অভিজ্ঞতা সম্পর্কে আরও ব্লগ পোস্ট করার পরিকল্পনা করছি…

টার্টল সরানো (TurtleSim) ডেমোসমূহ

এই ভিডিওতে নিম্নলিখিত ডেমোগুলো রয়েছে:

  • কেইলি নোডাল: একটি সাধারণ Cayley Nodal ডিজাইন
  • বৃত্ত: একটি জাল-নকশার মত ডিজাইন
  • ভিতরের বৃত্ত: “বৃত্তের ভিতরে বৃত্ত” ডিজাইন
  • এম: একটি খুব সাধারণ এম ডিজাইন