The project is about making the robot move in a pre-defined path with precision, without making use of GPS or WiFi or Bluetooth for positioning, not even map or building layout plan. And draw its actual path (to the scale), in real-time. The bluetooth can be used as a substitute of wire, for transmitting real-time location information.
We were looking for a robust solution for indoor navigation of our Arduino based robot. While choosing the right motion sensing solution for this application, we also considered Oblu (an opensource IMU). Its low cost and opensource nature made it a probable candidate. The tricky part here was that oblu's opensource program is suitable for foot-mounted indoor Pedestrian Dead Reckoning (PDR ) or Pedestrian Navigation, in simple words. Oblu's PDR performance in indoor as a foot-mounted IMU is quite impressive. A big plus point was free Android app (Xoblu) for its real-time position tracking. However, we were not sure how to make use of its existing pedestrian navigation algorithm which is based on human walking model.
Oblu's internal computations are based on human walking. Oblu gives out displacement between two successive steps and change in heading. When the foot comes in touch with the ground, the speed of the sole is zero, i.e. the sole is at standstill. <Refer above video.> This way Oblu detects 'steps' and corrects some internal errors. And this frequent correction of errors, results in great tracking performance. So here lies the catch. What if our robot also walks in the same fashion - move, stop, move, stop..
We opted for Oblu and in no time we could assemble our robot and the tracking system. Rest of the story is in the following video...
How does it work:The robot moves in a pre-programmed path and transmits (over bluetooth) its actual movement information to a phone for real-time tracking.
Arduino is pre-programmed with path and oblu is used for sensing robot's motion. oblu transmits movement information to Arduino at regular interval. Based on that, Arduino controls wheels' movements to let robot follow the predefined path.
The robot's path is programmed as a set of straight line segments. Each line segment is defined by its length and orientation with respect to the previous one. The robot's motion is kept discreet, i.e. it moves in straight line, but in smaller segments (lets call 'strides' for simplicity). At the end of every stride, oblu transmits stride length and extent of deviation (change in orientation) from straight line, to Arduino. Arduino corrects the alignment of robot at every step on receiving such information, if it finds deviation from the pre-defined straight line.
As per program, the robot is always supposed to move in a straight line. However, it may deviate from straight line and may walk at a certain angle or skewed path because of non-idealities like uneven surface, mass imbalance in robot assembly, architectural or electrical imbalance in dc motors or the random orientation of front free running wheel. Take one step.. correct your heading... move forward. The robot also moves backwards if it travels more than the programmed length of that particular line segment..
The next stride length depends upon the remaining distance to be covered of that particular straight line segment. The robot takes large strides when the distance to be traveled is larger and takes smaller strides close to destination (i.e. end of every straight line segment).
IMU Oblu transmits data to Arduino and phone (over bluetooth) simultaneously. Xoblu (the Android app) performs some simple computation to construct the path based on the movement information received from the robot, which is used for real-time tracking on phone. (Path construction using Xoblu is illustrated below.)
In summary, Oblu senses motion and communicates movement information to Arduino and phone at regular intervals. Based on the programmed path and the motion information (sent by oblu), Arduino controls the wheels' movements. The robot's movement is NOT remotely controlled except for start/stop commands.
Path modeling :The robot could be best controlled if it walks in straight line segments only. Therefore, the path must be first modeled as a set of straight line segments. Below pictures contain couple of example paths and their representations in terms of displacement and orientation. This is how the path is programmed in Arduino.
Likewise any path which is a set of straight line segments, can be defined and programmed in Arduino.
Circuit Assembly:Refer H/W section for electrical connections between Arduino, oblu, motor driver and battery pack.
- Communication Protocol :
Step 1: Xoblu sends START command to oblu
Step 2: oblu acknowledges receiving command by sending appropriate ACK to Xoblu
Step 3: oblu sends DATA packet containing displacement and orientation infromation for each stride, at every step, to Xoblu. (step = whenever detects zero motion or standstill is detected).
Step 4: Xoblu acknowledges receiving last DATA packet by sending appropriate ACK to oblu. (Cycle of steps 3 and 4 is repeated until Xoblu sends STOP. On receiving STOP command, oblu executes Step 5)
Step 5: STOP - (i) Stop processing in oblu (ii) Stop all outputs in oblu
Please refer oblu's Application Note for details of START, ACK, DATA and STOP
How does Oblu IMU work (optional) :Presenting some references on Oblu's overview and basic principal of operation of a foot-mounted PDR sensors:
--> The available source code of oblu is targeted towards foot-mounted navigation. And it is best optimized for that purpose. Below video covers its basic principal of operation:
--> Here are couple of simple articles on foot mounted PDR sensors:
--> You may refer this document for details on pedestrian dead reckoning using foot-sensors.
--> Following video for overview of Oblu:
----------------
Please do share your feedback, suggestions and leave comments.
Best Wishes!
----------------
Comments