Geospatial Learning @ Primary School

Dez/09

12

Hacknight the 2nd

As I mentioned here some results from the Hacknight we had on the 3rd of December. We were three groups (2–3 people each), one playing around with the OLPC server, another one which tryed to work out the collaboration stuff and the third one which targeted to integrate GPS positioning in the application.

Here a short summary of each group:

OLPC Server

Target was to investigate if the OLPC XS is capable to act as a Tile@Home server. Tile@Home is similar to the classic SETI@HOME where you were able to share CPU time with NASAs efforts in searching for extraterrestrial life when your computer was in idle state. Well, we’re not really  interested in extraterrestrial life (at least that night ;-) ), but wondered if XS has enough power to act as an OSM tile server. The main idea evolves from the fact that internet is not a safe thing in rural areas. If there is an internet connection, the school server could share it and all XOs would be able to download tiles from servers like the mapnik tile server. But if there is no internet connection, the server could either

  1. has cached all tiles (of interest) or
  2. even calculate its own tiles from a local OSM database.

Both possibilities are quite  interesting.

However, to simplify the work we decided to concentrate on the caching variant. For this we set up a small server script delivering tiles which are already cached on serverside. See on the Hacknight Twiki for some code.

Collaboration

Getting connected with other XOs is important to create a colloborative game. The second group wanted to find out more about the sharing functionality of an ativity. For this, we created a small activity reading out information about other XOs connected to the mesh network.

Nicknames,  Hashcodes and other attributes could be read out. Unfortunately, no exchange of custom data could be established at the Hacknight. Nevertheless, the basic steps and experiences were made we can build on.

GPS/Position Integration

Location is essential and probably the most importatnt thing when communicating and mediating geospatial conciousness. Running the great GPS daemon gpsd (for now we’ve to start it in the terminal, but it wouldn’t be too hard to start it from python, I guess), we extract the gps info via python gps module and keep it up to date every three seconds:

<br />
#!/usr/bin/env python<br />
import os<br />
import gps<br />
import time<br />
import logging</p>
<p>import utils<br />
import constants</p>
<p>LOGGER = logging.getLogger('position-logger')<br />
utils.init_logging(LOGGER)</p>
<p># this prepares for intended start of gpsd from terminal (e.g. gpsd /dev/ttyACM0)<br />
_FILE = open(os.path.join(constants.CONFIG_PATH, 'gpsdevice'))<br />
_DEVICES = [dev.strip() for dev in _FILE.readlines() if not dev.startswith('#')]<br />
if len(_DEVICES) != 1:<br />
    LOGGER.warn('Check your gpsdevices config file.')</p>
<p>try:<br />
    GPS_SESSION = gps.gps()<br />
except:<br />
    GPS_SESSION = None #IGNORE:W0702<br />
    LOGGER.warning('Could not initialize GPS session.')</p>
<p>###################################################<br />
class GPSReceiver():<br />
    """Receives GPS signal from gpsd Daemon.</p>
<p>    TODO There is a dbus alternative. . .<br />
    """<br />
    def __init__(self, gps_infos):<br />
        """Creates GPS_SESSION."""<br />
        LOGGER.debug('Create GPSReceiver.')<br />
        self.result = gps_infos</p>
<p>    def get_position(self, query='admosy'):<br />
        """Gathers the current position information."""<br />
        try:<br />
            GPS_SESSION.query(query)<br />
        except:<br />
            LOGGER.error("No GPS connection possible. ")<br />
            raise StopIteration, "No GPS connection possible. "<br />
        if GPS_SESSION:<br />
            self.result['latitude'] = GPS_SESSION.fix.latitude<br />
            self.result['longitude'] = GPS_SESSION.fix.longitude<br />
            self.result['utc'] = GPS_SESSION.fix.time<br />
            self.result['altitude'] = GPS_SESSION.fix.altitude<br />
            self.result['eph'] = GPS_SESSION.fix.eph<br />
            self.result['epv'] = GPS_SESSION.fix.epv<br />
            self.result['speed'] = GPS_SESSION.fix.speed<br />
            self.result['climb'] = GPS_SESSION.fix.climb<br />
            self.result['satellites'] = GPS_SESSION.satellites</p>
<p>            if self.result['latitude'] == 0 and self.result['longitude'] == 0:<br />
                # wait if gps has not been initialized yet.<br />
                LOGGER.debug('wait for connection')<br />
            #LOGGER.debug(self.result)</p>
<p>###################################################</p>
<p>if __name__ == '__main__':</p>
<p>    infos = {'latitude'  : 0.0,  # WGS84 latitude<br />
             'longitude' : 0.0,  # WGS84 longitude<br />
             'utc'       : None, # UTC time<br />
             'altitude'  : 0.0,  # m over sealevel<br />
             'eph'       : 0.0,  #<br />
             'epv'       : 0.0,  #<br />
             'speed'     : 0.0,  # current speed<br />
             'climb'     : 0.0,  #<br />
             'satellites': 0     # #satellites<br />
             }</p>
<p>    recvr = GPSReceiver(infos)</p>
<p>    for i in range(0, 100):<br />
        recvr.get_position()</p>
<p>        print 'latitude    ' , infos['latitude']<br />
        print 'longitude   ' , infos['longitude']<br />
        print 'time utc    ' , infos['utc']<br />
        print 'altitude    ' , infos['altitude']<br />
        print 'eph         ' , infos['eph']<br />
        print 'epv         ' , infos['epv']<br />
        print 'speed       ' , infos['speed']<br />
        print 'climb       ' , infos['climb']<br />
        print infos['satellites']</p>
<p>        time.sleep(3)<br />


RSS Feed

Noch keine Kommentare.

Leave a comment!

<< Some more screenshots

Hacknight Pic >>

Find it!

Theme Design by devolux.org