The Cybert
Project Log
March 7, 2001
Well, it's time for me to take a little break from Cybert, this website,
and robots in general. I've enjoyed working on my little robot pal, and it's been
fun to update this webpage with my discoveries, problems, and triumphs, but now I need to
spend my spare time doing something else for awhile. I haven't grown tired of
robotics, but I'll admit that I do get discouraged when I realize that all the hard work
has no long term payoff potential. I mean, I can't manufacture and sell
"Cyberts", I can't sell the program I've been writing, and I can't charge for
the website. (Wow, do I sound like a disgusting capitalist pig or what??
<grin>)
I guess the point I'm trying to make is that I just don't have
enough incentive to keep working on the hobby. It's still fun, but the programming
has gotten complicated and frustrating at times; the novelty has sort of worn off for my
wife and daughter; and not many people read this website. At times I think,
"Why bother?"
I'm an entertainer at heart with a lot of creative ideas bouncing
around in my head all the time. So I've decided to spend my spare time working on a
screenplay. This sounds like a lot of fun and there's always the possibility
that I'll actually sell the thing! That's pretty exciting.
Don't worry, I'll be back.
February 20, 2001
I had hoped to use one of the SoftVoice voices for Cybert (see my previous
log entry). Unfortunately, it proved too difficult to implement their API from
Visual Basic. So I took a few hours one evening and wrote a routine that randomly
varies the pitch of each word Cybert speaks! Sometimes, he puts emphasis on the
wrong word and this makes him sound a bit strange: "Please move out OF the way",
but most of the time it sounds great. The real advantage is that Cybert can repeat
the same line of text multiple times and it sounds a little different each utterance.
Further, I am now choosing different voices based on Cybert's
mood. Here are some examples:
Cybert's normal voice
This is how Cybert sounds when he is mad
This is Cybert's "playful"
personality
Cybert changes to this voice to read the
news
Sometimes Cybert gets really really
depressed
When Cybert is feeling secure he gets
an accent
I've also made great progress on Cybert's programming. Over
the weekend I added over a dozen new behaviors and several hundred lines of dialogue.
New behaviors include:
BOO: Cybert hides in the hallway and waits for someone to
walk near him. Then he charges forward and yells "BOO".
STRANGE MOOD: Cybert finds a human and says something strange like,
"Please don't microwave my pants."
EXPLORE: If Cybert is feeling Secure he will go exploring.
Sometimes he will sing an "exploring" song as he moves around.
FIND PEOPLE: If Cybert is feeling Insecure he will seek out people
using his light and sound sensors. If he's not sure if someone is in a room he will
ask, "Is anyone here?"
KNOCK KNOCK: Cybert will find people and tell a Knock Knock joke.
(He interprets any increase in ambient noise as an answer. i.e. "Dwayne
Who?")
PLAY DOGS: Cybert will call the dogs to come play. If he
senses movement he talks to them while moving forward and back. If he doesn't sense
movement he rotates until he "sees" something nearby.
The scary part is that I added all these behaviors and I haven't
tested any of them yet. Chances are, there will be a lot of bugs as the integration
of all the different behaviors is fairly complex. I'll provide details in my next
log entry. I'll also write up a description of my mapping algorithm if anyone is
interested.
February 7, 2001
I'm pretty pleased with the progress I've been making with Cybert, but
there are two areas that have been bothering me:
1. I'm using Probotic's Map-N-Zap software to make Cybert
navigate from room to room. This means that MnZ has to be running all the time, and
that my VB program must "virtually" select the app, move the cursor to the
location on the screen I want, and then "virtually" click the mouse button.
It works, but it's a major kludge and it isn't very reliable. (For example,
if I accidentally scroll the map the mouse will no longer be over a hotspot when the
button gets pushed.)
I'm thrilled to report that I am now using my VB program for
everything! I wrote a simple but effective pathing algorithm (in ONE NIGHT no less)
and it seems to work pretty well.
2. I'm very excited about Cybert's voice, moods, and the
potential to give my robot a lot of personality. BUT... I was watching Star Wars the
other night and it dawned on me that R2D2... with no voice... no face even... is
a lot more expressive and pet-like than Cybert. I think part of the problem is the
voice I'm using. I don't have a lot of control over inflections so, while the voice
doesn't sound completely artificial like the synthesizers of old, it also doesn't have any
character. It's monotone delivery is fine for business applications, but I need a
voice that people will think is...well... cute. I have been searching the
web for a low-cost alternative to Microsoft's speech API, that I'm using now. My
current evaluation list includes DecTalk,
and a program called SoftVoice, which claims to
offer over 20 user-selectable (and modifiable) voices.
I'll have more details on both of these areas soon...
January 25, 2001
One of my goals with Cybert has been to make him seem alive, and I've been
looking forward to the day when I could tell stories about things he has done. Well, I'm
pleased to announce that I now have not ONE but TWO stories to share with you!
NO-NONSENSE ROBOT
Earlier tonight I was working on some code to make Cybert avoid obstacles. The idea is
pretty simple, when he senses an object he is supposed to do the following:
- Stop
- Say "Please move"
- Wait a few seconds
- If the obstacle is still there --> plot a course around it.
- If the obstacle has moved --> Say "Thank you" and continue on.
To test the code, I sent Cybert home to dock with his charger and then put a
cardboard box right in his path. He saw the box and said in a loud voice (I need to turn
down his volume): "Please move". He looked left and right, but then he turned
forward again and repeated "Please move." I guess he was frustrated because,
without waiting, he just plowed into the box and knocked it halfway down the hall. As he
rolled past it he remarked (rather snidely it seemed to me) "Thank you."
Naturally, I had invited my wife to watch this exhibition by my
"smart" robot. She must have giggled the entire time I was finding and
fixing the bug.
CYBERT, THE FOUL-MOUTHED ROBOT
As I was writing code to make Cybert test for different events, I came to a blank
subroutine I had set up called "ReactToSound". I was a bit frustrated right then
so I just added the line: If CyeSoundSensor > 250 then Say "What the hell was
that?" This code was supposed to be just a temporary placeholder, so I set the volume
condition high enough that I didn't think it would ever "execute".
Then I forgot all about it.
Four hours later, as I was getting ready to go to bed, I decided to run one more
test of the "WakeupCall" behavior I had been working on. This time Cybert
performed flawlessly: he woke up at the correct time, plotted and followed a course to the
bedroom, announced the news and weather (I turned off his voice for this part, as my wife
and daughter were asleep), and then plotted a course home.
Unfortunately...
Cye robots "bump" walls to checkpoint their position. Well apparently,
this makes a pretty loud sound inside the robot, because every single time Cybert bumped
the wall he backed up and said LOUDLY, "What the hell was that?" I had to
scramble to shut him up so he wouldn't wake anyone.
January 24, 2001
I spent a week in California on business, but the night before I
left I managed to finish Cybert's hardware! I'll post pictures (and videos!)
sometime in the next week or so. He looks pretty good... from a distance. The
only way I could get the hamster ball to stick to the back of his head was with a quarter
pound of clear silicone glue. It's a pretty sloppy job, but you can't really tell
unless you're up close.
The day I got back from my trip I received the unfortunate
news that Probotics won't be releasing a new version of their .OCX. (It was supposed
to include some navigation commands.) I've spent the last several nights trying to
figure out some workarounds and it's been rather frustrating. I'll get there
eventually.
January 12, 2001
I've done a little programming, but I've spent most of my free
time working on Cybert's hardware... specifically, coming up with a good way to attach the
head to the body and to cover the electronics.
Cye robots come with a "hole" in the center of
the robot that is several inches deep. The optional wagon, vacuum cleaner, etc. come
with a post that slides snugly inside to make a physical connection. I figured this
post would also be a good way to mount the head.
I found, sorry to say, a toilet brush with a lid above the
brush handle, and this should work well for my needs. I snipped off the brush, cut a
hole in the bottom of the plastic lid, painted the thing black, and glued the head inside.
(It fits snugly.)
I added a screw to the top of the post and tomorrow I'll
drill a hole in the robot's head so the screw can poke out the top. Then I'll use a
nut to hold the head secure (hopefully). The last step will be to glue part of a
hamster ball to the back of the head. The ball includes a screw on lid so I should
be able to get inside the robot when I need to.
Not sure if I mentioned this, but I also cut a hole above
Cybert's mouth and mounted the light sensor there... almost like a nose.
I'm VERY anxious to post a video of Cybert in action, but I
want to get his look nailed down, and get him doing something interesting first!
January 1, 2001
If you're familiar with Cybert you already know that I am using
two FRS 2-way radios to give him a "voice". The radio in the robot is
working like a charm (though it is "on" 24 hours a day so I don't know how long
it will last), but I've had a devil of a time finding the right radio to attach to my PC.
The issue is that all these radios are battery powered and none offer AC adapters.
Since I plan to leave it on all the time, that's obviously an untenable situation.
I tried soldering a power adapter to the battery contacts
on one radio, but this produced a HORRIBLE humming sound that I was never able to
eliminate. I bought another radio with AC in, only to discover that the input is
also used for the microphone. (I need two inputs.)
Then I bought a Radio Shack model (twice the price of other
models I've seen) that had a rechargeable battery connector -- but the manual says you
shouldn't leave it plugged in for more than 15 hours at a time or it could be a fire
hazard. Also, I wasn't sure that the charger would be fast enough to keep the
batteries powered since I wanted to leave the robot in continuous "transmit
mode".
Today, while not even thinking about robots (yes,
sometimes I have a life) I wandered past an FRS radio BASE STATION for sale. It's designed
to be permanently connected to AC power! At $60.00 it was a little pricey but I'm
happy with the purchase. As a bonus, the radio has a VOX mode so I don't have to be
transmitting 24 hours a day. (Unfortunately, there is a second delay before the VOX
kicks the radio to transmit mode. My kludge is to make the robot say
"delay" and then pause for .7 seconds before it says anything else. This
seems to work pretty well.)
Base Station URL: www.un-wired.com
Just a quick update on my navigation experiments: my
VB program can now successfully plot a course from anywhere to anywhere else. It
will also convert the robot's coordinates to the new coordinates, and vica versa.
Unfortunately, getting Cybert to actually follow the course I created turned out to be
harder than I thought. The "MoveTo" command in the .OCX doesn't work well
at all. This probably has something to do with the handlelength (I won't bore anyone
with the details) but even set to 0 the robot wanders around like a drunken sailor even
when trying to navigate to a spot only a few feet away. I'm not sure what the
problem is -- I suspect the .OCX is trying to get the robot to the exact x,y location and
sometimes it "misses" and has to go back for another try... or two.
I could break down the course into 2" inch path
segments and use the built-in path commands (which is what Probotics recommends), but I've
pretty much decided that the extra effort isn't worth my time right now. Handling
navigation myself would be nice, but the code is sort of hard to debug and there is no way
(currently) for the robot to verify his position; so there is still a lot of work left to
do, even though the basics are working. I'd rather spend my time on other code right
now. (I might be able to use the navigation code when I want Cybert to get around an
obstacle.)
Fortunately, while working on the navigation code, I
figured out a workaround for the problem that prevented me from using MZ for navigation
(when my VB program was running MZ couldn't establish contact with the robot). Last
night I discovered that if I turn off communications with the robot by setting the
RobotAddress to 0, MZ starts up just fine. After a delay I set the address back to 1
and everything works great!
Now it will be easy to make the robot go anywhere in the
house! I just need to create .ZAP files for everywhere I might want the robot to go,
then tell my VB program to run them. (When MZ runs the .ZAP file it calculates a
course from wherever the robot currently is to the destination, then makes the robot
follow the calculated course.)
December 30, 2000
About a month ago, Henry Thorne at Probotics promised a new
version of the Map-N-Zap software that is better integrated with the .OCX. This
should provide some powerful new commands, such as a method to automatically navigate to
hotspots. He indicated that it would be ready sometime in early 2001.
But I'm not sure I want to wait that long; plus, it still
won't include commands to interface with the range-finding sensor I added.
So... I'm about halfway through the implementation of
my own navigation routines in VB. I'm basing my code on an occupancy/cost scheme
detailed by Tucker Balch at this site: TeamBots.
(Look at the GridNav code and .pdf article.)
Gary Livick describes his implementation in this article: DocBot2.
Unfortunately, it takes his HC11 processor over three and half MINUTES every time he plans
a route. (My PIII processor takes less than a second to calculate a slightly larger
map. Three cheers for radio modems!!!)
I have converted my upstairs map (the one I created using
Map-N-Zap) to a text file that my VB program can use. The code seems to be
calculating a proper route from the robot to the goal, but I haven't tried to get Cye to
follow the route yet. I'm worried that this will either be very difficult, or else
the robot will not move as smoothly as when I'm using the Map-N-Zap software. (My
grid units are roughly 12 inches by 12 inches.)
More details coming soon.
December 19, 2000
A number of people have asked me about Cybert's ability to provide
up-to-the-minute information, and to check our e-mail. I'm currently using a clever
(and FREE) Microsoft Agent program called CyberBuddy.
Coincidentally, the animated computer character does almost EVERYTHING I wanted to
be able to do with Cybert! (He tells jokes, reads the news, updates users on the
weather, gives stock reports, and more.) Unfortunately, I don't have enough control
over WHEN CyberBuddy speaks, so I've found some other options:
NetStepper
The NetStepper shareware program ($49.95) is a powerful Internet parsing program that
allows you to do things like:
1. Create a
text file with news headlines from Yahoo.
2. Compare book prices between
Amazon and Barnes & Noble.
3. Retrieve stock quotes from 3
different sources.
I plan to use the program to access news, weather, and other sites
so Cybert will always have interesting and informative things to say!
Best of all, you can use command line input so it can run automatically from VB, or using
the Task Scheduler. This should work well as I can call the program using command
line variables at any time.
CsMail
This shareware ActiveX control runs with VB 5.0 and includes lots of simple commands to
read and manipulate e-mail. The single user license is only $20.00.
December 18, 2000
I've had a little bit of time to work on Cybert, but I haven't
really accomplished much. The radio I use for the robot's text-to-speech
transmission is still running off batteries (none of the 2-way radios have AC adapters),
so I bought a standard power adapter and soldered it to the battery compartment. I
thought I could solder the adapter wires to any of the +/- connectors but you apparently
have to find the "main" connectors or it won't work. I took the radio
apart and discovered that the main connectors were both on the top.
Unfortunately, the 300mA adapter I bought didn't have
enough amperage to drive the radio in transmit mode, so I had to buy ANOTHER adapter.
When I finally got it soldered in and everything was working I was greatly dismayed
to learn that Cybert now "hums" so loudly it's impossible to hear him speak.
Apparently, there are no filters on the power adapters. <sigh>
I'll probably buy a radio that has rechargeable batteries and just leave it charging all
the time. Not sure if that will work or not but I'll give it a try.
December 11, 2000
Our new puppies aren't completely housetrained yet and their
favorite place to drop "midnight goodies" is right outside the doorway to the
spare bedroom which houses Cybert's home base. Cye robots have no ground clearance they
have the unfortunate tendency to SMEAR midnight goodies down the hall and wherever the
robot moves.
This morning I came up with a great solution to this problem! Thanks to the power of
Probotic's ZAP tool it took me about 10 minutes to create a little program called
"Poop Patrol". Here's what it does: After I've gone to bed, Cybert moves into
the doorway and turns on his range-finding sensor. If something comes within 3 feet of him
he shouts: "No! Go outside to go potty!" Then he quickly moves back and forth,
like he's angry. (I may even have him chase the dogs down the hallway and then come back.)
This may not convince the puppies to actually go outside, but it should
prevent them from making a mess in front of the door.
December 1, 2000
Thanks to a free program called "CyberBuddy" Cybert can now deliver
up-to-the-minute news, weather, stock market information, jokes, and he can even tell us
when there is new e-mail! I consider this a temporary solution, however, because I'd
like to have a bit more control over things.
November 13, 2000
Cybert is almost finished!!! Once again, my buddy Chris Hostetler
went above and beyond the call of duty to help me out. I arrived at Chris's
apartment at 1:00 PM, and didn't get home until almost 10:00 PM! What a guy!
Chris added a photoelectric light sensor and a Sharp GP2D12 IR
range-finding sensor to Cybert's external port. The robot only has one input line,
so Chris installed a relay that allows me to switch between the two sensors. Next,
he took my 2-way radio apart and wired it to Cye's 5V line.
Then, he helped me take a plastic head from one of my daughter's
old games and shape it to house all the electronics. The radio speaker was cut and
trimmed until it fit neatly inside the mouth area. The range-finding sensor was
installed at the base of the mouth, and the light sensor was set up behind the eyes.
The head is temporarily mounted on the robot body until we can
figure out something more permanent; and the back is exposed until we can think of a good
way to cover it. (Chris is thinking about a piece of black plastic cut to the proper
size.)
Chris took some pictures of Cybert with his digital camera and gave
me permission to include them on my website. Check out the Cybert Gallery.
November 11, 2000
Tomorrow, my electronics genius friend, Chris Hostetler, is going to help
me give Cybert a 2-way radio (his voice), a light sensor, and an IR range-finding sensor
(the Sharp GP2D12).
I've also found a plastic head that is almost the same color as Cybert's rubber
bumper. I may use it to cover the new electronics, and to give Cybert more
personality. Hopefully, we won't run into any snags tomorrow -- I'm very excited by
the prospect of coming home with a robot that is essentially just waiting to be
programmed. (I've been waiting for this day for TWO YEARS!)
I'll bring my camera and post images tomorrow night or Monday.
November 9, 2000
Most of Cybert's programming will be written in Visual Basic, but I'd like
to use Probotic's Map-N-Zap software to handle mapping, and then path finding and
execution. (One of the architects of this software, Parag Batavia, has information
and an article about Cybert's software, here.)
Unfortunately, VB doesn't currently have access to the necessary
features in MZ to make this goal a reality. Probotics is actively working on this
code but it probably won't be ready until January or later. In the meantime, I've
discovered a creative "workaround".
The solution actually solved a problem I was having last night: I bought
a couple of 2-way radios and I had Cybert "talking", but his speech was
sometimes triggering the "handclap" response so I had to go into
"Settings" and turn this feature of Map-N-Zap off. Earlier tonight I wrote
a VB subroutine called "ClickClap" that activates MZ and toggles the
"Enable Clapping" option on or off. (The default will be "off".) This
subroutine will enable me to do the following:
1) When I want Cybert to go to a hotspot I'll simply turn on clapping, and then make
him "beep" the correct number of times to correspond to the hotspot I want! Then
I'll turn clapping off again. (NOTE: Every hotspot on the map can be associated with
"X" handclaps. Users of MZ simply clap "X" times to make their
Cyes go wherever they want!)
2) I can also use this new feature -- along with Cybert's voice -- to hold interactive
conversations. The robot will turn on clapping when he needs to "listen",
and then turn it off again before he speaks. A conversation might go like this:
(1 clap = yes, 2 claps = no)
Cybert rolls into the upstairs den.
CYBERT: Is there a human in this room?
Me: CLAP
Cybert: I have an e-mail for John. Are you John?
Me: CLAP
Cybert: Would you like me to read your e-mail to you?
Me: CLAP CLAP
Cybert: Okay, maybe later. My battery is getting low; I'll be charging at my home base
if you need me.
(He pauses for a few seconds to see if the human needs anything else.)
Me: CLAP
Cybert then leaves the room and heads down the hall to the spare bedroom to dock with
his charging station.
November 8, 2000
I called my electronics genius friend, Chris Hostetler, and begged him to
help me work on Cybert this weekend. We're going to try to get together on Sunday,
unless something comes up.
In an e-mail before our phone call Chris had a great idea! He
said that we could add a relay to Cybert's output port and use that to switch sensors on
the input port. When the output port is "off" the input sensor will read
the IR sensor. When the port is "on" the input port could read a light
meter! Two sensors for the price of one!
I'm planning to use the Sharp GPD212 IR sensor for
range-finding. One potential issue, though, is that Cybert only has two wheels and
thus tends to rock when he is moving. If the sensor is looking straight ahead and
the robot suddenly slows and rocks forward, the sensor is going to point down at the
carpet. This could easily be misinterpreted as an obstacle in the robot's path.
My current idea is to only read the IR sensor when the robot is not accelerating or
decelerating. I'm debating whether it should be mounted down low, or up high.
November 4, 2000
I originally planned to start working on Cybert in January of this year,
but work and other factors caused me to postpone the project. Now that winter is
here, and I have changed jobs, I should have a bit more time to work on Cybert. I
can't wait to get started!
Last night I used Cybert to completely map out the upstairs:

Cybert's map of navigable areas on our second floor.
Tonight I will start working with some of the commands in the
Cyecom.ocx. I'm particularly interested in the microphone Cybert uses to respond to
handclaps. I hope that I can poll this microphone to get a general volume level for
any room Cybert is in. It's possible that the microphone event is only triggered by
what it thinks is a handclap so I'll just have to experiment.
I tried working with a few of the .ocx commands last night, and I
was confused by the MoveTo command. You should be able to send x,y coordinates to
the robot (relative to the homebase) but it didn't seem to move all the way to where I
wanted Cybert to go. I'll have to try some things tonight.
The Cybert robot platform has an IO port that should allow me to
connect a range-finding sensor and a personal radio. I'll use the personal radio to
broadcast text-to-speech audio data from my PC to Cybert. This isn't the optimal
solution but it's the best I can do for now. I'll need some help setting these
things up, so I'm hoping that my old robot buddy Chris Hostetler contacts me soon so I can
pick his brain a bit... |