Working Indoor Navigation?

 
#1

Many members of this forum have discussed and built many styles of indoor navigation. Some designs were fairly simple with minimal accuracy. Some were developed with great sophistication and complexity and of course the resulting ability was very good.

Some controls were based on camera feedback using glyphs, colors or objects as way points, ultrasonic distance measurements, compass directions, encoder values, LIDAR feedback etc. etc. as stand alone sensors, or in combinations. Also beacons, and other point of location devices are used for references as ”robot is here”.

I am curious what has worked for you and what has not. I am not looking for the details of the script you built (unless you want to share it), but rather a direction to go to build something that will work reasonably well. Information on your successes and failures would be appreciated. I have built a few scripts, but never got what I really wanted. I would also like to keep the cost down, so I rather not use LIDAR and specialty sensors.

I have an Adventure Bot which has a camera on a servo, 3 ultrasonic sensors mounted front and sides, a compass which is not currently mounted, but available, and the ability to get pulsed signals from the 5 spoke wheels mounted on the continuous servos (poor man encoder ( approx. 1.67 inches or 42.7 mm per step)).

Open for discussion.

I look forward to feedback on this subject.

Ron

#2

Andy, I am working on (Close to finish) a wavefront navigation plugin. How it works is:

You Define an Array called $MyMap, Assign your goal location in the array a value of 1, assign your robot position in the array a value of 254, all walls and obstacles are assigned 255, open space is assigned 0. Call the wavefront plugin.

The plugin returns an array $MyRoute, showing the best route. "G" indicating the Goal, "R" indicating the Robot and "_" indicating the route.
My plan is to the use Sonar to check ahead and if an obstacle is detected, add it to the map update the robot position and resubmit the map to the plugin and move on.
I am still working on the encoders, and how to get my initial robot position.

If You are interested I will post my code and publish the plugin.

#3

Hello rz90208,

Thanks for the reply. Yes, if you would like to post your project it would be great. I am hoping to generate ideas and have members share their efforts to develop a decent way to bring robots to the next level.

A basic indoor navigation system is on everyone's to do list and sharing ideas should help in developing a system that works well.

Ron

#4

I am hoping jstarne1 and Richard R give input on their past navigation projects. They have built systems and hopefully can contribute what worked and what didn't.

#5

Andy, Keep in mind this is a work in progress:
I have not entered the robot movement code, but the robot should move approx. 1 foot per call.
I also need to add the code to turn the robot to the proper direction.
This will be done using his onboard compass.
I will try and post the plugin shortly.

***NOTE***
If you are using the variable watcher, close it before using this code!

Code:


DefineArray($MyMap,6400)
FillArray($MyMap,0)
#Load House Map from file
$MyRobotPosition = 6145
$MyGoalPosition = 44

# the number 1 indicates the Goal position
$MyMap[$MyGoalPosition] = 1
# the number 254 indicates the Robot position
$MyMap[$MyRobotPosition] = 254
# 255 on map indicates a Wall
# 0 on map indicates open space

#Now call the Wavefront plugin
ControlCommand("Wavefront", StartWavefront Start)
# The plugin creates an array $MyRouteMap
# - on the map is the path
# This is if you used an array of 80x80
# East +1, West -1, South +80, North -80
#
$TheGoal = "G"
$TheRobot = "R"
$TheRoute = "-"
$MyArraySize = GetArraySize("$MyRoute")
$MyRoute[$MyGoalPosition] = $TheGoal
$MyRoute[$MyRobotPosition] = $TheRobot
$CurrentPosition = $TheRobot
$LastMove = "NoMove"
print($MyRobotPosition)

repeatwhile($MyRoute[$MyRobotPosition] != "G")
if($LastMove != "East" and $MyRobotPosition -1 > 0)
if($MyRoute[$MyRobotPosition-1] ="-" or $MyRoute[$MyRobotPosition-1] = "G")
Goto(MoveWest)
endif
endif
if($LastMove != "West" and $MyRobotPosition + 1 < $MyArraySize)
if ($MyRoute[$MyRobotPosition+1] = "-" or $MyRoute[$MyRobotPosition+1] = "G")
Goto(MoveEast)
endif
endif

if($LastMove != "South" and $MyRobotPosition -80 > 0)
if($MyRoute[$MyRobotPosition-80] = "-" or $MyRoute[$MyRobotPosition-80] = "G")
Goto(MoveNorth)
endif
endif
if($LastMove != "North" and $MyRobotPosition + 80 < $MyArraySize)
if($MyRoute[$MyRobotPosition+80] = "-" or $MyRoute[$MyRobotPosition+80] = "G")
Goto(MoveSouth)
endif
endif
:Main
print($MyRobotPosition)
endrepeatwhile
Halt()


:MoveWest
$MyRobotPosition = $MyRobotPosition - 1
$CurrentPosition = $MyRoute[$MyRobotPosition]
Goto(Main)

:MoveEast
$MyRobotPosition = $MyRobotPosition + 1
$CurrentPosition = $MyRoute[$MyRobotPosition]
Goto(Main)

:MoveNorth
$MyRobotPosition = $MyRobotPosition - 80
$CurrentPosition = $MyRoute[$MyRobotPosition]
Goto(Main)

:MoveSouth
$MyRobotPosition = $MyRobotPosition + 80
$CurrentPosition = $MyRoute[$MyRobotPosition]
Goto(Main)

#6

Andy, The plugin has been published.
Try it out and let me know what you think ANY feed back is appreciated.

enjoy

RichardZ

#7

Thanks, I will try it out.

Ron

#8

@ANDY ROID
For my navigation project I'm using 5 ultrasonic sensors, 1 compass (10 DOF sensor
module), GPS and tied those to an Arduino Mega which is commanded via UART by
the EZ-B.

So far the project has been rather successful as it works and I'm continuously
improving and expanding it with extra features. However it's made to be used
outside, because of the GPS. However the obstacle avoidance and compass
navigation work everywhere.

I tried to log as much of my findings and decisions as I could in this thread.
I should update it soon with the latest improvements, however I hope it helps.

#9

Hello budeI0,

Thanks for adding your project information. The goal of this thread is to gather ideas from working and developing projects and share them to develop a robust system. This also allows a list of components which are known to work well, which helps eliminate false starts due to poor or inadequate components.

Ron

#10

I will be straight forward , navigation is the holy grail project for robotics. In a DIY world you need to focus your time on an achievable goal. Each environment can use a specific navigation method. Try to keep it simple. You only need two or three pieces of information to navigate a robot.

1. Relative position in a room or operating area

2. Orientation , aka North , South, East, West

3. Approximation to the nearest object or obstacles

If you simplify you needs down to these you can get some basic navigation, adding vision can smooth these out but vision is generally difficult to navigate by itself and needs these other pieces of information anyways.

Examples

Robot in the yard- in my yard I will have more than one robot that needs to come exist. So I need these robots not to collide , not leave the yard and also be able to drive back to the house and charge. I immediately thought of using RFID tags on top of spikes like a golf tee and stick them in the ground. A antenna then reads these as the robot passes over then and also reads a compass which tells it the directional orientation. Inside a home you could stick these tags under the carpet by slicing a tiny slit in the backing, sliding a RFID tag in and then stitching the backing back together.