Welcome to Synthiam!

Program robots using technologies created from industry experts. ARC is our free-to-use robot programming software that makes features like vision recognition, navigation and artificial intelligence easy.

Get Started
Asked — Edited

It's Not Perfect, But Here Is A Navigation Script. Comments Welcome.

#NavExplore Script
$exit = 0
Roomba(init)
Roomba(EnableSensors)
stop()
say("OK, Explore mode!")
goto(headcenter)
sleep(1500)


:Start

:testleftping
goto(headleft)

#Vertical
$lv = GetPing(d9, d8)
# If the ping sensor value is less
# than 20, found object
if ($lv < 20)
goto(objectfound)

#Horizontal
set(D19,5)
$lh = GetPing(d18, d17)
# If the ping sensor value is less
# than 20, object found
if ($lh < 20)
goto(objectfound)
RETURN()

:testcenterPing
goto(headcenter)

#CenterVertical
$cv = GetPing(d9, d8)
# If the ping sensor value is less
# than 20, object found
if ($cv < 20)
goto(objectfound)

#CenterHorizontal
set(D19,43)
$ch = GetPing(d18, d17)
# If the ping sensor value is less
# than 20,object found
if ($ch < 20)
goto(objectfound)
RETURN()

:testrightping
goto(headright)

#VerticalRight
$rv = GetPing(d9, d8)
# If the ping sensor value is less
# than 20,object found
if ($rv < 20)
goto(objectfound)

#HorizontalRight
set(D19,90)
$rh = GetPing(d18, d17)
# If the ping sensor value is less
# than 20, object found
if ($rh < 20)
goto(objectfound)
RETURN()

:RotateLeft
goto(headcenter)
left(255,750)
Return()

:RotateRight
goto(headcenter)
right(255,750)
Return()

:Reverse
goto(headcenter)
reverse(255,1000)
RETURN()


# If the exit value is 1, exit the script
if ($exit = 1)
goto(Exit)


# begin moving forward
Forward()
goto(start)

:headleft
set(D1,5)
RETURN()


:headcenter
set(D1,43)
RETURN()

:headright
set(d1,90)
RETURN()

:objectfound
stop()
say("Object Found!")
if ($lv < 20)
goto(RotateRight)
if ($lh < 20)
goto(RotateRight)
if ($rv < 20)
goto(RotateLeft)
if ($rh < 20)
goto(RotateLeft)
if ($ch < 20)
goto(Reverse)
if ($ch < 20)
goto(Reverse)
goto(Start)
RETURN()

:Exit
Stop()
Say("Received Command Stop")
Halt()

#1  
I do realize that I am testing everything twice. I haven't tried it yet.
#2  
the following is better:

#NavExplore Script
Roomba(init)
say("OK, Explore mode!")
:Start
stop()
goto(readleftping)
goto(readcenterping)
goto(readrightping)
goto(Start)

:readleftping
goto(headcenter)
goto(headleft)
sleep(1000)

#Vertical
$lv = GetPing(d9, d8)
goto(test)

#Horizontal
$lh = GetPing(d18, d17)
goto(test)
RETURN()

:readcenterPing
goto(headcenter)
sleep(1000)

#CenterVertical
$cv = GetPing(d9, d8)
goto(test)

#CenterHorizontal
$ch = GetPing(d18, d17)
goto(test)
RETURN()

:readrightping
goto(headcenter)
goto(headright)
sleep(1000)

#VerticalRight
$rv = GetPing(d9, d8)
goto(test)

#HorizontalRight
$rh = GetPing(d18, d17)
goto(test)
RETURN()

goto(start)


#Robot movement

:RotateLeft
goto(headcenter)
Left(255,750)
Return()


:RotateRight
goto(headcenter)
Right(255,750)
Return()


:Reverse
goto(headcenter)
reverse(255,1500)
RETURN()


:Forward
goto(headcenter)
# begin moving forward
Forward(255)
RETURN()


:headleft
SERVO(D19,54)
servo(D1,43)
Sleep(1500)
RETURN()



:headcenter
SERVO(D19,30)
servo(d1,60)
Sleep(1500)
RETURN()

:headright
SERVO(d1,75)
servo(d19,3)
SLEEP(1500)
RETURN()

:test
goto(headcenter)
if ($lv < 45)
goto(RotateRight)
if ($lh < 45)
goto(RotateRight)
if ($rv < 45)
goto(RotateLeft)
if ($rh < 45)
goto(RotateLeft)
if ($ch < 45)
goto(Reverse)
if ($ch < 45)
goto(Reverse)
goto(Forward)
RETURN()


But, I run into a problem when i test for less than 45. I need to ignore a value of zero because before it is tested it is either 255 or Zero.

What do you think?
#3  
Here is another version. Still haven't got it to do what I want. Simply avoid objects. I am sure that it is my rusty programming skills.

#NavExplore Script
Roomba(init)
say("OK, Explore mode!")
goto(headcenter)
stop()
sleep(1200)
:Start
goto(readleftping)
goto(readcenterping)
goto(readrightping)
goto(test)
goto(Start)

:readleftping
say("reading Left Ping.")
SERVO(D19,60)
sleep(1200)

#Vertical
$lv = GetPing(d9, d8)
#Horizontal
$lh = GetPing(d18, d17)
sleep(1200)
RETURN()

:readcenterPing
say("Reading Center Ping.")
sleep(1200)
SERVO(D19,30)
#CenterVertical
$cv = GetPing(d9, d8)
#CenterHorizontal
$ch = GetPing(d18, d17)
sleep(1200)
RETURN()

:readrightping
say("Reading Right Ping.")
servo(d19,3)
sleep(1200)
#VerticalRight
$rv = GetPing(d9, d8)
#HorizontalRight
$rh = GetPing(d18, d17)
sleep(1200)
RETURN()

goto(start)


#Robot movement

:RotateLeft
Left(255,750)
Return()


:RotateRight
Right(255,750)
Return()


:Reverse
reverse(255,1500)
RETURN()

:Forward
# begin moving forward
Forward(255)
sleep(1000)
RETURN()

:headleft
servo(D1,3)
RETURN()

:headcenter
servo(D1,60)
RETURN()

:headright
SERVO(d1,90)
RETURN()

:test
goto(testleft)
goto(testcenter)
goto(testright)
goto(Forward)
RETURN()

:testLeft
if ($lv < 45)
if ($lh < 45)
goto(RotateRight)
RETURN()

:testcenter
if ($ch < 45)
if ($cv < 45)
goto(Reverse)
RETURN()

:testright
if ($rv < 45)
if ($rh < 45)
goto(RotateLeft)
RETURN()

comments welcome
Australia
#4  
OMG - MovieMaker, pardon my ignorance but what are you trying to do with all this script, navigate around Mars ? lol *eyeroll* I'm just trying to get from the lounge to the kitchen and back..:D
United Kingdom
#5  
@Hazbot great comment lol:)

I was looking at this and I could load it into my Omnibot but wanted a few more details. I presume the head is the ultrasonic sensor and which way it is pointing? Are there any other sensors involved

Might help if it was loaded to the cloud project with notepad comments

I am re-building a house at present and the other day the builders laid the new concrete floor (we call it screed here). Then I realised too late I should of had a cable buried in the new floor that the robot could follow doh. That would have neatly solved the lounge to the kitchen and back problem although another way to do it would be to maintain a set distance from the wall with a ping sensor and follow that until reaching the desired location using the floor map (needs work and thinking about)
#6  
Hey Winston!

My script is not finished yet. I have completely written it about six times. I started off with two sharp IR sensors and two Ping units. The IR sensors worked very flakely, so I just went with the two Ultrasonic Ping units. When I was young, this would've only taken me an afternoon. But, I have spent about two weeks and I am still not there. The idea here, is that I have a stationary vertical PING unit to catch tabletops and such. And I have a horizontal scanning Unit. Here was my plan:

Start
scan the horizontal Left ping (lh)
then Horz center (ch)
then right (rh)
then vertical left ping (lv)
then center (cv)
then right (rv)

store these to the values:
lh,ch,rh,lv,cv,rv.

then test them all to see if the Ping was less than 45.
(It could be as low as 20)
But, I ran into a problem because when I am testing the Pings
and the pings have not PINGED, the value is ZERO.
So, I had to figure a way to make sure the value was not Zero AND
the value was less than 45.

I have not succeeded yet.

I just wanted to share my script in case it would get some creative
juices going with some of the members like you.

Usually, when I write a program, I just get something working. After
it is working, I try to trim it down. But in this case, it is not working yet.

Thanks for the reply.

Mel
Australia
#7  
Thanks winstn60, I was thinking along the same lines using ping with script but havn't tried it yet. DJ suggested a beacon but he didn;t elaborate on it, he gave the impression it could work. Another idea I had was to install a line following sensore and use a thin strip of tape but free range navigation is what I'm really after.:)