D.cochran's Teddy

CochranRobotics

USA
robot video thumbnail
robot video thumbnail
robot video thumbnail
robot video thumbnail
robot video thumbnail
robot video thumbnail

I am going to try to document this project because I think its pretty cool so far. It is also the beginning of a much larger project.

For the hardware right now, I am using a Teddy Ruxpin bought on ebay EZB V4 V4 Camera 2 rotational HD servos for shoulders 1 Rotational servo for neck 1 micro servo for mouth amplified speaker (used for phones) Scary Terry Audio servo Driver Board

For software EZ-Builder MSSQL EZ-DBMulti rssGetter RoboRealm

Project Description I wanted to design a robot for my grandchildren but also use this as a platform to test some things that I want to do with my InMoov project. The robot needs to be able to identify the user and then customize itself to what that user would use/need. For example, if I was using the robot, I want the robot to be able to read me the traffic, weather and news from RSS Feeds. If my granddaughter is using the robot, I want it to be able to tell nursery rhymes and sing songs that are for her age level. Because my granddaughter is a primary focus for this robot, I wanted the jaw to move reliably when the robot is speaking.

ROBOREALM CONFIGURATION To accomplish this, I had to have a way to identify which user is using the robot. RoboRealm has the ability to recognize faces and to be able to pass variables back to ARC. It also has the ability to use a feed from an http server for its camera source.

To make RoboRealm work, I added three modules to it. These are ReadHTTP, AVM Navigator and EZRobot_Variables. ReadHTTP is configured to access http://127.0.0.1:8010/CameraImage.jpg?c=Camera. I will get to the configuration of the webserver within ARC in a few moments. AVM Navigator is setup in Object Recognition mode with my face (and the other members of my family's face) trained. EZRobot_Variables is configured to pass the NV_ARR_OBJ_NAME variable back to ARC on host 127.0.0.1 port 6666 with a prefix of RR_.

EZ-BUILDER HTTP Custom Server The HTTP Custom Server is configured to run on TCP Port 8010. This is because I am already using 80 and 8080 for other development projects.

EZ-BUILDER Startup script


$rsstext = ""
$rssLocation = ""
$feedDescription = ""
ControlCommand("HTTP Custom Server", StartServer)
Sleep(2000)
ControlCommand("Script Manager", ScriptStop, "Monitor")
ControlCommand("Script Manager", ScriptStart, "Monitor")
ControlCommand("Sound Servo", PauseOn)
Exec("c:\RoboRealm\RoboRealm.bat")
ControlCommand("Script Manager", ScriptStart, "WhoAmI")
Sleep(5000)
ControlCommand("Script Manager", ScriptStart, "GetDatabaseInfo")

This script prepares a couple of variables for later use, then starts the HTTP Custom Server so that RoboRealm can use the V4 camera feed through the HTTP Custom Server. It then starts a monitor script and then pauses the Sound servo control. It then launches RoboRealm and runs a WhoAmI script before going to the database server to retrieve information for the user that is using the robot.

MONITOR SCRIPT


:MonitorFunction
$connected = IsConnected( 0 )
if($connected = 0)
  ControlCommand("Script Manager", ScriptStart, "CheckConnection")
endif
$CPUTemp = GetCPUTemp()
if($CPUTemp > 30)
   ControlCommand("Sound Servo", PauseOn)
   sayezb("The temp of the process has exceeded safe parameters")
endif
$CurrentVoltage = GetVoltage()
if ($CurrentVoltage < 6.6)
   ControlCommand("Sound Servo", PauseOn)
   sayezb("You will have to charge me soon")
endif
sleep(5000)
Goto(MonitorFunction)

This script first checks to see if there is a connection to the EZ-B on the robot. If one doesn't exist, it then runs a script called CheckConnection. It then checks the temp of the CPU in the robot and warns if there appears to be a pending issue. It then checks the voltage of the battery and warns the user if they will need to charge the battery soon. It then waits 5 seconds and the loops to the start of the script again. This monitor keeps running while ARC is connected to the robot.

CHECKCONNECTION


$connected = IsConnected( 0 )
REPEATUNTIL($connected = 1)
  If($connected = 0)
    $Connection=0
  Else
    $Connection = 1
  EndIf
 if($connection = 0)
   ControlCommand("Connection", Connect0)
   sleep(3000)
   $connected = IsConnected( 0 )
 endif
EndRepeatUntil 

This script is called by the monitor script and first checks to see if the connection is made to the robot. If there is not a connection, it tries to establish the connection and waits 3 seconds for the connection to be established. If it isn't established, the script tries again.

ROBOREALM.BAT


D:
CD\Program Files (x86)\RoboRealm
RoboRealm

This just simply executes the RoboRealm application.

WhoAmI


SayEZB("Let me have a good look at you.")
controlcommand("Script Manager", scriptStart, "GreetuserRich")

This is a very simple script that just says "Let me have a good look at you." and then launches the GreetUserRich. This could be combined with the GreetUserRich script and this one could be eliminated completely.

GREETUSERRICH


$user0 = "null"
IF ( $RR_NV_ARR_OBJ_NAME[0] != "" )
    $user0 = $RR_NV_ARR_OBJ_NAME[0]
    SayEZB("You are " + $user0 + ".  It is great to see you!")
EndIf

This script was greatly reduced from what I had before. RoboRealm is very fast and very good at facial recognition. Because of this, I was able to reduce the amount of code here for checking things. If it becomes unreliable with many faces learned in RoboRealm, I will start adding in more checking. When RoboRealm is called, and a face is recognized from the HTTP camera feed from EZ-Robot, the $RR_NV_ARR_OBJ_NAME[0] is passed back to ARC as a variable. This script takes the value of this variable and assigns it to $User0 and then says "You are [the persons name]. It is great to see you!"

GETDATABASEINFO


#Starting variables for EZ-DB
$UserName = ""
$UserName = $user0
$SqlReturn = " "
$SqlCommand = ""
$FatherName = ""
$MotherName = ""
$GrandmaName = ""
$GrandpaName = ""
$NumberOfVariablesToStore = 2
$RobotName = "Teddy"
$RobotID = ""
ControlCommand("Script Manager", ScriptStart, "GetRobotIDFromDatabase")
Sleep(1000)
ControlCommand("Script Manager", ScriptStart, "GetGrandpaFromDB")
Sleep(1000)
ControlCommand("Script Manager", ScriptStart, "GetGrandmaFromDB")
Sleep(1000)
ControlCommand("Script Manager", ScriptStart, "GetFatherFromDB")
Sleep(1000)
ControlCommand("Script Manager", ScriptStart, "GetMotherFromDB")
Sleep(1000)

A lot of variables are initialized here, and the $user0 variable value is then assigned to $UserName. The $RobotName variable is also set. This script then calls 5 other scripts that are all similar. All of these connect to a database through EZ-DBMulti to pull specific data back with 4 of them pulling back specific data about the current user based on the facial recognition that has taken place.

GETROBOTIDFROMDATABASE


$SqlCommand = "EXEC usp_GetRobotIDFromName '"+$RobotName+"'"

FileWrite("C:\EZ-DBMulti\Query.txt",$SqlCommand)
FileWrite("C:\EZ-DBMulti\Robot.txt",$RobotName)

EXEC("C:\EZ-DBMulti\EZ-DBMulti.exe", "In")
Sleep(1000)
$RobotID = $SQLReturn

This script prepares a sql command which executes a stored procedure on a MSSQL database called usp_GetRobotIDFromName and passes in the $RobotName variable value into the stored procedure as a parameter. It stores this information in 2 files. The first of these is called Query.Text (containing the command that is going to execute. The second is called Robot and contains the $RobotName value (really not used by this stored procedure, but EZ-DBMulti's database houses information for multiple robots.) It then calls EZ-DBMulti passing in whether EZ-DBMulti is supposed to retrieve data from the database (In) or pass data to be stored in the database (Out). After the query executes, the result from the execution of the stored procedure in the database is stored in the $SQLReturn variable in ARC so I then assign the $RobotID variable value to the value of the $SQLReturn variable.

SQL Server usp_GetRobotIDFromName


USE [robot]
GO
/****** Object:  StoredProcedure [dbo].[usp_GetRobotIDFromName]    Script Date: 1/26/2015 8:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		David Cochran
-- Create date: 01/25/2015
-- Description:	Get Robot ID from its name
-- =============================================
ALTER PROCEDURE [dbo].[usp_GetRobotIDFromName] 
	-- Add the parameters for the stored procedure here
	(@RobotName VARCHAR(50))
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    SELECT 
		RobotID
	FROM
		Robots
	WHERE 
		RobotName = @RobotName
END

This one is really unspectatular, but I wanted to show what the USP is doing. It simply is looking into the Robots table, and is returning the RobotID where the RobotName matches the $RobotName variable value from ARC (it was passed in when the USP was called through EZ-DBMulti.)

SQL SERVER USP_GRANDPADATA


USE [robot]
GO
/****** Object:  StoredProcedure [dbo].[usp_GrandpaData]    Script Date: 1/26/2015 8:03:57 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		David Cochran
-- Create date: 01/25/2014
-- Description:	Returns Grandfathers data for a named user
-- =============================================
ALTER PROCEDURE [dbo].[usp_GrandpaData]
	(@username Varchar(50))
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	SELECT 
		GParentDetails.[UserFamilyName]
	FROM
		[dbo].[Users]
		INNER JOIN [dbo].[UserInfo] ON [dbo].[Users].UserID = UserInfo.UserID
		INNER JOIN [dbo].[FamilyTree] ON [dbo].[Users].UserID = [dbo].[FamilyTree].[UserID]
		INNER JOIN [dbo].[Family] ON [dbo].[FamilyTree].[FamilyID] = [dbo].[Family].[FamilyID]
		INNER JOIN [dbo].[FamilyTree] as Parents on 
			[dbo].[FamilyTree].[FamilyID] = Parents.FamilyID 
			AND FamilyTree.Parent = Parents.UserID
		INNER JOIN [dbo].[FamilyTree] as GParents on 
			[dbo].[FamilyTree].[FamilyID] = GParents.FamilyID 
			AND Parents.Parent = GParents.UserID
		INNER JOIN dbo.Users as GParentDetails ON 
			GParents.UserID = GParentDetails.UserID
		INNER JOIN dbo.UserInfo AS GParentDetail ON
			GParents.UserID = GParentDetail.UserID 
			AND GParentDetail.Gender = 'M'		
	WHERE dbo.Users.Username = @username
	Group By
		GParentDetails.[UserFamilyName]
END

This USP is a bit more complex. Gets the UserFamilyName for the male grandparent of the user. The joins are used to map the relationship from the user up to the parent and then the grandparent of the user.

SQL SERVER USP_GETMOTHERDATA


USE [robot]
GO
/****** Object:  StoredProcedure [dbo].[usp_MotherData]    Script Date: 1/26/2015 8:07:11 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		David Cochran
-- Create date: 01/25/2014
-- Description:	Returns Mother data for a named user
-- =============================================
ALTER PROCEDURE [dbo].[usp_MotherData]
	(@username Varchar(50))
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
		SELECT 
		CASE when DATEDIFF(YYYY,[dbo].[UserInfo].[Birthday],GETDATE()) < 6
		THEN
			ParentDetails.[UserFamilyName]
		ELSE
			ParentDetails.[UserName]
		END AS ParentName
	FROM
		[dbo].[Users]
		INNER JOIN [dbo].[UserInfo] ON [dbo].[Users].UserID = UserInfo.UserID
		INNER JOIN [dbo].[FamilyTree] ON [dbo].[Users].UserID = [dbo].[FamilyTree].[UserID]
		INNER JOIN [dbo].[Family] ON [dbo].[FamilyTree].[FamilyID] = [dbo].[Family].[FamilyID]
		INNER JOIN [dbo].[FamilyTree] as Parents on 
			[dbo].[FamilyTree].[FamilyID] = Parents.FamilyID 
			AND FamilyTree.Parent = Parents.UserID
		INNER JOIN dbo.Users as ParentDetails ON 
			Parents.UserID = ParentDetails.UserID
		INNER JOIN dbo.UserInfo AS ParentDetail ON
			Parents.UserID = ParentDetail.UserID 
			AND ParentDetail.Gender = 'F'		
	WHERE dbo.Users.Username = @username

END

This one is similar to the previous one in that it identifies the female parent of the current user. It also uses a CASE statement that checks to see what the age of the current user is. If the current user is less than 6 years old, it returns a family name (such as Mommy) for this parent. If the user is older than 6, it grabs the username for the mother. This can be extended much further than I currently have, but currently, when the user of this robot reaches age 6, the value returned changes and the robot automatically changes because of the change in age of the user.

I will be adding additional things like getting the birthday of the user or anniversary, or holidays such as Christmas, Easter and many more so that different phrases can be said based on the age of the user and the day of the year. I also plan to add things like the last time that something happened (for example a nursery rhyme was said) for a user and limit the robots activity based on this. It could be a song was played, or news was read, or whatever. I might also have a game for my granddaughter and knowing what questions were asked last time or previously, I could then ask other questions that were not asked yet or have been asked less frequently. Anyway, I will be posting the project file on the cloud if anyone wants to use anything that I have done.

There is more in there, I am just worn out on typing this right now. I will probably add more and a video later, but I wanted to start documenting. If you are still reading this and have any questions, please let me know.

By — Last update

ARC Pro

Upgrade to ARC Pro

Get access to the latest features and updates before they're released. You'll have everything that's needed to unleash your robot's potential!

PRO
Belgium
#17  

d.cohran

cant see the video.

PRO
Belgium
#20  

thanks d.cohran

aldo i dont understand any off this.i like seeing these video's. its stunning what people can do.

#21  

This is my "BrainFunctions" script currently. This is an attempt to do what many programmers do with business applications. The front end or user interface of an application is normally very light. The processing of data happens at the database and there is normally an layer between the front end and the data. That layer is a bit more difficult but could be built using the SDK. Right now, both the front end and the data layer handle this logic. I try to push as much of it to the data layer as possible.

This script handles the logic as to what to do with the information that is retrieved from the database. The database handles what to feed to the front end and when it can be fed. This script just checks every minute to see what the database is going to feed to it and then handles what it receives back.

This script doesn't know the details for most things on what to do with a specific recieved request, but looks at what is being passed back and passes this off to other scripts based on what it gets back from the Database layer.

BRAINFUNCTIONS


:Beginning
$UserActivity = ""
$SQLResult = ""
$SQLReturn = ""
#Identify next thing to tell the user from the database based on 
#who is using the robot and what has been told to the user within timmers
ControlCommand("Script Manager", ScriptStart, "GetUserActivityFromDB")
SLEEP(2000)
#Based on what came back from the database call one of the following or say that there is nothing new for them at this time.

#Holiday
IF($SQLReturn = "Check Dates")
  Sleep(2000)
  ControlCommand("Script Manager", ScriptStart, "GetPersonalHolidayFromDB")
  SLEEP(2000)
  IF(LENGTH($SQLReturn) > 0)
    SayEZB("Today is your " + $SQLReturn + ".") 
  ENDIF
  SLEEP(2000)
  ControlCommand("Script Manager", ScriptStart, "GetHolidayFromDB")
  SLEEP(2000)
  IF(LENGTH($SQLReturn) > 0)
    SayEZB("Today is  " + $SQLReturn + ".") 
  Endif
  ControlCommand("Script Manager", ScriptStart, "LogEvent")

ELSEIF($SQLReturn = "Reminders")
  SayEZBWait("Add code for reminders like Rhymes")
  ControlCommand("Script Manager", ScriptStart, "LogEvent")
#Run the reminder query
#Say the information provided from the query
#Log Reminders event if called
ELSEIF($SQLReturn = "News")
  ControlCommand("Script Manager", ScriptStart, "ReadNews")
  ControlCommand("Script Manager", ScriptStart, "LogEvent")
ELSEIF($SQLReturn = "Weather")
  #SayEZB("Here I would read the weather")
  ControlCommand("Script Manager", ScriptStart, "ReadWeather")
  Sleep(2000)
  ControlCommand("Script Manager", ScriptStart, "LogEvent")
ELSEIF($SQLReturn = "Traffic")
  ControlCommand("Script Manager", ScriptStart, "ReadTraffic")
  ControlCommand("Script Manager", ScriptStart, "LogEvent")
ELSEIF($SQLReturn = "Timers")
  SAYEZB($UserActivity + " Checked every minute.")
  ControlCommand("Script Manager", ScriptStart, "LogEvent")
#Timers
#Get Timers from the database
#Speak the next timer
#Log Timers event if called

#Rhymes
#Move rhymes to database and use it to track which rhyme has been sent and when
ELSE
  SAYEZBWAIT($SQLReturn)
ENDIF
Sleep (60000)


When news is requested, the BRAINFUNCTIONS script runs this script which sets some parameters that are specific for news and then calls the readRSS script. There are multiple RSS feads so, writing the readRSS script one time and calling it from scripts like this allows the readRSS script to be written and tested and once known to be good, it doesnt need to be messed with again and will work with any of the RSS feeds in this manner.


$feedDescription = "News"
$rssLocation = "http://feeds.skynews.com/feeds/rss/uk.xml"
ControlCommand("Script Manager", ScriptStart, "readRSS")

This is the ReadRSS script.


#Run the app to get the poem
ControlCommand("Sound Servo", PauseOff)
Exec("c:\rssfeeds\rssGetter.exe", $rssLocation)
$sent = "Retrieving the "+ $feedDescription + " feed for you sir."
sayEZBWait($sent)

$rsstext = filereadline("C:\rssfeeds\rssfeed.txt")
#Read the News
  sayEZBWait($rsstext)
#close the file that was read
filereadclose("C:\rssfeeds\rssfeed.txt")
#Delete the text and prepare for the next one
filedelete("C:\rssfeeds\rssfeed.txt")
#dump memory
$rsstext = ""
$rssLocation = ""
$feedDescription = ""
ControlCommand("Sound Servo", PauseON)
Servo(d1,130)

This is the LogEvent script


$SqlCommand = "EXEC usp_UpdateActivityLog '"+$UserName+"', '"+$UserActivity+"', "+$RobotID

FileWrite("C:\EZ-DBMulti\Query.txt",$SqlCommand)
FileWrite("C:\EZ-DBMulti\Robot.txt",$RobotName)

EXEC("C:\EZ-DBMulti\EZ-DBMulti.exe", "In")
Sleep(1000)

The need for the in and out parameter for EZ-DBMulti is becoming less needed and may be removed soon. If you call a stored proc in the database, you dont need to specify if the data is coming in or going out of ARC. Anyway, this is the script that calls EZ-DBMulti to log the event in the activitylog table.

USP_UPDATEACTIVITYLOG


USE [robot]
GO
/****** Object:  StoredProcedure [dbo].[usp_UpdateActivityLog]    Script Date: 1/29/2015 8:17:51 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		David Cochran
-- Create date: 01/28/2025
-- Description:	Logs the activity that has just been performed by the user and robot
-- test syntax usp_UpdateActivityLog 'David','Reminders', 1
-- =============================================
ALTER PROCEDURE [dbo].[usp_UpdateActivityLog]
	-- Add the parameters for the stored procedure here
	(
		@username VARCHAR(50),
		@activity VARCHAR(50),
		@robotID int
	)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    DECLARE @RecordFound int
	SET @RecordFound = 0
	DECLARE @UserID INT
	DECLARE @ActivityID INT 

	SET @RobotID = 1 

	SET @UserID = (SELECT [dbo].[Users].[UserID] FROM [dbo].[Users] WHERE [dbo].[Users].[UserName] = @username)

	SET @RecordFound = (
	SELECT 
		ActivityLog.ActivityID
	FROM
		[dbo].[ActivityLog] 
		INNER JOIN
		[dbo].[Activity] ON [dbo].[ActivityLog].ActivityID = [dbo].[Activity].ID
	WHERE
		[Activity] = @Activity
		AND [dbo].[ActivityLog].[UserID] = @UserID)

	IF @RecordFound > 0
		BEGIN
			UPDATE 
				ActivityLog
			SET 
				ActivityDateTime = GETDATE()
			WHERE
				ActivityID = @RecordFound
				AND
				UserID = @UserID
		END

	ELSE

		BEGIN
			SET @ActivityID = (SELECT ID FROM Activity WHERE Activity = @Activity)

			INSERT INTO 
				[dbo].[ActivityLog]
			(
				[UserID],
				[RobotID],
				[ActivityID],
				[ActivityDateTime] )
			VALUES
			(
				@userID,
				@RobotID,
				@ActivityID,
				GETDATE()
			)

	END


END

This is the stored procedure in the database that updates the activity log. It checks to see if an entry for that activity already exists in the activitylog table and updates it if it does exist. If the activity doesn't exist, it inserts a new log entry to log that activity.

USP_GETNEXTACTIVITY


USE [robot]
GO
/****** Object:  StoredProcedure [dbo].[usp_GetNextActivity]    Script Date: 1/29/2015 8:20:49 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		David Cochran
-- Create date: 01/28/2015
-- Description:	Gets an activity that hasnt been performed yet by the robot for the age group and activity time period for the user.
-- [usp_GetNextActivity] 'David'
-- =============================================
ALTER PROCEDURE [dbo].[usp_GetNextActivity] 
	(@username VARCHAR(50))
AS
BEGIN
	
	SET NOCOUNT ON;
	DECLARE @activity varchar(50)

    SET @activity = (SELECT TOP(1)
		[Activity]
	FROM
		[dbo].[Users]
			INNER JOIN 
				[dbo].[UserInfo] ON [dbo].[Users].[UserID] = [dbo].[UserInfo].[UserID]
			LEFT JOIN
				[dbo].[Activity] ON DATEDIFF(YEAR,[dbo].[UserInfo].Birthday,GETDATE()) < [dbo].[Activity].[AgeStop] AND DATEDIFF(YEAR,[dbo].[UserInfo].Birthday,GETDATE()) > [dbo].[Activity].[AgeStart]
			LEFT JOIN
				[dbo].[ActivityLog] ON [Activity].[ID] = [dbo].[ActivityLog].[ActivityID]
	WHERE
		[dbo].[Users].[UserName] = @username
		AND 
		(DATEDIFF(Minute,ActivityLog.ActivityDateTime,GETDATE()) > [dbo].[Activity].[ActivityPeriod]
		OR 
		ActivityLog.ActivityDateTime IS NULL))

	IF @activity = 'Rhymes'
	BEGIN
		
		DECLARE @UserID int
		SET @UserID = (SELECT UserID FROM USERS WHERE UserName = @username) 

		DECLARE @RhymeID INT
		SET @RhymeID = (SELECT 
			TOP(1) Rhymes.RhymeID
		FROM 
			Rhymes
			LEFT JOIN RhymeLog ON RhymeLog.RhymeID = Rhymes.RhymeID AND RhymeLog.UserID = @userID
		ORDER BY
			RhymeLog.LastReading)

		EXEC usp_UpdateRhymeLog @RhymeID,@UserID

		SELECT 
			Rhymes.RhymeText
		FROM 
			Rhymes
		WHERE RhymeID = @RhymeID
		

	END
	ELSE
	Begin
	SELECT @activity
	End
END


This stored procedure gets the next activity for the user of the robot. It contains the logic of what can be grabbed next based on the age of the user and the last time that activities were performed for that user.

With multiple robots whether left on or turned off, the user (once recognised by the robot) would not be told the same information by all of them. The multiple robots would use this script to be able to know what that user has already been told.

The Rhymes section of this stored procedure needs to be updated to allow the rhymes to tell the last time a rhyme was told so that it uses the timer in the Activity table instead of telling a new rhyme every minute.

Reminders would be things that you want to be told daily like when my daughter is recognized, it will tell her to put her homework on my desk to check. If I am recognized, it would tell me to take my meds and call my mom or something.

I am thinking about how I would implement the activity timers. The logic for timers is that the user would be able to tell the robot to remind them to do something at X time today. The robot would verify the request and then update the database. Every minute, the robot would check to see if there are any timers coming up to remind the user of. It would log when the timer was told to the user so that if the robot was off or if the user was not around at the time of the event, the next time that the user was recognized by the robot, they would be reminded.

Let me know if you have any questions.

#22  

I almost spit out my water when you said "give me a call....no Don't call me!" haha

Awesome video through, I could follow along well and I understand the DB design. Its very neat to see your design.

#23  

Jeez... David, your coding is stellar... I would love to loan my inMoov out to you for a few weeks just to see what you can do with him....:)

#24  

Awesome Justin. I thought it was pretty funny, but DONT CALL ME:)

The path I am going down for this project definitely isn't for everyone or even most people. It requires some understanding of relational databases and how they work. It is for those who understand databases and want to have multiple robots work together or understand what each other is doing. For example, I would love for there to be a robot at the opening of a school year that could help new students by knowing their class schedule of directing them to the room they need to go to.

The inmoov that I am going to start in March (finances ya know) will be driven this way. I think it would be cool. Also, the AVM nav stuff in RoboRealm looks really cool. I want to mess with that so that the robot understands what a doorway (gate) is and allow it to do better navigation.

The ultimate goal is to have my current students be able to build an intelligent robot by the time they graduate that they can take with them. I want them to be able to Use ARC to its fullest potential Develop applications in C# that can tie into ARC Develop databases that can be used to store data for their robots. Develop interfaces to update the data in their databases 3D Model and print Understand and build the robot with an understanding of what components they are using and why, along with how they are powering the robot and why they choose that method.

Currently, 1/2 of my students are just being introduced to robotics through revolution robots. The other 1/2 are designing a robot (a car for JD) and we will be 3d printing it and building it. Next year we will take these students deeper into scripting and modeling. The next year it will be programming and database. So on and so forth. There will be new students every year from 4th grade. The potential becomes pretty huge.

I want to develop telepresence robots for students who have to be away from school. In one class we had 1 kid with open heart surgery, an injury to another that has caused her to have to be home schooled due to the discomfort of sitting in a classroom and another that has stomach issues and has missed a lot of school. In a class of 25, thats a lot of missed days that could have been solved with a telepresence robot. Multiple of these being able to communicate, and not caring which robot is used by which student is a big deal. Being database driven accomplishes a lot here. Also, having an application that the teacher can use to post assignments for each student is big. all of this leads into what I am doing here.

Anyway, Thanks for watching. I am glad you enjoyed the video. It seems to be becoming a trend for me to sign off with some sort of mess up:)