Showing posts with label ruby. Show all posts
Showing posts with label ruby. Show all posts

Sunday, April 6, 2008

Maemo Mapper paths.db break down


When connected to GPS mapper has a track log in the paths.db file in /home/user/.maemo-mapper/. If you take a look at the file with the sqlite3 client you'll see a table named track_path. This is where the data points are stored but they're not in degrees. A .schema reveals that the columns are called unitx and unity.


A dig through the internet found me source that was using a function called unit2latlon. So I downloaded the source from the garage and grep'd for the definition of this function. It turns out to be a macro in defines.h.


Here's the macro converted to ruby for easy use. It only does long and lat. I still have to find what the altitude is in...



TILE_SIZE_P2 = 8
MAX_ZOOM = 20

WORLD_SIZE_UNITS = 2 << MAX_ZOOM + TILE_SIZE_P2

MERCATOR_SPAN = -6.28318377773622
MERCATOR_TOP = 3.14159188886811


def unit_2_lat_lon(unitx, unity)
lon = ((unitx) * (360.0 / WORLD_SIZE_UNITS)) - 180.0
lat = (360.0 * (Math.atan( Math.exp ((unity * (MERCATOR_SPAN / WORLD_SIZE_UNITS)) + MERCATOR_TOP)))) * (1.0 / Math::PI) - 90.0;
return lat,lon
end



It's line for line the same as the Maemo-Mapper team's code. There was a lot more in the defines.h file, but this is all that's needed to run the function. I ran the last point in the database and checked the output in Google maps (straight copy and paste!) and it is where it stopped logging!



irb(main):001:0> lat,lon = unit_2_lat_lon(157094175,199470581)
=> [41.9127500226541, -74.6601469069719]

Friday, April 4, 2008

Google Maps, Maemo Mapper, GPX, KML all get me to the rally!

I'm a bit of a rally fan. Not the political kind, but the motorsports kind (you may have see it in the x-games...). This weekend is the 2008 Rally New York. If you've ever been to a rally before you know what a pain it is finding and getting to spectator points. If you haven't, I suggest you do, and believe me, it's a pain. There's usually a spectator guide and if you dig around the site some scanned maps that have been marked but these always leave me a little in the dark. So each time I go to one of these I usually take a few hours checking out google maps and figuring out where the spectator points are and how to get there.


It started out with just printing out the pdf's and the maps, but then I got a psp and I started downloading Google maps and drawing on them and loading them as pictures. Then I got the Nokia N800, suddenly there was no need for print outs (yay! I'm going green while driving > 300 miles to a fuel burning frenzy). The N800 can handle PDFs and with the help of Maemo Mapper can handle maps for me. That coupled with a bluetooth GPS receiver gives me a really great tool for navigating to the different points. Now I have an iPhone as well which has maps and PDF abilities (if it only had GPS!)
So what I did this year was plot everything on Google Maps:


View Larger Map

The cameras are spectator points. The orange lines are the closed road courses and the blue lines are the recommended approaches to the spectator areas. While editing a map you can download the kml file to view in Google Earth. This file just contains a link to the actual .kml file that has the lines and points in it. I tried putting this file on a server and hitting it in my iPhone's maps.app. But after getting a polite error about not being able to find anything matching the search I looked on the web and found that the only kml elements Google Maps for Mobile (which maps.app is based on I hear) is the point. So lines were out and my iPhone was out.


Next I looked up what format Maemo Mapper supported, which is GPX. I fired up gpsbabel and converted my real kml file to gpx only to have Maemo Mapper choke on it. It turns out that Mapper wants only one type of dataset at a time. The kml had lines and points which were converted to "trk"'s and waypoints. But I really only needed to store my spectator areas as Points of Interest (POI). Mapper stores it's POI in a sqlite3 database in /home/user/MyDocs/.documents/Maps/poi.db by default. By getting that file I was able to write a ruby script that took out the "Point" elements from the kml file and create sql insert statements. Putting that db back and fixing permissions (I was ssh'd in as root so the file became pwn'd) gave me the spectator points. Since they're the only things in there it makes for very easy viewing!


Then came the "approaches", I have them as line fragments on the google maps but Mapper only supports Routes and tracks. I don't know if tracks would have helped me as I think they're in a db called paths.db but the routes are stored in an xml file in gpx format. Gpsbable dropped the names and descriptions when it converted the lines so I created a new ruby script that took the LineStrings from kml and created trkpt's from them. Reloading the route file in Mapper gave me my route to the place plus the route fragments to the spectator areas. Since they were all in the same route file I could then download tiles around the routes and have everything internet free. I also added a description to some of the points in the line for turn directions/hints. You can count the bends in your google map to know which one to add it to and remember it goes at the beginning of a line not the end. So if you have a right turn between segment 2 and 3 add the turn description to segment 3.


Hopefully that'll be everything I need. I'm bringing my old phone just in case I need to tether (damn you iPhone and your lame bluetooth support) to the N800 for data. Now about that battery life...

Sunday, March 30, 2008

Building source on Ubuntu

If you're trying to build anything from source on Ubuntu don't forget to sudo apt-get install build-essential before you start!

I was trying to build the iphone toolchain on Ubuntu 7.10 and was getting this error when trying to ./configure --enable-optimized

checking for C compiler default output file name... configure: error: C compiler cannot create executables
See 'config.log' for more details.


I knew there was some basic install stuff you needed before hand but I had to search for it. Once installed your configure step will work.

[update]
If you have to build ruby gems with native extensions then also add


sudo apt-get install ruby1.8-dev

Tuesday, January 1, 2008

First Prototype HUD GPS Hookup

IMG_2246.JPG
IMG_2246.JPG, originally uploaded by joecagit.

This is the first test of my prototype for a car HUD. What I'm going for is a fighter jet feel in my car. I'm prototyping using Shoes for now to just work out the details quickly. I'm using gpsd with Net::Telnet in Ruby to access the heading (across the top) and speed (down the side).
The image doesn't really make sense since the heading coming over the wire isn't what's showing on the compass. I think I took the picture as one of the bad sentences came across. (Every once in a while it would change to 358ish degrees when it was supposed to be about 2 degrees)
Also the speed coming across is either in knots or meters/second so that's what's showing on the HUD not the 25 mph on the GPS.
I have to still figure out how to get the waypoint information from the GPS to update the hud. That's what the little circle is. Hardcoded to 285 in the picture.