Pages

Sunday, January 06, 2008

აუტოპილოტი, დასაწყისი

ვინც იცით, თავისუფალი დროის ნაწილს (მხოლოდ ნაწილს!) რაში ვხარჯავ, გეცოდინებათ, რომ რაღაც "ავტოპილოტის მაგვარი პროგრამის წერით ვარ დაკავებული”, რომელსაც წინა ზაფხულიდან მოყოლებული ნელნელა ვწერ. საიდან ასეთი იდეები? ადვილი მისახვედრია, თუ ჩემი ინტერესის სფეროებს ”შეაჯვარებთ”: ავიაცია, რობოტები და პროგრამირება - რომელიც ასევე ჩემი პროფესიაცაა. უპილოტო საფრენი აპარატი კი ზუსტად მფრინავ რობოტს წარმოადგენს...

ამიტომაც გადავწყვიტე, დამეწერა პროგრამა, რომელიც რომელიმე ავიასიმულატორში (რომელშიც ჩვეულებრივ მე ვმართავ თვითმფრინავს ჯოისტიკებით და პედლებით) ჩემს მაგივრად გამართავდა თვიმთმფრინავს. ამის ერთერთი მიზეზი ისიც იყო, რომ მინდოდა, მენახა დაახლოებით რა სირთულის ამოცანაა საფრენი აპარატის ავტომატური მართვა. თავად პლანერის შექმნა ( 1-2 მეტრიანი) დაახლოებით რა სირთულის ამოცანაა, ცოტა წარმოდგენა მაქვს, მაგრამ Flight Control-ზე და Autopilot-ზე არავითარი წარმოდგენა არ მქონდა. წინასწარ გეტყვით - ძაალიან ძნელია :) მითუმეტეს ჩემი პროგრამისტული გამოცდილება მხოლოდ ”ადამიანური” სისტემების შექმნით შემოიფარგლება.
პროგრამირების ენად ჯერჯერობით java ავირჩიე, რომელზეც პრაქტიკულად წარმოუდგენელია real-time სისტემების შექმნა. მიუხედავად ამისა, ამ გადაწყვეტილების მიღების მიზეზები შემდეგია:
1)ბოლო რამოდენიმე წელია ამ ენაზე ვმუშაობ,სხვა ენებთან შეხება არ მქონია, C++ აღარც კი მახსოვს :)
2)სისტემა არის საცდელი.მისი მიზანია, ვნახო, რა პრობლემებია,როგორ შეიძლება მათი გადაჭრა და არა რეალური ავტოპილოტის შექმნა.
3)java არის ყველაზე კარგი ენა, მე ის მიყვარს, ვგიჟდები და რელიგიურ ომში ნუ შემყვებით ამის თაობაზე.:)
რაც შეეხება იმას, რომ java არ არის real-time სისტემების საწერი ენა, ეს პირველ რიგში განპირობებულია იმით, რომ რაღაც მომენტებში შეიძლება Garbage Collector დაიქოქოს, დაიწყოს ნაგვის გასუფთავება და წამართვას პროცესორი(არის კიდევ სხვა მიზეზებიც). ეს პროცესი სულ რაღაც რამოდენიმე მილიწამს იკავებს, ყოველგვარი JVM-ის ტიუნინგის გარეშე. სიმულატორში ნაფრენ უამრავ საათებს რომ თავი დავანებოთ ;) ცოტა რეალური თვითმფრინავზეც მიფრენია (”მიმართავს”), იაკ-52 მაგალითად. იქ იყო მომენტები, როცა ერთი და ორი წამიც კი დამიკარგავს ფიქრში, მაშინ როდესაც მყისიერად უნდა მომეხდინა რეაგირება. ამიტომ გადავწყვიტე, საცდელი სისტემის მიერ შესაძლო რამდენიმე მილიწამიანი დაგვიანებისთვის ყურადღება არ მიმექცია :) ამასთანავე სრული პასუხისმგებლობით ვაცხადებ: კარგად ვაცნობიერებ,რომ რეალური მართვის სისტემებში ასეთი ”დაშვებები” - დაუშვებელია :)

ავიასიმულატორად ამ ”პროექტისთვის” ავირჩიე XPlane ,მაგრამ ვცდილობ, კოდი ისე დავწერო, რომ კონფიგურაციის მეშვეოით ვმართო, რომელ ავიასიმულატორს , თუ საერთოდ ნამდვილ სენსორებს და სერვო მოტორებს მიუერთდეს. მიზეზები რატომაც ავირჩიე ეს ავიასიმულატორი:
1) ჩემთვის ცნობილ ყველა სხვა (ჩვეულებივი მოკვდავისთვის ხელმისაწვდომ) სიმულატორში გამოიყენება ცხრილები, სადაც შეტანილია მონაცემები თუ როგორ იქცევა რეალური თვითმფრინავი სხვდასხვა რეჟიმზე და სიტუაციებში. ასეთი მონაცემების შეგროვება კი მხოლოდ რეალური მოდელის შექმნის და გამოცდის შედეგად არის შესაძლებელი, ან მკითხაობით. ამ სიმულატორში კი შეგიძლიათ, თქვენ თვითონ შექმნათ ნებისმიერი ფორმის სხეული, მიუთითოთ ფრთების და მმართველი ზედაპირების რაოდენობები, გეომეტრიული ზომები, დაყენების პარამეტრები და ის თავად გამოთვლის,თუ როგორ მოიქცევა ასეთი ფორმის პლანერი ჰაერში.
2) MS Flight Simulator-ის API-ში (გარდა იმ ცხრილების პრობლემისა) ვერ ვნახე იმ რაოდენობის და ისეთი პარამეტრების გამოსატანი ფუნქციები როგორიც ამ სიმულატორს აქვს. აქ პრაქტიკულად ნებისმიერი ცვლადი შეგიძლია ძალიან მარტივად - UDP პაკეტების მეშვეობით ქსელიდან მიიღო სიმულატორისგან და ასევე უკან სიმულატორში გააგზავნო. შეიძლება ვცდები, მაგრამ რატომღაც აქ უფრო მარტივად მომეჩვენა ყველაფერი. თან API პროგრამირების ენაში მზღუდავდა. მოკლედ ჩემი აზრით, გარე სამყაროსთან და ქსელში სხვა ან იგივე სისტემებთან ურთიერთქმედება ამ სიმულატორში უფრო კარგად არის რეალიზებული.
3) ეს სიმულატორი მუშაობს ვინდოუსზე, მაკზე და ბოლო 2 ვერსია უკვე ლინუქსზეც.
4) საკმაოდ ”მსუბუქი” სიმულატორია სხვებთან შედარებით.

არის კიდევ ერთი საკმაოდ კარგი სიმულატორი - Flight Gear რომელიც ასევე ყველა პლატფორმაზე მუშაობს და რაც მთავარია, ღია კოდია და უფასოა. მაგრამ ეს ჯერ არ გამირჩევია, თუმცა კოდს ისე ვწერ, რომ მომავალში მინიმალური ცვლილებებით შემეძლება მასთანაც ურთიერთქმედება.

ახლა კი ძირითადი - ცოტა რამ თავად პროგრამის შესახებ. მთელი სისტემა წარმოადგენს რამოდენიმე დამოუკიდებლად მომუშავე (ცალკე thread-ში) მოდულებს, რომლებიც ყველა თავის საქმეს აკეთებენ. ყველაზე მთავარი არის ის, რომ მაქვს ვირტუალური სენსორები და სერვოები. თავად კონტროლის სისტემის სხვადასხვა ნაწილები - რომელებიც საკუთარ thread-ებში სრულდებიან - კითხულობენ ამ ვირტუალური სენსორებიდან მონაცემებს, იღებენ გადაწყვეტილებებს და მართავენ ვირტუალურ სერვოებს. ვირტუალურ სენსორებში მონაცემები შეიძლება მოდიოდეს ან სიმულატორიდან, ან რელური სენსორიდან - მოწყობილობიდან. ასევე ვირტუალური სერვოებს მართვა შეიძლება გადაიცემოდეს სიმულატორში როგორც ჯოისტიკის სიგნალები, ან რეალურ სერვო მატორებს. აქედან გამომდინარე ფრენის კონტროლის სისტემა ვერ ხედავს, რეალურ თვითმფრინავს მართავს თუ მოდელს სიმულატორის შიგნით - ის უბრალოდ სენსორებით ”ხედავს” სამყაროს და სერვოებით ზემოქმედებს მასზე. თავად სიმულატორიც საკმაოდ კარგად ახდენს რეალური ფრენის სიმულაციას. ის თუ ვირტუალურ სენსორებში მონაცემები საიდან მოდის და ვირტუალური სერვოებიდან სიგნალები სად მიდის - სიმულატორში თუ რეალურ მოწყობილობებში - ეს კონფიგურაციის ამბავია.

თუ ცოტა უცნაურად ან არარეალურად გეჩვენებათ, მინდა დაგაწყნაროთ ჩემო ტკბილო და მურაბა ხალხო, რადგან როგორც აღმოვაჩინე პირველი არ ვარ :) ვიპოვე უცხოელი სტუდენტები, რომლებსაც მსგავსი რაღაც ჰქონდათ გაკეთებული დიპლომისთვის.მათ თუ შეძლეს, მეც შევძლებ ;) და შევძელი კიდვაც.
აი ამ ვიდეოზე არის ერთერთი პირველი, მეტ-ნაკლებად ნორმალური აფრენა და ვირაჟი რომელიც წინა ზაფხულშივე შევძელი :) სანამ ამას მივაღწევდი მთელი თვე ძალიან უცნაურ შედეგებს ავიაკატასტროფებს ვიღებდი.ვიდეოზე კაბინა ცოტა უცნაურად ჩანს, მაგრამ ჩემ ნოუთბუკს განიერი ეკრანი აქვს და მაგის გამოა ასე. როცა ეს ვიდეო ჩავწერე მაშინ მართვა ხდებოდა პედლების გარეშე, ამიტომ აფრენისას გვერდზე ითრევს თვითმფრინავს, როგორც რეალურ თვთმფრინავს. თან ყველა პროცესის მართვა ხდებოდა მხოლოდ პროპორციული მართვის წესებით, რადგან მაშინ მართვის თეორიის გაგებაშიც არ ვიყავი და არ ვიცოდი, რომ PID კონტროლერის და მართვის თეორიის გარჩევა მომიწევდა. ამიტომაც ამ სურათზე ჩანს კრენში გადასვლისას როგორი ”ოსცილეიშენ” მაქვს.
კიდევ ერთი არასწორი რამ: აფრენისას და სიმაღლის მატებისას ვერტიკალური სიჩქარის და შეტევის კუთხის კონტროლის მაგივრად, ტანგაჟს ვაკონტროლებ, რაც არასწორია.
ასევე ვიდეოზე ჩანს ერთი მომენტი სადაც თვითმფრინავი აცანცარდება. ეგ ჩემი კომპიუტერის ბრალია: ერთ კომპიუტერზე თვითონ სიმულატორი, IDE, VirtualDub რომელიც მთელი ეკრანისგან ვიდეოს აკეთებს დისკზე, და თავად პროგრამა მაქვს დასტარტული, რომელიც რამოდენიმე Thread-ს შეიცავს და JFreeChart-ის მეშვეობით დიაგრამას ხატავს. ამ ყველაფრის გამო ”შენლდა” კომპი და ვეღარ მოიცალა მართვისთვის - ყველა Thread ნორმალური პრიორიტეტით მაქვს ჯერჯერობით.
შემოდგომისთვის იმდენი ”ვატიუნინგე” პროპორციული მართვის ალგორითმი რომ კრენში მართვისას სკმაოდ კაი რეზულტატები მივიღე, მაგრამ მხოლოდ კრენის გარკვეული მნიშვნელობისთვის. შედეგები არის ამ ალბომში, სურათები 6) და 7).

ამის შემდეგ ლინუქსის კერნელის ხასიათზე მოვედი, შემდეგ დაემატა ბოლივიის მივლინება და ცოტა დავივიწყე ავტოპილოტი.
ბოლო დროს ისევ მივუბრუნდი და ცოტა წინაც წავიწიე, რის შესახებაც მოგვიანებით დავწერ.