Beispiel #1
0
#!/usr/bin/python

import gpsdthrd
import rplidar
import time

gpsp = gpsdthrd.gpspol()
gpsd = gpsdthrd.gpsd

try:
    gpsp.start()
    gpscnt = 0
    while gpsd.fix.longitude == 0:
        if (gpscnt == 0):
            if (gpscnt == 0):
                gpscnt += 1
            print 'waiting for gps'
    print 'gps ready'
    print 'lat: ', gpsd.fix.latitude
    print 'lon: ', gpsd.fix.longitude
    print rplidar.getlines()
    gpsp.running = False
    gpsp.join()
except KeyboardInterrupt:
    print 'KeyboardInt'
    gpsp.running = False
    gpsp.join()
print 'done'
    y = math.sin(lonend - lon) * math.cos(latend)
    x = math.cos(lat) * math.sin(latend) - \
        math.sin(lat) * math.cos(latend) * math.cos(lonend - lon)
    return (math.degrees(math.atan2(y, x)) + 360) % 360

# a function, which returns a distance between two polar coordinates


def poldist(th1, r1, th2, r2):
    d = math.sqrt(r1 * r1 + r2 * r2 - 2 * r1 * r2 *
                  math.cos(th2 / 180 * math.pi - th1 / 180 * math.pi))
    return d

try:
    print 'activity 0'
    linespol = rplidar.getlines()
    gpsh = gpsheading()  # heading towards the destination point
    cmpsh = cmps11.heading()  # compass heading
    print 'linespol: ', linespol
    print 'gpsh: ', gpsh
    print 'cmpsh: ', cmpsh
    # if farer than 1.21m from the destination point
    while (gpsdist() > 1.21):
        # activity 0 analyzes rplidar data and plans the path
        if (activity == 0):
            # state 0 checks if there is an obsticle on the line to the
            # destination point
            if (state == 0):
                print 'state 0'
                print 'lncnt: ', lncnt
                # if there are no obsticles in the 7m radius
def objdet():
    srffr = srf08.srf08(0x72)
    srffc = srf08.srf08(0x71)
    srffl = srf08.srf08(0x70)
    srfrr = srf08.srf08(0x73)
    srfrc = srf08.srf08(0x74)
    srfrl = srf08.srf08(0x75)

    leftf = md03.md03(0x58)
    leftr = md03.md03(0x5A)
    rightf = md03.md03(0x5B)
    rightr = md03.md03(0x59)
    accel = 15
    rotsp = 130

    cmpsh = 0
    linespol = []
    firstcnt = 0
    cnt = 0
    objsize = 41  # defines the size(cm) of an object to look for
    objtol = 3.7  # introduces tolerance parameter in cm
    drivedist = 0
    driveangle = 0
    turnang = 0
    turnangfx = 17  # defines an angle offset from the center of an object
    stopdist = 37  # defines how far(cm) from an object the robot stops

    try:
        linespol = rplidar.getlines()
        print linespol
        if (len(linespol) != 0):
            for lines in linespol:
                # looks for objects
                if (poldist(lines[0], lines[1], lines[2], lines[3]) >= objsize - objtol and
                        poldist(lines[0], lines[1], lines[2], lines[3]) <= objsize + objtol):
                    cnt += 1  # counts the number of objects
                    firstcnt += 1
                    # remembers the first object location
                    if (firstcnt == 1):
                        firstcnt += 1  # won't enter this if again
                        print 'turnang line: ', lines
                        # calculates an angle to face the center of an object
                        if (lines[2] - lines[0] < 0):
                            turnang = lines[2] - \
                                (lines[2] - lines[0] + 360) / 2
                        else:
                            turnang = lines[2] - (lines[2] - lines[0]) / 2
                        # creates an offset from the center of an object so that when the robot
                        # turns to that angle and gets rplidar data the first
                        # object will be this one
                        if (turnang - turnangfx < 0):
                            turnang = turnang - turnangfx + 360
                        else:
                            turnang = turnang - turnangfx

            # check all the objects found
            for x in xrange(0, cnt):
                print 'turnang: ', turnang
                cmpsh = cmps11.heading()
                # the robot turns until the heading is turnang
                if (turnang - cmpsh > 180):
                    cmpsh += 360
                elif (turnang - cmpsh < -180):
                    cmpsh -= 360
                while (turnang - cmpsh < -1.5 or turnang - cmpsh > 1.5):
                    cmpsh = cmps11.heading()
                    print 'cmpsh: ', cmpsh
                    if (turnang - cmpsh > 180):
                        cmpsh += 360
                    elif (turnang - cmpsh < -180):
                        cmpsh -= 360
                    # turn to the left
                    if (turnang - cmpsh < 0):
                        leftf.move(-rotsp, accel)
                        leftr.move(-rotsp, accel)
                        rightf.move(rotsp, accel)
                        rightr.move(rotsp, accel)
                    # turn to the right
                    elif (turnang - cmpsh > 0):
                        leftf.move(rotsp, accel)
                        leftr.move(rotsp, accel)
                        rightf.move(-rotsp, accel)
                        rightr.move(-rotsp, accel)
                    time.sleep(0.11)
                leftf.move(0, accel)
                leftr.move(0, accel)
                rightf.move(0, accel)
                rightr.move(0, accel)
                time.sleep(1)

                firstcnt = 0
                scndcnt = 0
                linespol = rplidar.getlines()
                print linespol
                for lines in linespol:
                    print 'firstcnt: ', firstcnt
                    print 'scndcnt: ', scndcnt
                    if (scndcnt == 2):
                        break
                    # looks for objects
                    if (poldist(lines[0], lines[1], lines[2], lines[3]) >= objsize - objtol and
                            poldist(lines[0], lines[1], lines[2], lines[3]) <= objsize + objtol):
                        firstcnt += 1
                        scndcnt += 1
                        if (firstcnt == 1):
                            print 'firstcnt line: ', lines
                            firstcnt += 1
                            # calculates the time to drive back after facing an object in order to
                            # get back to the starting position
                            drivedist = lines[1] - stopdist
                            # calculates an angle to face the center of an
                            # object
                            if (lines[2] - lines[0] < 0):
                                driveangle = lines[
                                    2] - (lines[2] - lines[0] + 360) / 2
                            else:
                                driveangle = lines[2] - \
                                    (lines[2] - lines[0]) / 2
                        if (scndcnt == 2):
                            print 'scndcnt line: ', lines
                            # calculates an angle to face the center of an
                            # object
                            if (lines[2] - lines[0] < 0):
                                turnang = lines[2] - \
                                    (lines[2] - lines[0] + 360) / 2
                            else:
                                turnang = lines[2] - (lines[2] - lines[0]) / 2
                            # creates an offset from the center of an object so that when the robot
                            # turns to that angle and gets rplidar data the
                            # first object will be this one
                            if (turnang - turnangfx < 0):
                                turnang = turnang - turnangfx + 360
                            else:
                                turnang = turnang - turnangfx

                print 'driveangle: ', driveangle
                print 'drivedist: ', drivedist
                cmpsh = cmps11.heading()
                if (driveangle - cmpsh > 180):
                    cmpsh += 360
                elif (driveangle - cmpsh < -180):
                    cmpsh -= 360
                # turns to face the center of an object
                while (driveangle - cmpsh < -1.5 or driveangle - cmpsh > 1.5):
                    cmpsh = cmps11.heading()
                    print 'cmpsh: ', cmpsh
                    if (driveangle - cmpsh > 180):
                        cmpsh += 360
                    elif (driveangle - cmpsh < -180):
                        cmpsh -= 360
                    # turn to the left
                    if (driveangle - cmpsh < 0):
                        leftf.move(-rotsp, accel)
                        leftr.move(-rotsp, accel)
                        rightf.move(rotsp, accel)
                        rightr.move(rotsp, accel)
                    # turn to the right
                    elif (driveangle - cmpsh > 0):
                        leftf.move(rotsp, accel)
                        leftr.move(rotsp, accel)
                        rightf.move(-rotsp, accel)
                        rightr.move(-rotsp, accel)
                    time.sleep(0.07)
                leftf.move(0, accel)
                leftr.move(0, accel)
                rightf.move(0, accel)
                rightr.move(0, accel)
                time.sleep(0.5)

                srfrr.doranging()
                #srffrm = srffr.getranging()
                srffcm = srffc.getranging()
                # drives forward until the robot faces the object adjusting its
                # path on the way
                while(srffcm > stopdist):
                    cmpsh = cmps11.heading()
                    print 'cmpsh: ', cmpsh
                    if (driveangle - cmpsh > 180):
                        cmpsh += 360
                    elif (driveangle - cmpsh < -180):
                        cmpsh -= 360
                    if (driveangle - cmpsh > -1.5 and driveangle - cmpsh < 1.5):
                        leftf.move(250, accel)
                        leftr.move(250, accel)
                        rightf.move(250, accel)
                        rightr.move(250, accel)
                    elif (driveangle - cmpsh < 0):
                        leftf.move(170, accel)
                        leftr.move(170, accel)
                        rightf.move(250, accel)
                        rightr.move(250, accel)
                    elif (driveangle - cmpsh > 0):
                        leftf.move(250, accel)
                        leftr.move(250, accel)
                        rightf.move(170, accel)
                        rightr.move(170, accel)
                    srfrr.doranging()
                    #srffrm = srffr.getranging()
                    srffcm = srffc.getranging()
                    # print 'front: ',srffcm
                    #srfflm = srffl.getranging()
                    time.sleep(0.11)
                leftf.move(0, accel)
                leftr.move(0, accel)
                rightf.move(0, accel)
                rightr.move(0, accel)

                time.sleep(2)
                print 'image processing'
                # add code for image processing

                # drives back to the initial location
                start = time.time()
                while(time.time() - start < drivedist / 52):
                    leftf.move(-255, accel)
                    leftr.move(-255, accel)
                    rightf.move(-255, accel)
                    rightr.move(-255, accel)
                    time.sleep(0.1)
                leftf.move(0, accel)
                leftr.move(0, accel)
                rightf.move(0, accel)
                rightr.move(0, accel)

        if (cnt == 0):
            print 'No objects detected'
        else:
            print 'Done'

    except KeyboardInterrupt:
        leftf.move(0, accel)
        leftr.move(0, accel)
        rightf.move(0, accel)
        rightr.move(0, accel)
        print 'KeyboardInterrupt in object detection'