Wednesday, January 14, 2015

How to install Postgis on Ubuntu 12.04

If you are trying to install postgis extensions for postgresql on Ubuntu 12.04 LTS, found lot of instructions on stackexchange and other sites, but do not like them, because you do not want to manually download, build and do staff hardcore linuxoids do, then this post might be for you.
It's about Ubuntu 12.04 (precise), postgresql 9.1 and postgis 2.1

Versions

I think main problem with other instructions is that they mess up with versions. Some try to install new postgresql (9.3 for example), which is not in Ubuntu 12.04 repository, some use wrong postgis versions or add wrong repository. Others just like me have two different versions of postgresql installed and just like me have no idea which tools are working when they type psql.
So remember:

  1. Latest version of postgresql for Ubuntu 12.04 currently is postgresql-9.1. If you are using postgresql-8.4, then first upgrade to 9.1 because not sure you will find postgis for 8.4. 
  2. If you need upgrade, don't install both versions at same time. Of course if you are not postgresql and Linux pro. But i guess you are not - you are reading this ;) . Yes you can have two different versions running at same time - this is feature, not a bug. Check /usr/lib/postgresql/ directory. If you see two versions in that directory try to clean everything and start over and install only new 9.1 version. You'll need to dump everything from db to file with pg_dumpall > all_dbs.sql before removing them. Or if this is not possible try to google howto upgrade postgis from 8.4 to 9.1 :)
  3. Currently for postgresql 9.1 there's postgis 2.1

So we need Ubuntu 12.04 -> postgresql 9.1 -> postgis 2.1
That's all about versions. If everything is ready then continue:

Instructions

Here's what you need to do after setting up postgresql 9.1 on your server:

1) add repository
sudo add-apt-repository ppa:ubuntugis/ppa
2) refresh package list
sudo apt-get update

3) install packages
sudo apt-get install postgis postgresql-9.1-postgis-2.1 postgresql-9.1-postgis-scripts postgresql-contrib-9.1

4) login to postgis
sudo -u postgres psql
You can switch to postgres user first and then open psql. Use whatever way you like, just get in to psql

5) switch DB
Switch to db you want to make GIS db. In psql type:
\c my_db_name
We will install extensions in this db.

6) Install extensions
Run these 3 scripts in this order.
CREATE EXTENSION postgis;CREATE EXTENSION postgis_topology;CREATE EXTENSION fuzzystrmatch;

These will install postgis 2.1 extension for selected db which includes new schema named topology, couple of views, functions, triggers and very important table named spatial_ref_sys. To see these, try installing this extensions on new empty database. 
I missed one script here - tiger geocoder - which is used for geocoding and you can read about it here. I needed postgis only for Geoserver and did not installed this extension. If you need that too, run following script but note that it will create lot of additional tables:
CREATE EXTENSION postgis_tiger_geocoder;
As I remember fuzzystrmatch extension is required for Tiger Geocoder. Though not sure 100%. That's all.
Now you can use GIS systems like Geoserver with your DB or write your own GIS applications. 
Good luck!

P.S.


  • Here's more about repository mentioned in the first step: UbuntuGis (stable). Select precise in drop-down and filter to see versions of packages n this repository. 
  • Advise: Do not store your spatial data (coordinates for points, lines and other shapes) as plain data types. Always use postgis type Geometry which can store multiple points or line or polygons and their SRID in one field. Converting from plain data fields to Geometry type is not easy because of those projections transformations.

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/ სადაც შეგიძლიათ გაეცნოთ საკმაოდ საინტერესო ისტორიებს პირველ ქართველ პილოტზე, მეფე ერეკლესადმი მიწერილ წერილზე აეროსტატების შესახებ და ა.შ.