What we have found is that this works pretty well for distance measurements - placing the sensor bar on a desk and the wiimote on another desk a couple of metres away results in a stable measurement of the apparent separation between the two sources, and moving the wiimote a fairly short distance gives a change in this apparent separation which is also consistent and could be translated into a distance from the sensor bar with about 1cm accuracy (i.e. moving the wiimote forward or back about 1cm causes a change in the apparent separation of one camera pixel). For example, with d = 1m the apparent separation might be 160 pixels, and with d=1.1m the separation might be 150 pixels (apparently closer together, because the light sources are further away). With some calibration, and the selection of alternative light sources and positions, this could be used to give accurate position measurement.
#!/usr/bin/python
import cwiid
from time import sleep
from math import sqrt
print "Press 1+2 on the Wiimote now"
wiimote = cwiid.Wiimote()
wiimote.rumble = 1
sleep(0.2)
wiimote.rumble = 0
print "OK"
# Rumble to indicate a connection
wiimote.enable(cwiid.FLAG_MESG_IFC)
wiimote.rpt_mode = cwiid.RPT_BTN | cwiid.RPT_IR
loop = True
distance = 0
last_distance = 0
last_ir = ""
while (loop):
sleep(0.01)
messages = wiimote.get_mesg()
for mesg in messages:
# Button:
if mesg[0] == cwiid.MESG_BTN:
if mesg[1] & cwiid.BTN_HOME:
print "Ending Program"
loop = False
# Infra-red
elif mesg[0] == cwiid.MESG_IR:
sources = mesg[1]
output = "IR: "
spots = []
for spot in sources:
if spot:
# output = output + "{0}".format(spot)
output = output + \
"{0} {1:12}".format(spot["size"], spot["pos"])
spots.append(spot)
if len(spots) == 2:
deltax = spots[0]["pos"][0] - spots[1]["pos"][0]
deltay = spots[0]["pos"][1] - spots[1]["pos"][1]
distance = int(sqrt(deltax * deltax + deltay * deltay))
if distance != last_distance:
print "Distance : ", distance
last_distance = distance
else:
if output != last_ir:
print output
last_ir = output
else:
print mesg
