Tuesday, May 04, 2010

JavaHL-ის პრობლემა Eclipse-ში

უბუნტუზე ეკლიპსში tigris-ის subclipse პლაგინის დაყენების შემდეგ, ან ეკლიპსის პლაგინების აპდეიტის შემდეგ, ხშირად თავს იჩენს პობლემა რომლიც მარცხენა სურათზეა ნაჩვენები და ტექსტი კი ქვემოთ:





Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /usr/lib/jvm/java-6-sun-1.6.0.15/jre/lib/i386/client:/usr/lib/jvm/java-6-sun-1.6.0.15/jre/lib/i386:/usr/lib/xulrunner-addons:/usr/lib/xulrunner-addons:/usr/java/packages/lib/i386:/lib:/usr/lib

საქმე იმაშია რომ ამ პლაგინს SVN-თან სამუშაოდ შეუძლია გამოიყენოს ორი ბიბლიოთეკიდან ერთ-ერთი:
1) JavaHL - JNI ბაინდინგი ნეიტივ ბიბლიოტეკაზე.
2) SVNkit - მთლიანად ჯავაზე რეალიზებული ბიბლიოტეკა.
ზემოთ აღწერილი შეცდომა ხდება მაშინ როდესაც პლაგინი ცდილობს გამოიყენოს JavaHL და ვერ პოულობს მის ნეიტივ ბიბლიოტეკას (*.so ფაილებს)

ამ პრობლემის გადაწყვეტის ყველაზე მარტივი ვარიანტი არის ეკლიპსის ოპციებში SVNkit-ზე გადართვა. ამისთვის ეკლიპსში შევდივართ Window->Preferences მენუში და ვირჩევთ Team->SVN განყოფილებას, ისე როგორც ეს მარჯვენა სურათზეა ნაჩვენები. აქ კი SVN Interface: Client-ს ჩამოვკეცავთ და გადავრთავთ SVNkit-ზე, რის შემდეგაც პრობლემა გვარდება.

თუ მაინცდამაინც JavaHL-ით გვინდა SVN-თან კავშირი მაშინ ცოტა მეტი ლინუქსოიდობა მოგვიწევს.
პირველ რიგში უბუნტუზე უნდა დავაყენოთ JNI ბაინდინგების ბიბლიოთეკა:
sudo apt-get install libsvn-java
შემდეგ გადმოწერეთ javahltests.jar ფაილი რომელიც დაგვჭირდება JavaHL-ის შესამოწმებლად.  უბუნტუზე JNI ბიბლიოტეკები ჩვეულებრივ /usr/lib/jni ფლდერში ინსტოლირდება. ჯავა კი ჩვეულებრივ არ იყურება ამ ფოლდერში. ამიტომ გადმოწეილი ფაილის ასე გაშვება
java -jar javahltests.jar 
შეცდომას გამოიტანს მიუხედავად იმისა რომ ბიბლიოტეკა დავაინსტოლირეთ.
ამიტომ საჭიროა ჯავას ხელით მივუთითოთ ბიბლიოთეკების ფოლდერი შემდგენაირად:
java -Djava.library.path=/usr/lib/jni -jar javahltests.jar
წესით ახლა უკვე შეცდომები აღარ უნდა გამოიტანოს. შედეგი დაახლოებით ასე უნდა გამოიყურებოდეს:

.........................................
.........
Time: 146.249

OK (50 tests)
ეს ნიშნავს რომ JavaHL, ანუ ბაინდინგი ნეიტივ ბიბლიოტეკაზე კარგად მუშაობს.
ამის შემდეგ დარჩა მხოლოდ ეკლიპსისთვის JNI ნეიტივ ბიბლიოტეკების ფოლდერის მითითება, წინააღმდეგ შემთხვევაში ისიც ვერ დაინახავს მათ და მივიღებთ ისევ იმ შეცდომას.
გადადით ეკლიპსის ფოლდერში და გახსენით eclipse.ini ფაილი და დაამატეთ ქვემოთ მუქად გამოყოფილი ხაზი:

-vmargs
-Djava.library.path=/usr/lib/jni
-Dosgi.requiredJavaVersion=1.5
შეინახეთ ფაილი და გადატვირთეთ ეკლიპსი. წესით ეკლიპსმა შეცდომები JavaHL-ის შესახებ აღარ უნდა გამოიტანოს.


Monday, January 07, 2008

First PID Control

წინა წლის 31 დეკემბერს პირველად შევძელი PID კონტროლის მეშვეობით მემართა ელერონები, კუდი (პედლები) და ძრავი. პირველად ძრავზე შევძელი ამის გაკეთება და თან ძალიან კარგად. ამ სურათზე მოყვანილია კრენის და ელერონების დიაგრამა PID კონტროლერის ალგორითმით მართვის დროს. მემგონი არც ისე ცუდი შედეგია :)
რაც შეეხება თავად PID კონტროლს, ინტეგრალური კომპონენტი მოითხოვს რომ შეცდომები (სხვაობა მიმდინარე და სასურველ მნიშვნელობას შორის) ვჯამო ყოველ იტერაციაზე. მაგრამ როდემდე უნდა ავჯამო ეს შეცდომები? ძალიან დიდი ციფრ გამოდის. ამიტომ მოვიგონე ასეთი ”სოლიუშენი”: როდესაც შეცდომა ძალიან მცირე ხდება მაშინ ამ ჯამს ვანულებ. როგორც კი შეცდომა ამ მნიშველობაზე დიდი გახდება მაშინ განულება აღარ მოხდება სანამ კონტროლერი ისევ არ მიიყვანს საკონტროლო სისტემის (ვთქვათ კრენის) მიმდინარე მნიშვნელობას სასურველ მნიშვნელობამდე.
რაც შეეხება გაზომვების დროის ფიქსირებას PID კონტროლერის ფორმულებში გამოსაყენებლად, ამისთვის System.currentTimeMillis()-ს ვიყენებ. ცოტა ხანში ნანო წამებსაც ვსინჯავ.
აქ არის დღეს გადაღებული ვიდეობი:
1) აფრენა გარედან.
2) აფრენა კაბინიდან.
3) მოხვევა გარედან.
4) მოხვევა კაბინიდან.

ამჯერად ვიდეო ფოტოაპარატით გადავიღე, თავად პროგრამა ისევ ნოუტბუკზე დავსტარტე, სიმულატორი კი ჩემი ძმის კომპზე. მშვენივრად მუშაობდა.

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).

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

Wednesday, March 21, 2007

Air Balloon Club

ამ ვიდეოზე უცხოური შეჯიბრია, აჩქარებული.
შარშან საქართველოშიც იყო მსგავსი ჩემპიონატი, ცოტა პატარა მაშტაბის, მაგრამ საქართველოსთვის არც ისე პატარა: 18 გუნდი იყო ჩამოსული უცხოეთიდან. წელსაც ტარდება ასეთი ჩემპიონატი ჩვენთან, თუ გაინტერესებთ, ან ლამაზი ფოტოების გდაღება გინდათ, შეგიძლიათ მობრძანდეთ. კონკრეტული ინფორმაცია ავიაციის ეროვნული ფედერაციის საიტზე:
http://www.naf.ge/
შარშანდელი ჩემპიონატის სურათებიდან განსაკუთრებით სტარტის სურათები მომწონს.

ჰაერნაოსნობაზე არის ჩემპიონატის ორგანიზატორის საიტი http://www.balloons.ge/ სადაც შეგიძლიათ გაეცნოთ საკმაოდ საინტერესო ისტორიებს პირველ ქართველ პილოტზე, მეფე ერეკლესადმი მიწერილ წერილზე აეროსტატების შესახებ და ა.შ.

Friday, January 19, 2007

Ubuntu

Ubuntu-ზე გადავედი, ანუ გავlinuxოიდდი. და კაია! არა, კაი კი არა მაგარია. ერთადერთი რასაც აქ ვერ დავაყენებ არის ავიასიმულატორები რაც ისედაც არ მაქვს სამსახურში. ისე კი ყველაფერი მაქვს რაც მჭირდება და რაც მთავარია ყველაფერი უფასო, ანუ არავითარი კრეკები და მაიმუნობები :) MS Office-ის მაგივრად Open Office რომელიც თუ არ ჯობია ნაკლები არაფრითაა პირველზე. და თან მოყვება უბუნტუს. 4 ჩატის მაგივრად 1 GAIM რომელშიც ყველაფერია შიგნით skype-ის გარდა, და რომელიც იჭედება რატომღაც თუ დამალული MSN-დან მწერენ :) კიდევ არის 1-2 პატარა პრობლემა მაგრამ იმედნად უმნიშვნელო რომ საწუწუნოდ არ ღირს. mp3-საც მშვენივრად უკრავს, თითქმის ყველა ვიდეო ფორმატს "მიჩვენებს", რაც მჭირდება იმაზე მეტი შესაძლებლობების მქონე ფოტოშოპის მაგვარი პროგრამა აქვს სახელად GIMP. ფოსტას რაც შეეხება MS Outlook-ს ვხმარობდი Rule-ებთ და ფოლდერებში დანაწილებით, ამასაც მშვენივრად ვაკეთებ Evolution-ში. ნუ FireFox ხომ ყველგან FireFox-ია, მითუმეტეს თუ Google Browser Sync-ს იყენებ. ეს წუთია BlueTooth-იც ავამუშავე სულ რაღაც 1 "პწიჩკის" ჩართვით და სურათები გადმოვწერე მობილიდან. Nvidia FX5200-ის დრივერებიც დავაყენე(თუ ბოლო ვერსია გინდა ცოტა საცალიჩოა). USB Flash დისკებზეც მახსოვდა 1 ჩვენი მეგობარ ცნობილ ლინუხოიდს რამდენი პრობლემები ქონდა ადრე, აქ კი ზუსტად ისეა როგორ ვინდოუსში: შეარჭე და იხმარე :) მეტი რა უნდა უნდოდეს ჩვეულებრივ უზერს? პატარა მარტივი თამაშები? უამრავი მოყვება და უამრავი შეგიძლია დაამატო. მოკლედ ის სტანდარტული პრობლემები და პრეტენზიები რის გამოც "პინგვინებზე" უარს ამბობენ, სულ ტყუილია. ხო კიდევ 1: სახლშიც მაქვს დაყენებული მეორე ვინტზე უბუნტუ, და იქ კიდევ მიერთებული მაქვს CH-ის f-16-ის ჯოისტიკი და პედლები USB-ზე, და კიდევ f-15-ის "რუდ" GamePort-ზე (ეს ყველაფერი პილოტად რომ ვიგრძნო ხანდახან თავი მაგისთვის მჭირდება). ეს სამივე მოწყობილობა მშვენივრად იპოვა და ამოიცნო, მართალია დრივერები არ დამიყენებია და რამე პროგრამით არ გამიტესტია მაგრამ რაც მთავარია არ დაიბნა და მიხვდა რომ ჯოისტიკი ჯოისტიკია და პედლები პედლებია :)
ხო ეხლა მთავარი, პროგრამირებას რაც შეეხება: JDK-ზე ლაპარაკიც არ ღირს, არც Ant-ზე JBoss-ზე. IDE-ზე კი ღირს: რა საჭიროა $5000-იანი JBuilder როდესაც არსებობს უფასო Eclipse? თან უნდა დაკრეკო ასეთი ძვირფასი პროდუქტი და მერე შეხვალ Help->About-ში აკრიფავ meettheteam-ს და თვალებში ვეღარ შეხედავ იმ პროგრამისტებს :) მოკლედ ეკლიპსი ცალკე თემაა და მაგაზე მოგვიანებით, როცა შევეჩვევი, მაგრამ უკვე შემიძლია გირჩიოთ, თუ არ გაპინგვინდებით, გაეკლიპსდით მაინც, ვინდოუსზეც არის ეკლიპსი. MySQL-ისთვისაც ყველაფერია უბუნტუზე. და საერთოდ მათთვის ვინც MySQL-Apache-PHP-ზე "ჩალიჩობს" ასევე 1 "პწიჩკის" ჩართვით ან 1 apt-get ბრძანებით დააყენებს სამივეს. უბრალოდ რამდენად კაია პროგრამისტისთვის ასეთი რაღაცეების 1 "პწიჩკით" დაყენებას მიჩვევა ეგ სხვა საკითხია :)
ელხა მინდა დავაფრანკენშტეინო კერნელი, ანუ ამოვაჭრა ყველაფერი და ასე დაკომპილირება ვისწავლო. ეს 1 პატარა რობოტისთვის დამჭირდება მომავალში ;)