It has 8 skate bearing and it turns pretty well (considering it was cut with a jigsaw!). Laser cut would make it really smooth…
And underside bearing.
Oculus are still keeping us in the dark about input methods, so I decided to do a little designing. I’m not talking about tactile hand interactions with the VR world this time, rather an investigation into creating a cheap and user friendly method of locomotion input.
Right now we have only two serious contenders for this field, the Omni Virtuix in the US and the Cyberith Virtualiser in Europe. They’re both based on a similar principle, you strap into a harness which attaches to a substantial harness where you then walk and run in a virtual world. Your feet slip beneath you on a low friction mat creating the illusion of locomotion. They’re both quite nice solutions but at $500 and €750 each, not exactly friendly to a users wallet. I think they could succeed but the market for such devices at this price is probably quite small.
So is there a low cost alternative? Right now, no. How about we design one then?
First I should state that while using a joypad to move around, or even a joystick on a different handheld controller, is not the most immersive method so how about a locomotion input method that is ‘hands free’?
The high cost of both solutions above is due to the massive frame that surrounds the user. This is mainly for safety since if the user loses their balance (when they’re not able to see the real world) it’s quite easy to fall over. The harness and frame should prevent that. If we removed the frame we’d be left with something like the ‘wizzdish’ but wearing slippy shoes while running on a slippy disk, while you can’t see, sounds like a recipe for disaster…
The actual idea of standing and moving your body to move your avatar is good though. We could perhaps use something like the kinect to control our body, but the latency is pretty high and the kinect 2 is $300 (and a $50 adapter).
With all this in mind I set out to design a low latency, low cost, safe locomotion controller. Ideally you’ll have a 3D printer to make some parts, although it’s probably quite easy to make them from wood and a laser cutter would be very nice but a jigsaw and simple (DIY) tool for cutting largish circles will probably do just as good a job. You’d also need a drill and a soldering iron. Back of the envelope costs work out to about $15 for the electronics, $10 for wood, $4 for skate bearings, $4 for magnets and perhaps $7 for nuts and bolts. Less than $50.
Ok, so what’s the basic idea?
We create a simple harness that we can attach to the users belt, which they can use to move forward, back, to the sides and turn on the spot. The user no longer ‘walks’ to create movement (although walking on the spot is perfectly acceptable) but rather pushes the harness in the direction they wish to go and can turn 360º on the spot. Movement and head orientation are disconnected. Your hips basically become an analogue joystick which you can also turn.
Mechanically it’s quite simple. An outer ring contains all the electronics as well as four horizontal bearings and four vertical bearings to keep the inner ring in place. The outer frame pulls up and your body pushes down, keeping the two rings together. Each ‘corner’ requires one small 3D printed part, a washer, a ring magnet, a spring and some bolts to hold it to the outer ring. Each of these four corners are attached by string or cables (in what will probably be the main point of criticism) to the walls of the room. If you’re really so adverse to drilling four simple holes then your options are to construct a small frame or go out and spend $500/€750…
The inner ring would connect to the users waist and allow the user to ‘step into’ the outer ring since it contains no electronics or sensors.
Electronically the device is also quite simple. An Arduino is the brains of the device and each corner has a 3D printed part with a spring holding a magnet next to a hall sensor. This is a small sensor that can detect magnetic flux. When the user moves the magnet is moved away from one (or two) corners and we can measure their direction (and ‘velocity’). For rotation we can use a rotary encoder, much the same as you’re probably holding in your hand right now in your mouse’s wheel. We use a small wheel that turns when the inner ring turns and gives us our heading.
Who wants a picture?? :p
The outer ring is approximately 606mm wide, the same width as the normal ‘small’ plywood boards generally available in the UK. This doesn’t show the rotatory encoder location or design yet.
Knowing where the inner ring is at all times is really important, the challenge is doing this reliably and cheaply.
Over on reddit Nothing7 expressed some concern about reading the direction accurately with a rotary encoder on a wheel. Since you can turn pretty fast the encoder will also be turning VERY fast… karstux suggested using a the camera in an optical mouse, which are pretty fast and non-mechanical (one less thing to break). This is a pretty good idea but the inner ring has a circumference of nearly 700 inches, the fastest mouse I could find only read 500 IPS (inches per second)…
Instead we could give the camera something to work with rather than just the edge of the inner ring. If we divided the circle into 360 parts we can give each slice a monochromatic code on the side that the camera can see, right now the slices would be about 4.9cm long. Even though the ring could be spinning very fast we should be able to see these ‘codes’ since they’re so long. With 9 bits (or lines) we have up to to 512 positions, enough to cover our 360 degrees and provide an absolute position.
The problem is now we’re having to create, line up and attach a code to the outside of the ring… doable for a commercial version perhaps, but a pain for a prototype…. still, with a decent printer it could be done, the question then is whether we’re able to decode this accurately on an Arduino…
Another analogue solution is to instead use a ‘triangle’ of dark and white light and measure how much reflection we’re getting. 0 reflection is 1 degree, 50% reflection is 180 degrees and so on. This isn’t as accurate, but could possibly work ok. Again we’d need to attach something to the edge of the inner ring (or perhaps on the top or bottom).
After a night of sleep I woke up to a better solution which merges my two solutions. Instead of one huge ‘triangle’ we use several wrapped around the edge. If we have 36 then each represents a 10 degree angle. Using a photodetector we can now measure how much light is reflected giving a good estimation of the position within those 10 degrees and if the user starts rotating quickly this reading will either rise and drop to zero going one way, or fall and spike to 100% going the other. This should be fast enough to turn with at least 10 degree increments very quickly which we can count. We can also add a 1 degree marker in the middle of a triangle in front of the user so we can automatically calibrate whenever the device is turned on (and also resets the zero rotation whenever we return to that position). This means we can just print a repeating strip of triangles instead of having to create a complicated ‘data’ pattern, far simpler from a production standpoint and we don’t have to worry about lining the pattern up precisely with a mouse camera which only has a tiny field of view.
Edit 3: It appears that a light dependent resistor might not be fast enough to be used for this since it’s latency is around 10ms, however there are some (slightly more expensive) alternatives, such as the TAOS TSL230RD 640nm Light to Frequency Converter, Fmax = 120kHz, PCB Surface Mount or this
Here is a cut through of one of the corners, it doesn’t show the hall sensor or the magnet but you get the idea. The version I’ve made now has a small magnet holder but with a 8mm ring magnet this can be dispensed with.
The design has also been tweaked to get rid of another part, replacing it with a 12mm washer, so the final version should only be one identical part four times. The hall sensor would be pushed up into the print through a hole and attached with a few drops of glue.
Depending on the set up it should also be possible to detect crouching in game and possibly jumping although that might require some fine tuning of the design (perhaps a few retaining bearings so the inner ring doesn’t jump out when you jump up…). If you’re worried about pulling the raw plug out of the wall , if you fell over, I would suggest using a fairly weak section of fishing line (say 5kg) which should break first.
My idea for figuring out where the holes in the wall are places was that the user places the HipSteer on a couple of chair backs, a little higher that their waist. They can then look to see down the hole in each sensor corner. Alternatively they could point a cheap laser out of the sensor to get an approximate idea. Once the holes are drilled, raw plugs and a fairly sturdy hook are probably the best idea. Then you run the string and get the outer ring level while hanging in space.
I’ve printed one of the corners (after four redesigns) and put it together, I should manage the other three tomorrow and do a simple test with code to ensure that it works as predicted before I start cutting up wood for the rings.
Cost: This is the big one, less than $40 for parts means it could possibly be manufactured for less than $100. That’s a big saving on $500/€750 alternatives.
Shipping: Although the rings are quite large it would be fairly simple to design a version that broke down into 4 identical sections that bolt together. Then the whole assembly could be shipped worldwide for probably less than $30 (even cheaper domestically).
Simplicity : You lean to move in the direction you want to go, lean further and you move faster. Turn your body and your avatar turns. You have immediate feedback and anyone can understand how it works in 5 seconds. Your hips are the joystick, leaving you to concentrate on looking and aiming.
Less tiring : Omnidirectional treadmills are a great way of getting lazy gamers off the couch but I would like to see someone overweight use one for more than 10 minutes. Getting some people to stand for a couple of hours would be a good enough start. Once they’re doing that we should be able to add a virtual ‘pedometer’ (or just a real one) to get them moving a little more in game. The HipSteer can be regarded as training wheels for a more vigorous Omnidirectional treadmill.
Mechanical simplicity : Few moving parts mean there are less things to break, cloning the same components four times means it’s a lot easier to replace things and fix them.
Electronic simplicity : One Arduino, 4 hall sensors, 1 rotary encoder, some wire. Easy.
Simple Software : If we use a Arduino Leonardo we can emulate a native windows joystick very easily making it virtually plug and play for every application.
Storage : The whole device is really small, store it under the sofa when not in use. Packing it up means disconnecting it from the walls, wrapping up the cables, unplugging it and putting it away. Probably 1 minute or less. Same to reconnect.
Falling Over : There is nothing to stop you, however you’re not really walking or running so this should be unlikely if your balance is good. Initially I would suggest placing four chairs with their backs close by around the HipSteer, then you can reach out and steady yourself. Easy to break cables, a small loop of weak fishing line, should avoid damage to your walls. There is no reason to use this in a situation where you’re not controlling your movement, so don’t use it in a rollercoaster demo!
Drilling holes : Anyone who is reasonably handy can hang a picture and this is basically the same thing, drill a hole, add a raw plug and a small hook. If you’re concerned it will be unsightly then put some pictures on the walls when you’re not in VR 🙂
Cables, cables everywhere! : OK, if you’re in a room full of people then having four lengths of string connecting you to the wall isn’t ideal, but mostly it’s going to be one person in a room alone (close your curtains! :p), or go buy a treadmill.
Location, location, location : the ideal location to use this is probably in the center of a square room but perhaps this is unlikely. If the room is quite large then moving it around by adjusting the support cable lengths would probably be ok but you’d have to be careful the platform stays level and centered. Some experimentation required.
Portability : So it’s not easy to take with you to a hotel room, but would you be taking another massive treadmill instead?
Strength : 3D printed ABS or PLA isn’t amazingly strong but if the four corner parts were printed in Nylon they should be well up to the task.
Weight : Although the prototype will be made from 12mm plywood it should be pretty simple to use other, lighter, materials such as dibond aluminium sheets or perspex. Since the sensors are essentially suspending the outer ring the assembly should be as light as possible.
I want to run!! : As mentioned before, this probably isn’t a great idea since there is no support, but I would imagine someone who had spent a lot of time using this (and not falling over) could use a slippy surface + socks and probably be ok.
Getting centered : Initially you might need some clues on the floor to let you feel where the center of the platform should be, I suggest a mat like the one Oculus used to demonstrate the Crescent Bay prototype..
So, am I pointing out that this idea has more disadvantages than advantages? Not really, most of these problems are easily addressed.