সুচিপত্র:

অ্যাকসিলরোমিটার এবং গাইরো টিউটোরিয়াল: 3 ধাপ
অ্যাকসিলরোমিটার এবং গাইরো টিউটোরিয়াল: 3 ধাপ

ভিডিও: অ্যাকসিলরোমিটার এবং গাইরো টিউটোরিয়াল: 3 ধাপ

ভিডিও: অ্যাকসিলরোমিটার এবং গাইরো টিউটোরিয়াল: 3 ধাপ
ভিডিও: Tips for No Recoil Control Settings for Non-Gyro and Gyro Players in PUBG MOBILE / 2023 2024, জুলাই
Anonim
অ্যাকসিলেরোমিটার এবং গাইরো টিউটোরিয়াল
অ্যাকসিলেরোমিটার এবং গাইরো টিউটোরিয়াল

ভূমিকা

এই গাইডটি তাদের ইলেকট্রনিক্স প্রকল্পগুলিতে অ্যাকসিলরোমিটার এবং জাইরোস্কোপের পাশাপাশি আইএমইউ ডিভাইস (ইনটারিয়াল মেজারমেন্ট ইউনিট) ব্যবহারে আগ্রহী প্রত্যেকের উদ্দেশ্যে করা হয়েছে

আমরা কভার করব:

  • একটি অ্যাকসিলরোমিটার কি পরিমাপ করে?
  • জাইরোস্কোপ (ওরফে গাইরো) কি পরিমাপ করে?
  • এনালগ-টু-ডিজিটাল (এডিসি) রিডিংগুলি যেগুলি আপনি এই সেন্সর থেকে ভৌত ইউনিটগুলিতে রূপান্তর করবেন (সেগুলি অ্যাকসিলরোমিটারের জন্য জি, জাইরোস্কোপের জন্য ডিগ্রি/সেকেন্ড হবে)
  • স্থল সমতলে আপেক্ষিকভাবে আপনার ডিভাইসের প্রবণতা সম্পর্কে সঠিক তথ্য পাওয়ার জন্য কীভাবে অ্যাকসিলরোমিটার এবং জাইরোস্কোপ রিডিংগুলিকে একত্রিত করা যায়

পুরো নিবন্ধ জুড়ে আমি গণিতকে ন্যূনতম রাখার চেষ্টা করব। যদি আপনি জানেন যে সাইন/কোসিন/ট্যানজেন্ট কি তাহলে আপনি আপনার প্রকল্পে এই ধারণাগুলি বুঝতে এবং ব্যবহার করতে সক্ষম হোন না কেন আপনি কোন প্ল্যাটফর্ম ব্যবহার করছেন: Arduino, Propeller, Basic Stamp, Atmel chips, Microchip PIC, ইত্যাদি।

এমন কিছু লোক আছে যারা বিশ্বাস করে যে একটি IMU ইউনিট (জটিল FIR বা IIR ফিল্টার যেমন কলম্যান ফিল্টার, পার্কস-ম্যাকক্লেলান ফিল্টার ইত্যাদি) ব্যবহার করার জন্য আপনার জটিল গণিত প্রয়োজন। আপনি সে সব নিয়ে গবেষণা করতে পারেন এবং চমৎকার কিন্তু জটিল ফলাফল অর্জন করতে পারেন। জিনিস ব্যাখ্যা করার আমার উপায় শুধু মৌলিক গণিত প্রয়োজন। আমি সরলতায় মহান বিশ্বাসী। আমি মনে করি যে একটি সিস্টেম যা সহজ এবং নিয়ন্ত্রণ এবং পর্যবেক্ষণ করা সহজ, এছাড়া অনেক এমবেডেড ডিভাইসের ম্যাট্রিক্স গণনার জন্য প্রয়োজনীয় জটিল অ্যালগরিদম বাস্তবায়নের ক্ষমতা এবং সম্পদ নেই।

আমি উদাহরণ হিসেবে ব্যবহার করব একটি নতুন IMU ইউনিট, Acc_Gyro Accelerometer + Gyro IMU। আমরা নীচের আমাদের উদাহরণগুলিতে এই ডিভাইসের প্যারামিটার ব্যবহার করব। এই ইউনিটটি শুরু করার জন্য একটি ভাল ডিভাইস কারণ এটিতে 2 টি ডিভাইস রয়েছে:

- LIS331AL (ডেটা শীট) - একটি ট্রায়াক্সিয়াল 2G অ্যাকসিলরোমিটার - LPR550AL (ডেটা শীট) - একটি দ্বৈত -অক্ষের পিচ এবং রোল, 500 ডিগ্রী/সেকেন্ড জাইরোস্কোপ

তারা একসাথে 5-ডিগ্রি অফ ফ্রিডম ইনটারিয়াল মেজারমেন্ট ইউনিটের প্রতিনিধিত্ব করে। এখন এটি একটি অভিনব নাম! তা সত্ত্বেও, অভিনব নামের পিছনে একটি খুব দরকারী সংমিশ্রণ যন্ত্র যা আমরা এই গাইডে বিস্তারিতভাবে বর্ণনা করব এবং ব্যাখ্যা করব।

ধাপ 1: অ্যাক্সিলারোমিটার

অ্যাক্সিলারোমিটার
অ্যাক্সিলারোমিটার

এই ইউনিটটি বুঝতে আমরা অ্যাকসিলরোমিটার দিয়ে শুরু করব। অ্যাকসিলরোমিটার সম্পর্কে চিন্তা করার সময় প্রায়ই একটি বাক্সের ভিতরে একটি বলের সাথে একটি ঘনক্ষেত্রের আকৃতি তৈরি করা দরকারী। আপনি কুকি বা ডোনাটের মতো অন্য কিছু কল্পনা করতে পারেন, তবে আমি একটি বল কল্পনা করব:

অ্যাকসিলরোমিটার মডেল
অ্যাকসিলরোমিটার মডেল

যদি আমরা এই বাক্সটিকে এমন কোন স্থানে নিয়ে যাই যেখানে কোন মাধ্যাকর্ষণ ক্ষেত্র নেই বা অন্য কোন ক্ষেত্রের সাথে যা বলের অবস্থানকে প্রভাবিত করতে পারে - বলটি কেবল বাক্সের মাঝখানে ভেসে উঠবে। আপনি কল্পনা করতে পারেন বাক্সটি কোন মহাজাগতিক বস্তু থেকে বহুদূর মহাকাশে, অথবা যদি এমন একটি জায়গা খুঁজে পাওয়া কঠিন হয় তাহলে অন্তত একটি মহাকাশযান গ্রহের চারদিকে প্রদক্ষিণ করে যেখানে সবকিছুই ওজনহীন অবস্থায় রয়েছে। উপরের ছবি থেকে আপনি দেখতে পাচ্ছেন যে আমরা প্রতিটি অক্ষকে এক জোড়া দেয়াল (আমরা দেয়াল Y+ সরিয়ে দিয়েছি যাতে আমরা বাক্সের ভিতরে দেখতে পারি)। কল্পনা করুন যে প্রতিটি প্রাচীর চাপ সংবেদনশীল। যদি আমরা হঠাৎ বক্সটি বাম দিকে সরাই (আমরা ত্বরণ 1g = 9.8m/s^2 দিয়ে এটিকে ত্বরান্বিত করি), বলটি X- দেয়ালে আঘাত করবে। আমরা তখন বলটি মাপের চাপ বল পরিমাপ করি এবং X অক্ষে -1g এর মান আউটপুট করি।

অ্যাকসিলরোমিটার মডেল
অ্যাকসিলরোমিটার মডেল

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

যদি আমরা আমাদের মডেলটি নিয়ে পৃথিবীতে রাখি তবে বলটি Z- দেয়ালে পড়বে এবং নিচের দেয়ালে 1g বল প্রয়োগ করবে, যেমন নীচের ছবিতে দেখানো হয়েছে:

অ্যাকসিলরোমিটার মডেল
অ্যাকসিলরোমিটার মডেল

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

যদিও এই মডেলটি ঠিক কিভাবে একটি MEMS সেন্সর তৈরি করা হয় না তা প্রায়শই অ্যাকসিলরোমিটার সম্পর্কিত সমস্যা সমাধানে কাজে লাগে। প্রকৃতপক্ষে অনুরূপ সেন্সর আছে যার ভিতরে ধাতব বল রয়েছে, সেগুলিকে টিল্ট সুইচ বলা হয়, তবে এগুলি আরও আদিম এবং সাধারণত তারা কেবল বলতে পারে যে ডিভাইসটি কিছু পরিসরের মধ্যে ঝুঁকে আছে কি না, ঝোঁকের পরিমাণ নয়।

এখন পর্যন্ত আমরা একটি একক অক্ষের অ্যাকসিলরোমিটার আউটপুট বিশ্লেষণ করেছি এবং এই সবই আপনি একক অক্ষের অ্যাক্সিলারোমিটার দিয়ে পাবেন। ট্রায়াক্সিয়াল অ্যাকসিলরোমিটারের আসল মান এই সত্য থেকে আসে যে তারা তিনটি অক্ষের উপর জড় শক্তি সনাক্ত করতে পারে। আসুন আমাদের বক্স মডেলে ফিরে যাই, এবং বাক্সটিকে 45 ডিগ্রী ডানদিকে ঘোরানো যাক। বল এখন 2 টি দেয়াল স্পর্শ করবে: Z- এবং X- নীচের ছবিতে দেখানো হয়েছে:

অ্যাকসিলরোমিটার মডেল
অ্যাকসিলরোমিটার মডেল

0.71 এর মান নির্বিচারে নয়, তারা আসলে SQRT (1/2) এর জন্য একটি আনুমানিকতা। অ্যাক্সিলারোমিটারের জন্য আমাদের পরবর্তী মডেলটি উপস্থাপন করার সাথে সাথে এটি আরও স্পষ্ট হয়ে উঠবে।

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

অ্যাকসিলরোমিটার মডেল
অ্যাকসিলরোমিটার মডেল

দয়া করে উপরের মডেলটি দেখুন, আমি অক্ষের রংগুলি সংরক্ষণ করেছি যাতে আপনি আগের মডেল থেকে নতুনটিতে মানসিক পরিবর্তন করতে পারেন। শুধু কল্পনা করুন যে নতুন মডেলের প্রতিটি অক্ষ পূর্ববর্তী মডেলের বাক্সের নিজ নিজ মুখের লম্ব। ভেক্টর আর হল ফোর্স ভেক্টর যা অ্যাকসিলরোমিটার পরিমাপ করছে (এটি হতে পারে মহাকর্ষ বল বা উপরের উদাহরণ থেকে জড় শক্তি বা উভয়ের সংমিশ্রণ)। Rx, Ry, Rz হল X, Y, Z অক্ষের উপর R ভেক্টরের অভিক্ষেপ। নিম্নলিখিত সম্পর্ক লক্ষ্য করুন:

R^2 = Rx^2 + Ry^2 + Rz^2 (Eq। 1)

যা মূলত থ্রিডি তে পাইথাগোরীয় উপপাদ্যের সমতুল্য।

মনে রাখবেন যে একটু আগে আমি আপনাকে বলেছিলাম যে SQRT (1/2) ~ 0.71 এর মানগুলি এলোমেলো নয়। যদি আপনি উপরের সূত্রে তাদের প্লাগ করেন, আমাদের মহাকর্ষ বল 1 গ্রাম ছিল তা স্মরণ করার পরে আমরা যাচাই করতে পারি:

1^2 = (-SQRT (1/2))^2 + 0^2 + (-SQRT (1/2))^2

কেবল Eq.1 এ R = 1, Rx = -SQRT (1/2), Ry = 0, Rz = -SQRT (1/2) প্রতিস্থাপন করে

তত্ত্বের একটি দীর্ঘ প্রস্তাবনার পরে আমরা বাস্তব জীবনের অ্যাক্সিলারোমিটারের কাছাকাছি চলে আসছি। Rx, Ry, Rz- এর মানগুলি আসলেই সেই মানগুলির সাথে রৈখিকভাবে সম্পর্কিত যা আপনার বাস্তব জীবনের অ্যাকসিলরোমিটার আউটপুট করবে এবং যেটি আপনি বিভিন্ন গণনা করার জন্য ব্যবহার করতে পারেন।

আমরা সেখানে যাওয়ার আগে আসুন অ্যাকসিলরোমিটার আমাদের কাছে এই তথ্য পৌঁছে দেবে সে সম্পর্কে একটু কথা বলি। বেশিরভাগ অ্যাকসিলরোমিটার দুটি বিভাগে পড়বে: ডিজিটাল এবং এনালগ। ডিজিটাল অ্যাকসিলরোমিটার আপনাকে I2C, SPI বা USART এর মতো একটি সিরিয়াল প্রোটোকল ব্যবহার করে তথ্য দেবে, যখন এনালগ অ্যাকসিলরোমিটার একটি পূর্বনির্ধারিত সীমার মধ্যে একটি ভোল্টেজ লেভেল বের করবে যা আপনাকে ADC (এনালগ থেকে ডিজিটাল কনভার্টার) মডিউল ব্যবহার করে একটি ডিজিটাল ভ্যালুতে রূপান্তর করতে হবে। এডিসি কীভাবে কাজ করে সে সম্পর্কে আমি খুব বেশি বিশদে যাব না, আংশিক কারণ এটি একটি বিস্তৃত বিষয় এবং আংশিক কারণ এটি একটি প্ল্যাটফর্ম থেকে অন্য প্ল্যাটফর্মের জন্য আলাদা। কিছু মাইক্রোকন্ট্রোলারের একটি অন্তর্নির্মিত এডিসি মডিউল থাকবে তাদের মধ্যে কিছুকে এডিসি রূপান্তর করার জন্য বাহ্যিক উপাদানগুলির প্রয়োজন হবে। আপনি যে ধরণের এডিসি মডিউল ব্যবহার করেন তা কোন ব্যাপার না আপনি একটি নির্দিষ্ট পরিসরে একটি মান দিয়ে শেষ করবেন। উদাহরণস্বরূপ একটি 10 -বিট ADC মডিউল 0..1023 এর পরিসরে একটি মান আউটপুট করবে, মনে রাখবেন 1023 = 2^10 -1। একটি 12-বিট ADC মডিউল 0..4095 এর পরিসরে একটি মান আউটপুট করবে, মনে রাখবেন 4095 = 2^12-1।

আসুন একটি সহজ উদাহরণ বিবেচনা করে এগিয়ে যাই, ধরুন আমাদের 10 বিট এডিসি মডিউল আমাদের তিনটি অ্যাকসিলরোমিটার চ্যানেলের (অক্ষ) জন্য নিম্নলিখিত মান দিয়েছে:

AdcRx = 586 AdcRy = 630 AdcRz = 561

প্রতিটি এডিসি মডিউলে একটি রেফারেন্স ভোল্টেজ থাকবে, আসুন আমাদের উদাহরণে ধরে নিই এটি 3.3V। 10 বিট এডিসি মানকে ভোল্টেজে রূপান্তর করতে আমরা নিম্নলিখিত সূত্রটি ব্যবহার করি:

VoltsRx = AdcRx * Vref / 1023

এখানে একটি দ্রুত নোট: যে 8bit ADC এর জন্য শেষ বিভাজক হবে 255 = 2 ^ 8 -1, এবং 12bit ADC এর জন্য শেষ বিভাজক হবে 4095 = 2 ^ 12 -1।

এই সূত্রটি all টি চ্যানেলে প্রয়োগ করলে আমরা পাই:

VoltsRx = 586 * 3.3V / 1023 = ~ 1.89V (আমরা সব ফলাফলকে 2 দশমিক পয়েন্টে পরিণত করি) VoltsRy = 630 * 3.3V / 1023 = ~ 2.03V VoltsRz = 561 * 3.3V / 1023 = ~ 1.81V

প্রতিটি অ্যাকসিলরোমিটারের একটি শূন্য-জি ভোল্টেজ স্তর রয়েছে, আপনি এটি চশমাতে খুঁজে পেতে পারেন, এটি সেই ভোল্টেজ যা 0g এর সাথে মিলে যায়। একটি স্বাক্ষরিত ভোল্টেজ মান পেতে আমাদের এই স্তর থেকে স্থানান্তর গণনা করতে হবে। ধরা যাক আমাদের 0g ভোল্টেজ লেভেল হল VzeroG = 1.65V। আমরা নিম্নরূপ শূন্য-জি ভোল্টেজ থেকে ভোল্টেজ শিফট গণনা করি::

DeltaVoltsRx = 1.89V - 1.65V = 0.24V DeltaVoltsRy = 2.03V - 1.65V = 0.38V DeltaVoltsRz = 1.81V - 1.65V = 0.16V

আমাদের এখন ভোল্টে আমাদের অ্যাকসিলরোমিটার রিডিং আছে, এটি এখনও g (9.8 m/s^2) তে নেই, চূড়ান্ত রূপান্তর করার জন্য আমরা অ্যাকসিলরোমিটার সংবেদনশীলতা প্রয়োগ করি, সাধারণত mV/g তে প্রকাশ করা হয়। ধরা যাক আমাদের সংবেদনশীলতা = 478.5mV/g = 0.4785V/g। অ্যাকসিলরোমিটারের স্পেসিফিকেশনে সংবেদনশীলতার মান পাওয়া যাবে। চ -তে প্রকাশিত চূড়ান্ত বলের মান পেতে আমরা নিম্নলিখিত সূত্রটি ব্যবহার করি:

Rx = DeltaVoltsRx / সংবেদনশীলতা

Rx = 0.24V / 0.4785V / g = ~ 0.5g Ry = 0.38V / 0.4785V / g = ~ 0.79g Rz = 0.16V / 0.4785V / g = ~ 0.33g

আমরা অবশ্যই সবগুলো ধাপকে এক সূত্রে একত্রিত করতে পারতাম, কিন্তু আমি কিভাবে এডিসি রিডিং থেকে g তে প্রকাশ করা একটি ফোর্স ভেক্টর কম্পোনেন্টে যাব তা স্পষ্ট করার জন্য আমি সব ধাপ অতিক্রম করেছি।

Rx = (AdcRx * Vref / 1023 - VzeroG) / সংবেদনশীলতা (Eq.2) Ry = (AdcRy * Vref / 1023 - VzeroG) / সংবেদনশীলতা Rz = (AdcRz * Vref / 1023 - VzeroG) / সংবেদনশীলতা

আমাদের এখন 3 টি উপাদান রয়েছে যা আমাদের জড় শক্তি ভেক্টরকে সংজ্ঞায়িত করে, যদি ডিভাইসটি মহাকর্ষ ব্যতীত অন্য শক্তির অধীন না হয়, আমরা ধরে নিতে পারি এটি আমাদের মহাকর্ষ বল ভেক্টরের দিক। যদি আপনি মাটির তুলনায় ডিভাইসের প্রবণতা গণনা করতে চান তবে আপনি এই ভেক্টর এবং Z অক্ষের মধ্যে কোণ গণনা করতে পারেন। যদি আপনি প্রবণতার প্রতি অক্ষ দিকের দিকে আগ্রহী হন তবে আপনি এই ফলাফলটিকে 2 টি অংশে বিভক্ত করতে পারেন: X এবং Y অক্ষের দিকে ঝোঁক যা মহাকর্ষ ভেক্টর এবং X / Y অক্ষের মধ্যে কোণ হিসাবে গণনা করা যেতে পারে। এই কোণগুলি গণনা করা আপনার ভাবার চেয়েও সহজ, এখন আমরা Rx, Ry এবং Rz এর মান গণনা করেছি। আসুন আমাদের শেষ অ্যাকসিলরোমিটার মডেলে ফিরে যাই এবং কিছু অতিরিক্ত নোটেশন করি:

ছবি
ছবি

যে কোণগুলিতে আমরা আগ্রহী তা হল X, Y, Z অক্ষ এবং বল ভেক্টর R এর মধ্যে কোণ। আমরা এই কোণগুলিকে Axr, Ayr, Azr হিসাবে সংজ্ঞায়িত করব আপনি R এবং Rx দ্বারা গঠিত ডান-কোণ ত্রিভুজ থেকে লক্ষ্য করতে পারেন যে:

cos (Axr) = Rx / R, এবং একইভাবে: cos (Ayr) = Ry / R cos (Azr) = Rz / R

আমরা Eq.1 থেকে কেটে নিতে পারি যে R = SQRT (Rx^2 + Ry^2 + Rz^2)।

আমরা এখন arccos () ফাংশন (বিপরীত cos () ফাংশন) ব্যবহার করে আমাদের কোণগুলি খুঁজে পেতে পারি:

Axr = arccos (Rx/R) Ayr = arccos (Ry/R) Azr = arccos (Rz/R)

আমরা অ্যাক্সিলরোমিটার মডেলটি ব্যাখ্যা করার জন্য অনেক দূর এগিয়েছি, কেবল এই সূত্রগুলিতে আসার জন্য। আপনার অ্যাপ্লিকেশনের উপর নির্ভর করে আপনি যে কোনো মধ্যবর্তী সূত্র ব্যবহার করতে চাইতে পারেন যা আমরা পেয়েছি। আমরা শীঘ্রই জাইরোস্কোপ মডেলটিও চালু করব এবং আমরা দেখব কিভাবে অ্যাকসিলরোমিটার এবং জাইরোস্কোপ ডেটা একত্রিত করা যায় যাতে আরও সঠিক ঝোঁক অনুমান প্রদান করা যায়।

কিন্তু আমরা এটা করার আগে আসুন আরো কিছু দরকারী নোটেশন করি:

cosX = cos (Axr) = Rx / R cozy = cos (Ayr) = Ry / R cosZ = cos (Azr) = Rz / R

এই ট্রিপলেটটিকে প্রায়শই ডাইরেকশন কোসিন বলা হয় এবং এটি মূলত ইউনিট ভেক্টরকে (দৈর্ঘ্য 1 সহ ভেক্টর) প্রতিনিধিত্ব করে যা আমাদের R ভেক্টরের মতো দিক নির্দেশ করে। আপনি সহজেই যাচাই করতে পারেন যে:

SQRT (cosX^2 + cozy^2 + cosZ^2) = 1

এটি একটি চমৎকার সম্পত্তি যেহেতু এটি আমাদের R ভেক্টরের মডুলাস (দৈর্ঘ্য) পর্যবেক্ষণ থেকে মুক্ত করে। অনেক সময় যদি আমরা কেবল আমাদের জড় ভেক্টরের দিকনির্দেশে আগ্রহী হই, অন্য গণনাকে সহজ করার জন্য এটির মডুলাসকে স্বাভাবিক করা বোধগম্য।

ধাপ 2: জাইরোস্কোপ

জাইরোস্কোপ
জাইরোস্কোপ

আমরা অ্যাকসিলরোমিটারের মতো জাইরোস্কোপের জন্য কোনো সমতুল্য বক্স মডেল চালু করতে যাচ্ছি না, বরং আমরা সরাসরি দ্বিতীয় অ্যাক্সিলারোমিটার মডেলে চলে যাচ্ছি এবং এই মডেল অনুযায়ী জিরোস্কোপ কি পরিমাপ করে তা আমরা দেখাব।

ছবি
ছবি

প্রতিটি জাইরোস্কোপ চ্যানেল একটি অক্ষের চারপাশে ঘূর্ণন পরিমাপ করে। উদাহরণস্বরূপ একটি 2-অক্ষের জাইরোস্কোপ X এবং Y অক্ষের চারপাশে ঘূর্ণন পরিমাপ করবে (অথবা কেউ কেউ "প্রায়" বলতে পারে)। সংখ্যায় এই ঘূর্ণন প্রকাশ করতে আসুন কিছু নোটেশন করি। প্রথমে সংজ্ঞায়িত করা যাক:

Rxz - XZ সমতল Ryz- তে জড় শক্তি ভেক্টর R এর অভিক্ষেপ - YZ সমতলে জড় শক্তি ভেক্টর R এর অভিক্ষেপ

Rxz এবং Rz দ্বারা গঠিত ডান-কোণ ত্রিভুজ থেকে, পাইথাগোরীয় উপপাদ্য ব্যবহার করে আমরা পাই:

Rxz^2 = Rx^2 + Rz^2, এবং একইভাবে: Ryz^2 = Ry^2 + Rz^2

এছাড়াও মনে রাখবেন যে:

R^2 = Rxz^2 + Ry^2, এটি Eq.1 এবং উপরের সমীকরণ থেকে প্রাপ্ত হতে পারে, অথবা এটি R এবং Ryz দ্বারা গঠিত ডান-কোণ ত্রিভুজ থেকে উদ্ভূত হতে পারে R^2 = Ryz^2 + Rx^2

আমরা এই নিবন্ধে এই সূত্রগুলি ব্যবহার করতে যাচ্ছি না কিন্তু আমাদের মডেলের সমস্ত মানগুলির মধ্যে সম্পর্ক নোট করা দরকারী।

পরিবর্তে আমরা Z অক্ষ এবং Rxz, Ryz ভেক্টরগুলির মধ্যে কোণটি নিম্নরূপ সংজ্ঞায়িত করতে যাচ্ছি:

Axz - Rxz (XZ সমতলে R এর অভিক্ষেপ) এবং Z অক্ষ Ayz- এর মধ্যে কোণ হল Ryz (YZ সমতলে R এর অভিক্ষেপ) এবং Z অক্ষের মধ্যে কোণ

এখন আমরা জাইরোস্কোপ পরিমাপের কাছাকাছি আসছি। গাইরোস্কোপ উপরের সংজ্ঞায়িত কোণের পরিবর্তনের হার পরিমাপ করে। অন্য কথায় এটি একটি মান বের করবে যা এই কোণগুলির পরিবর্তনের হারের সাথে রৈখিকভাবে সম্পর্কিত। এটি ব্যাখ্যা করার জন্য ধরে নেওয়া যাক যে আমরা অক্ষ Y এর চারপাশে ঘূর্ণন কোণটি পরিমাপ করেছি (এটি Axz কোণ হবে) সময় t0, এবং আমরা এটিকে Axz0 হিসাবে সংজ্ঞায়িত করি, পরবর্তীতে আমরা এই কোণটি পরবর্তী সময়ে t1 এ পরিমাপ করি এবং এটি ছিল Axz1। পরিবর্তনের হার নিম্নরূপ গণনা করা হবে:

RateAxz = (Axz1 - Axz0) / (t1 - t0)।

যদি আমরা ডিগ্রীতে Axz এবং সেকেন্ডে সময় প্রকাশ করি, তাহলে এই মানটি deg/s তে প্রকাশ করা হবে। এটি একটি জাইরোস্কোপ পরিমাপ করে।

অনুশীলনে একটি জাইরোস্কোপ (যদি এটি একটি বিশেষ ডিজিটাল জাইরোস্কোপ না হয়) আপনাকে খুব কমই ডিগ্রী/সেকেন্ডে প্রকাশ করা মান দেবে। অ্যাকসিলরোমিটারের মতোই আপনি একটি ADC মান পাবেন যা আপনাকে Eq- এর অনুরূপ সূত্র ব্যবহার করে deg/s এ রূপান্তর করতে হবে। 2 যা আমরা অ্যাকসিলরোমিটারের জন্য সংজ্ঞায়িত করেছি। চলুন এডিসিকে ডিগ্রি/এস রূপান্তর সূত্রের সাথে জিরোস্কোপের পরিচয় করিয়ে দিই (আমরা ধরে নিচ্ছি আমরা 10 বিট এডিসি মডিউল ব্যবহার করছি, 8 বিট এডিসি 1023 কে 255 এর সাথে, 12 বিট এডিসি 1023 কে 4095 দিয়ে প্রতিস্থাপন করবে)।

RateAxz = (AdcGyroXZ * Vref / 1023 - VzeroRate) / সংবেদনশীলতা Eq.3 RateAyz = (AdcGyroYZ * Vref / 1023 - VzeroRate) / সংবেদনশীলতা

AdcGyroXZ, AdcGyroYZ - আমাদের এডিসি মডিউল থেকে প্রাপ্ত এবং তারা YZ প্লেনে যথাক্রমে XZ এ R ভেক্টরের অভিক্ষেপের পরিমাপ পরিমাপকারী চ্যানেলগুলিকে প্রতিনিধিত্ব করে, যা যথাক্রমে Y এবং X অক্ষের চারপাশে ঘূর্ণন বলার সমতুল্য।

Vref - ADC রেফারেন্স ভোল্টেজ যা আমরা VzeroRate নীচের উদাহরণে 3.3V ব্যবহার করব - শূন্য হার ভোল্টেজ, অন্য কথায় ভোল্টেজ যা গাইরোস্কোপ আউটপুট করে যখন এটি কোন ঘূর্ণন সাপেক্ষে নয়, Acc_Gyro বোর্ডের জন্য এটি উদাহরণস্বরূপ 1.23V (আপনি চশমাগুলিতে এই মানগুলি খুঁজে পেতে পারেন) সংবেদনশীলতা - আপনার জাইরোস্কোপের সংবেদনশীলতা এটি mV / (deg / s) তে প্রকাশ করা হয় যা প্রায়ই mV / deg / s হিসাবে লেখা হয়, এটি মূলত আপনাকে বলে যে কত mV হবে জিরোস্কোপ আউটপুট বৃদ্ধি, যদি আপনি ঘূর্ণন গতি এক ডিগ্রী/সেকেন্ড বৃদ্ধি করেন। Acc_Gyro বোর্ডের সংবেদনশীলতা উদাহরণস্বরূপ 2mV/deg/s বা 0.002V/deg/s

আসুন একটি উদাহরণ নেওয়া যাক, ধরুন আমাদের ADC মডিউল নিম্নলিখিত মানগুলি ফেরত দিয়েছে:

AdcGyroXZ = 571 AdcGyroXZ = 323

উপরের সূত্র ব্যবহার করে, এবং Acc_Gyro বোর্ডের চশমা পরামিতি ব্যবহার করে আমরা পাব:

RateAxz = (571 * 3.3V/1023 - 1.23V)/(0.002V/deg/s) = ~ 306 deg/s RateAyz = (323 * 3.3V/1023 - 1.23V)/(0.002V/deg/s) = 9 -94 ডিগ্রী/সেকেন্ড

অন্য কথায় ডিভাইসটি Y অক্ষের চারপাশে ঘুরছে (অথবা আমরা বলতে পারি এটি XZ সমতলে ঘুরছে) 306 ডিগ্রী/সেকেন্ডের গতিতে এবং X অক্ষের চারপাশে (অথবা আমরা বলতে পারি এটি YZ সমতলে ঘুরছে) এর গতি সহ - 94 ডিগ্রী/সেকেন্ড অনুগ্রহ করে মনে রাখবেন যে নেতিবাচক চিহ্ন মানে যে ডিভাইসটি প্রচলিত ইতিবাচক দিক থেকে বিপরীত দিকে ঘুরছে। কনভেনশন দ্বারা ঘূর্ণনের একটি দিক ইতিবাচক। একটি ভাল জাইরোস্কোপ স্পেসিফিকেশন শীট আপনাকে দেখাবে কোন দিকটি ইতিবাচক, অন্যথায় আপনাকে ডিভাইসটি নিয়ে পরীক্ষা -নিরীক্ষা করে এটি বের করতে হবে এবং ঘূর্ণনের কোন দিকটি লক্ষ্য করে আউটপুট পিনে ভোল্টেজ বাড়ায়। এটি একটি অসিলোস্কোপ ব্যবহার করে সবচেয়ে ভাল করা হয় যেহেতু আপনি ঘূর্ণন বন্ধ করার সাথে সাথে ভোল্টেজ শূন্য-হার স্তরে ফিরে আসবে। যদি আপনি একটি মাল্টিমিটার ব্যবহার করেন তবে আপনাকে কমপক্ষে কয়েক সেকেন্ডের জন্য একটি ধ্রুবক ঘূর্ণন হার বজায় রাখতে হবে এবং এই ঘূর্ণনের সময় ভোল্টেজটি লক্ষ্য করতে হবে, তারপর এটিকে শূন্য-হার ভোল্টেজের সাথে তুলনা করুন। যদি এটি শূন্য-হার ভোল্টেজের চেয়ে বড় হয় তবে এর অর্থ হল ঘূর্ণনের দিকটি ইতিবাচক।

ধাপ 3: অ্যাকসিলরোমিটার এবং গাইরোর সমন্বয়

অ্যাকসিলরোমিটার এবং গাইরোর সংমিশ্রণ
অ্যাকসিলরোমিটার এবং গাইরোর সংমিশ্রণ

সব একসাথে রাখা - অ্যাকসিলরোমিটার এবং জাইরোস্কোপ ডেটা একত্রিত করা।

আপনি যদি এই নিবন্ধটি পড়ছেন তবে সম্ভবত আপনি অর্জন করেছেন বা একটি আইএমইউ ডিভাইস অর্জন করার পরিকল্পনা করছেন, অথবা সম্ভবত আপনি পৃথক অ্যাকসিলরোমিটার এবং জাইরোস্কোপ ডিভাইস থেকে একটি তৈরি করার পরিকল্পনা করছেন।

একটি অ্যাকসিলরোমিটার এবং একটি জাইরোস্কোপ সমন্বিত আইএমইউ ডিভাইস ব্যবহার করার প্রথম ধাপ হল তাদের সমন্বয় সিস্টেমগুলিকে সারিবদ্ধ করা। এটি করার সবচেয়ে সহজ উপায় হল আপনার রেফারেন্স কোঅর্ডিনেট সিস্টেম হিসেবে অ্যাকসিলরোমিটারের সমন্বয় পদ্ধতি নির্বাচন করা। বেশিরভাগ অ্যাকসিলরোমিটার ডেটা শীটগুলি শারীরিক চিপ বা ডিভাইসের চিত্রের তুলনায় X, Y, Z অক্ষের দিক প্রদর্শন করবে। উদাহরণস্বরূপ এখানে Acc_Gyro বোর্ডের স্পেসিফিকেশনে দেখানো X, Y, Z অক্ষের দিকনির্দেশ রয়েছে:

acc_gyro অক্ষ
acc_gyro অক্ষ

পরবর্তী পদক্ষেপগুলি হল:

RateAxz, RateAyz মানগুলির উপরে বর্ণিত জাইরোস্কোপ আউটপুট সনাক্ত করুন। অ্যাকসিলরোমিটারের তুলনায় জাইরোস্কোপের শারীরিক অবস্থানের কারণে এই আউটপুটগুলি উল্টানো দরকার কিনা তা নির্ধারণ করুন

অনুমান করবেন না যে যদি একটি জাইরোস্কোপে X বা Y চিহ্নিত আউটপুট থাকে, এটি অ্যাকসিলরোমিটার কোঅর্ডিনেট সিস্টেমের যেকোন অক্ষের সাথে মিলবে, এমনকি যদি এই আউটপুটটি IMU ইউনিটের অংশ হয়। এটি পরীক্ষা করা সবচেয়ে ভাল উপায়। ধরে নিচ্ছেন আপনি অ্যাকসিলরোমিটারের তুলনায় জাইরোস্কোপের অবস্থান ঠিক করেছেন। এটা অনুমান করা হয় যে গাইরো এবং অ্যাকসিলরোমিটার সীমানা একে অপরের সমান্তরাল, যেমন আপনি অ্যাকসিলরোমিটার চিপের তুলনায় 90 ডিগ্রি কোণের একাধিক এ গাইরো স্থাপন করছেন। যদি আপনি একটি আইএমইউ বোর্ড অর্জন করেন তবে সম্ভাবনা হল যে তারা ইতিমধ্যেই এইভাবে একত্রিত হয়েছে। আমরা এই প্রবন্ধের মডেলগুলিতে আলোচনা করতে যাচ্ছি না যেখানে অ্যাকসিলরোমিটারের তুলনায় অনিয়মিত কোণে গাইরোস্কোপ স্থাপন করা হয়েছে (ধরা যাক 45 বা 30 ডিগ্রি), যদিও এটি কিছু অ্যাপ্লিকেশনের ক্ষেত্রে উপকারী হতে পারে।

জিরোস্কোপের কোন আউটপুট উপরে আলোচিত RateAxz ভ্যালুর সাথে মিলে যায় তা নির্ধারণ করার জন্য এখানে একটি নমুনা ক্রম দেওয়া হল।

- অনুভূমিক অবস্থানে ডিভাইস স্থাপন থেকে শুরু করুন। এক্সিলরোমিটারের X এবং Y উভয় আউটপুট শূন্য-জি ভোল্টেজ আউটপুট করবে (উদাহরণস্বরূপ Acc_Gyro বোর্ডের জন্য এটি 1.65V)

- পরবর্তীতে Y অক্ষের চারপাশে ডিভাইসটি ঘোরানো শুরু করুন, এটি বলার আরেকটি উপায় হল যে আপনি XZ সমতলে ডিভাইসটি ঘোরান, যাতে X এবং Z অ্যাকসিলরোমিটারের আউটপুট পরিবর্তিত হয় এবং Y আউটপুট স্থির থাকে। - একটি স্থির গতিতে ডিভাইস ঘোরানোর সময় যা জিরোস্কোপ আউটপুট পরিবর্তন করে, অন্যান্য জাইরোস্কোপ আউটপুটগুলি স্থির থাকা উচিত - Y অক্ষের চারপাশে ঘূর্ণনের সময় পরিবর্তিত জাইরোস্কোপ আউটপুট (XZ সমতলে ঘূর্ণন) AdcGyroXZ এর জন্য ইনপুট মান প্রদান করবে, যেখান থেকে আমরা RateAxz গণনা করি - চূড়ান্ত ধাপ হল ঘূর্ণনের দিকটি আমাদের মডেলের সাথে সামঞ্জস্যপূর্ণ, কিছু ক্ষেত্রে আপনাকে অ্যাকসিলরোমিটারের তুলনায় জাইরোস্কোপের শারীরিক অবস্থানের কারণে RateAxz মানটি উল্টাতে হতে পারে - উপরের পরীক্ষাটি আবার করুন, ডিভাইসটি চারদিকে ঘোরান Y অক্ষ, এই সময় এক্সিলরোমিটারের X আউটপুট (আমাদের মডেলের AdcRx) নিরীক্ষণ করুন। যদি AdcRx বৃদ্ধি পায় (অনুভূমিক অবস্থান থেকে ঘূর্ণনের প্রথম 90 ডিগ্রী), তাহলে AdcGyroXZ এরও বৃদ্ধি হওয়া উচিত। অন্যথায় আপনাকে RateAxz উল্টাতে হবে, আপনি Eq.3 এ একটি সাইন ফ্যাক্টর চালু করে এটি অর্জন করতে পারেন, নিম্নরূপ:

RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 - VzeroRate) / সংবেদনশীলতা, যেখানে InvertAxz হল 1 বা -1

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

RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 - VzeroRate) / সংবেদনশীলতা

আপনি যদি Acc_Gyro বোর্ডে এই পরীক্ষাগুলো করেন তাহলে আপনি নিম্নলিখিত ফলাফল পাবেন:

- RateAxz এর আউটপুট পিন হল GX4 এবং InvertAxz = -1। - RateAyz এর আউটপুট পিন হল GY4 এবং InvertAyz = -1

এই বিন্দু থেকে আমরা বিবেচনা করব যে আপনি আপনার আইএমইউকে এমনভাবে সেটআপ করেছেন যাতে আপনি Axr, Ayr, Azr (সংজ্ঞায়িত পার্ট 1 অ্যাকসিলরোমিটার) এবং RateAxz, RateAyz (পার্ট 2 এ সংজ্ঞায়িত হিসাবে সঠিক মান গণনা করতে পারেন।)। পরবর্তীতে আমরা এই মানগুলির মধ্যে সম্পর্কগুলি বিশ্লেষণ করব যা স্থল সমতলের তুলনায় ডিভাইসের প্রবণতার আরও সঠিক অনুমান পেতে দরকারী হয়ে ওঠে।

আপনি এই মুহুর্তে নিজেকে জিজ্ঞাসা করতে পারেন, যদি অ্যাকসিলরোমিটার মডেল ইতিমধ্যেই আমাদের Axr, Ayr, Azr এর প্রবণতা কোণগুলি দেয় তবে কেন আমরা জাইরোস্কোপ ডেটা নিয়ে বিরক্ত হতে চাই? উত্তরটি সহজ: অ্যাকসিলরোমিটার ডেটা সবসময় 100%বিশ্বাস করা যায় না। বেশ কয়েকটি কারণ আছে, মনে রাখবেন যে অ্যাকসিলরোমিটার জড় শক্তিকে পরিমাপ করে, এই ধরনের শক্তি মহাকর্ষ (এবং আদর্শভাবে শুধুমাত্র মহাকর্ষ দ্বারা) হতে পারে, কিন্তু এটি ডিভাইসের ত্বরণ (আন্দোলন) দ্বারাও হতে পারে। ফলস্বরূপ, অ্যাকসিলরোমিটার তুলনামূলকভাবে স্থিতিশীল অবস্থায় থাকলেও, এটি এখনও কম্পন এবং সাধারণভাবে যান্ত্রিক আওয়াজের প্রতি অত্যন্ত সংবেদনশীল। বেশিরভাগ আইএমইউ সিস্টেম একটি অ্যাকসিলরোমিটার ত্রুটিকে মসৃণ করার জন্য একটি জাইরোস্কোপ ব্যবহার করার প্রধান কারণ। কিন্তু কিভাবে এটি করা হয়? এবং জাইরোস্কোপ কি শব্দ থেকে মুক্ত?

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

পরবর্তী ধাপে আমি একটি অ্যালগরিদম চালু করব যা কলম্যান ফিল্টারে ব্যবহৃত কিছু ধারণা দ্বারা অনুপ্রাণিত হয়েছিল, তবে এটি এমবেডেড ডিভাইসে প্রয়োগ করা অনেক সহজ এবং সহজ। তার আগে আসুন প্রথমে দেখি আমরা আমাদের অ্যালগরিদম গণনা করতে চাই। আচ্ছা, এটি মহাকর্ষ বল ভেক্টরের দিক = Rx স্থল সমতলের আপেক্ষিকভাবে, আমরা এই মানগুলির মধ্যে পার্ট 1 এ সম্পর্ক নিয়ে আলোচনা করি। কেউ বলতে পারে - আমাদের কি ইতিমধ্যেই এই মানগুলি Rx, Ry, Rz Eq.2 থেকে অংশ 1 এ নেই? আচ্ছা হ্যাঁ, কিন্তু মনে রাখবেন যে এই মানগুলি শুধুমাত্র অ্যাকসিলরোমিটার ডেটা থেকে উদ্ভূত হয়েছে, তাই যদি আপনি সেগুলি সরাসরি আপনার অ্যাপ্লিকেশনে ব্যবহার করতে চান তবে আপনার অ্যাপ্লিকেশন সহ্য করার চেয়ে বেশি শব্দ পেতে পারে। আরও বিভ্রান্তি এড়াতে আসুন অ্যাক্সিলরোমিটার পরিমাপকে পুনরায় সংজ্ঞায়িত করি:

র্যাক - অ্যাকসিলরোমিটার দ্বারা পরিমাপ করা নিষ্ক্রিয় বলের ভেক্টর, যা নিম্নলিখিত উপাদানগুলি (X, Y, Z অক্ষের উপর অনুমান) নিয়ে গঠিত:

RxAcc = (AdcRx * Vref / 1023 - VzeroG) / সংবেদনশীলতা RyAcc = (AdcRy * Vref / 1023 - VzeroG) / সংবেদনশীলতা RzAcc = (AdcRz * Vref / 1023 - VzeroG) / সংবেদনশীলতা

এখন পর্যন্ত আমাদের কাছে পরিমাপ করা মানগুলির একটি সেট আছে যা আমরা অ্যাকসিলরোমিটার এডিসি মান থেকে বিশুদ্ধভাবে পেতে পারি। আমরা এই ডেটার সেটকে "ভেক্টর" বলব এবং আমরা নিম্নলিখিত নোটেশন ব্যবহার করব।

Racc = [RxAcc, RyAcc, RzAcc]

যেহেতু র্যাকের এই উপাদানগুলি অ্যাকসিলরোমিটার ডেটা থেকে পাওয়া যেতে পারে, আমরা এটিকে আমাদের অ্যালগরিদমের ইনপুট হিসাবে বিবেচনা করতে পারি।

অনুগ্রহ করে মনে রাখবেন যে, র্যাক মহাকর্ষ বলকে পরিমাপ করে, আপনি যদি সঠিকভাবে অনুমান করেন যে এই ভেক্টরের দৈর্ঘ্য 1g এর সমান বা কাছাকাছি।

| র্যাক | = SQRT (RxAcc^2 + RyAcc^2 + RzAcc^2), তবে নিশ্চিত হওয়ার জন্য এই ভেক্টরটি নিম্নরূপ আপডেট করা বোধগম্য:

Racc (স্বাভাবিকীকৃত) = [RxAcc/| Racc |, RyAcc/| Racc |, RzAcc/| Racc |]।

এটি আপনার স্বাভাবিক র্যাক ভেক্টরের দৈর্ঘ্য সর্বদা 1 নিশ্চিত করবে।

পরবর্তী আমরা একটি নতুন ভেক্টর চালু করব এবং আমরা এটি কল করব

বিশ্রাম = [RxEst, RyEst, RzEst]

এটি আমাদের অ্যালগরিদমের আউটপুট হবে, এগুলি জিরোস্কোপ ডেটার উপর ভিত্তি করে এবং অতীতের আনুমানিক তথ্যের ভিত্তিতে সংশোধিত মান।

আমাদের অ্যালগরিদম যা করবে তা হল: - অ্যাকসিলরোমিটার আমাদের বলে: "আপনি এখন র‍্যাক পজিশনে আছেন" - আমরা বলি "ধন্যবাদ, কিন্তু আমাকে যাচাই করতে দিন", - তারপর জাইরোস্কোপ ডেটা এবং অতীতের বিশ্রামের ডেটা দিয়ে এই তথ্যটি সংশোধন করুন এবং আমরা একটি নতুন আনুমানিক ভেক্টর রেস্ট আউটপুট করি। - আমরা ডিভাইসের বর্তমান অবস্থান হিসাবে বিশ্রামকে আমাদের "সেরা বাজি" বলে মনে করি।

আসুন দেখি কিভাবে আমরা এটি কাজ করতে পারি।

আমরা আমাদের অ্যাকসিলরোমিটারে বিশ্বাস করে এবং বরাদ্দ করে আমাদের ক্রম শুরু করব:

বিশ্রাম (0) = র্যাক (0)

যাইহোক মনে রাখবেন রেস্ট এবং র্যাক ভেক্টর, তাই উপরের সমীকরণটি 3 টি সমীকরণ লেখার এবং পুনরাবৃত্তি এড়ানোর একটি সহজ উপায়:

RxEst (0) = RxAcc (0) RyEst (0) = RyAcc (0) RzEst (0) = RzAcc (0)

পরবর্তীতে আমরা টি সেকেন্ডের সমান সময় ব্যবধানে নিয়মিত পরিমাপ করব, এবং আমরা নতুন পরিমাপগুলি পাব যা আমরা Racc (1), Racc (2), Racc (3) ইত্যাদি হিসাবে সংজ্ঞায়িত করব। আমরা প্রতিটি সময় অন্তর বিশ্রাম (1), বিশ্রাম (2), বিশ্রাম (3) এবং আরও নতুন অনুমান জারি করব।

ধরুন আমরা ধাপ n এ আছি। আমাদের কাছে দুটি পরিচিত মান আছে যা আমরা ব্যবহার করতে চাই:

বিশ্রাম (n -1) - আমাদের পূর্ববর্তী অনুমান, বিশ্রামের সাথে (0) = Racc (0) Racc (n) - আমাদের বর্তমান অ্যাকসিলরোমিটার পরিমাপ

আমরা বিশ্রাম (n) গণনা করার আগে, আসুন একটি নতুন পরিমাপিত মান চালু করি, যা আমরা আমাদের জাইরোস্কোপ এবং পূর্ববর্তী অনুমান থেকে পেতে পারি।

আমরা এটিকে Rgyro বলব, এবং এটি একটি ভেক্টর যা 3 টি উপাদান নিয়ে গঠিত:

Rgyro = [RxGyro, RyGyro, RzGyro]

আমরা একটি সময়ে এই ভেক্টর একটি উপাদান গণনা করব। আমরা RxGyro দিয়ে শুরু করব।

গাইরো মডেল
গাইরো মডেল

Rz এবং Rxz দ্বারা গঠিত ডান-কোণ ত্রিভুজ থেকে আমাদের জাইরোস্কোপ মডেলে নিম্নলিখিত সম্পর্কটি পর্যবেক্ষণ করে শুরু করা যাক:

tan (Axz) = Rx/Rz => Axz = atan2 (Rx, Rz)

Atan2 এমন একটি ফাংশন হতে পারে যা আপনি আগে কখনো ব্যবহার করেননি, এটি atan এর অনুরূপ, এটি (-PI/2, PI/2) এর বিপরীতে (-PI/2, PI/2) এর বিপরীতে মান ফেরত দেয়, এবং এটি লাগে একটির পরিবর্তে 2 টি যুক্তি। এটি আমাদের Rx, Rz এর দুটি মানকে 360 ডিগ্রি (-PI থেকে PI) এর পূর্ণ পরিসরে কোণে রূপান্তর করতে দেয়। আপনি এখানে atan2 সম্পর্কে আরও পড়তে পারেন।

সুতরাং RxEst (n-1), এবং RzEst (n-1) জেনে আমরা খুঁজে পেতে পারি:

Axz (n-1) = atan2 (RxEst (n-1), RzEst (n-1))।

মনে রাখবেন যে জাইরোস্কোপ Axz কোণের পরিবর্তনের হার পরিমাপ করে। সুতরাং আমরা নিম্নরূপ নতুন কোণ Axz (n) অনুমান করতে পারি:

Axz (n) = Axz (n-1) + RateAxz (n) * T

মনে রাখবেন RateAxz আমাদের জাইরোস্কোপ ADC রিডিং থেকে পাওয়া যেতে পারে। একটি আরো সুনির্দিষ্ট সূত্র নিম্নরূপ গণনা একটি গড় ঘূর্ণন হার ব্যবহার করতে পারেন:

RateAxzAvg = (RateAxz (n) + RateAxz (n-1)) / 2 Axz (n) = Axz (n-1) + RateAxzAvg * T

একইভাবে আমরা খুঁজে পেতে পারি:

Ayz (n) = Ayz (n-1) + RateAyz (n) * T

ঠিক আছে তাই এখন আমাদের Axz (n) এবং Ayz (n) আছে। RxGyro/RyGyro কাটাতে আমরা এখান থেকে কোথায় যাব? Eq থেকে। 1 আমরা ভেক্টর Rgyro এর দৈর্ঘ্য নিম্নরূপ লিখতে পারি:

| Rgyro | = SQRT (RxGyro^2 + RyGyro^2 + RzGyro^2)

এছাড়াও যেহেতু আমরা আমাদের র্যাক ভেক্টরকে স্বাভাবিক করেছি, আমরা ধরে নিতে পারি যে এর দৈর্ঘ্য 1 এবং এটি ঘূর্ণনের পরে পরিবর্তিত হয়নি, তাই এটি লিখতে তুলনামূলকভাবে নিরাপদ:

| Rgyro | = 1

আসুন নীচের গণনার জন্য একটি অস্থায়ী সংক্ষিপ্ত স্বরলিপি গ্রহণ করি:

x = RxGyro, y = RyGyro, z = RzGyro

উপরের সম্পর্কগুলি ব্যবহার করে আমরা লিখতে পারি:

x = x / 1 = x / SQRT (x^2+y^2+z^2)

আসুন SQRT (x^2 + z^2) দ্বারা ভগ্নাংশের অংক এবং হর ভাগ করি

x = (x / SQRT (x^2 + z^2)) / SQRT ((x^2 + y^2 + z^2) / (x^2 + z^2))

উল্লেখ্য যে x / SQRT (x^2 + z^2) = sin (Axz), তাই:

x = sin (Axz) / SQRT (1 + y^2 / (x^2 + z^2))

এখন SQRT- এর ভিতরে ভগ্নাংশের অংক এবং হরকে z^2 দিয়ে গুণ করুন

x = sin (Axz) / SQRT (1 + y^2 * z^2 / (z^2 * (x^2 + z^2)))

লক্ষ্য করুন যে z / SQRT (x^2 + z^2) = cos (Axz) এবং y / z = tan (Ayz), তাই শেষ পর্যন্ত:

x = sin (Axz) / SQRT (1 + cos (Axz)^2 * tan (Ayz)^2)

আমাদের স্বরলিপিতে ফিরে যাচ্ছি আমরা:

RxGyro = sin (Axz (n)) / SQRT (1 + cos (Axz (n))^2 * tan (Ayz (n))^2)

একই ভাবে আমরা সেটা খুঁজে পাই

RyGyro = sin (Ayz (n)) / SQRT (1 + cos (Ayz (n))^2 * tan (Axz (n))^2)

এখন, অবশেষে আমরা খুঁজে পেতে পারি:

RzGyro = চিহ্ন (RzGyro)*SQRT (1 - RxGyro^2 - RyGyro^2)।

যেখানে সাইন (RzGyro) = 1 যখন RzGyro> = 0, এবং Sign (RzGyro) = -1 যখন RzGyro <0।

এটি অনুমান করার একটি সহজ উপায় হল:

চিহ্ন (RzGyro) = চিহ্ন (RzEst (n-1))

অনুশীলনে সতর্ক থাকুন যখন RzEst (n-1) 0 এর কাছাকাছি হয়। আপনি এই ক্ষেত্রে গাইরো ফেজ সম্পূর্ণভাবে এড়িয়ে যেতে পারেন: Rgyro = Rest (n-1)। Rz Axz এবং Ayz কোণ গণনার জন্য একটি রেফারেন্স হিসাবে ব্যবহৃত হয় এবং যখন এটি 0 এর কাছাকাছি থাকে, তখন মানগুলি অতিরিক্ত প্রবাহিত হতে পারে এবং খারাপ ফলাফল ট্রিগার করতে পারে। আপনি বড় ভাসমান বিন্দু সংখ্যায় থাকবেন যেখানে tan () / atan () ফাংশন বাস্তবায়নে নির্ভুলতার অভাব থাকতে পারে।

সুতরাং আসুন আমরা এখন পর্যন্ত যা আছে তা সংক্ষিপ্ত করি, আমরা আমাদের অ্যালগরিদমের ধাপ n এ আছি এবং আমরা নিম্নলিখিত মানগুলি গণনা করেছি:

Racc - আমাদের অ্যাকসিলরোমিটার Rgyro থেকে বর্তমান রিডিং - বিশ্রাম (n -1) এবং বর্তমান জাইরোস্কোপ রিডিং থেকে প্রাপ্ত

আপডেট করা অনুমান বিশ্রাম (n) গণনা করতে আমরা কোন মানগুলি ব্যবহার করি? আপনি সম্ভবত অনুমান করেছিলেন যে আমরা উভয়ই ব্যবহার করব। আমরা একটি ওজনযুক্ত গড় ব্যবহার করব, যাতে:

বিশ্রাম (n) = (Racc * w1 + Rgyro * w2) / (w1 + w2)

আমরা ভগ্নাংশের সংখ্যা এবং হরকে w1 দ্বারা ভাগ করে এই সূত্রটি সহজ করতে পারি।

বিশ্রাম (n) = (Racc * w1/w1 + Rgyro * w2/w1)/(w1/w1 + w2/w1)

এবং w2/w1 = wGyro প্রতিস্থাপন করার পর আমরা পাই:

বিশ্রাম (n) = (Racc + Rgyro * wGyro) / (1 + wGyro)

উপরের ফোরামুলায় wGyro আমাদের অ্যাকসিলরোমিটারের তুলনায় আমাদের গাইরোকে কতটা বিশ্বাস করে তা বলে। এই মানটি পরীক্ষামূলকভাবে বেছে নেওয়া যেতে পারে সাধারণত 5..20 এর মধ্যে মান ভাল ফলাফল ট্রিগার করবে।

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

আমরা আমাদের আপডেট করা আনুমানিক মানগুলি থেকে এক ধাপ দূরে:

RxEst (n) = (RxAcc + RxGyro * wGyro) / (1 + wGyro) RyEst (n) = (RyAcc + RyGyro * wGyro) / (1 + wGyro) RzEst (n) = (RzAcc + RzGyro * wGyro) / (1 + wGyro)

এখন আবার এই ভেক্টরকে স্বাভাবিক করা যাক:

R = SQRT (RxEst (n)^2 + RyEst (n)^2 + RzEst (n)^2)

RxEst (n) = RxEst (n)/R RyEst (n) = RyEst (n)/R RzEst (n) = RzEst (n)/R

এবং আমরা আবার আমাদের লুপ পুনরাবৃত্তি করতে প্রস্তুত।

এই গাইডটি মূলত starlino.com এ প্রকাশিত হয়েছিল, আমি কয়েকটি হালকা সম্পাদনা করেছি এবং অনুমতি নিয়ে এটি পুনরায় পোস্ট করেছি। ধন্যবাদ স্টারলিনো!

প্রস্তাবিত: