While waiting to hear back from the IEEE Transaction on Robotics reviewers regarding the status of my submitted journal article on the Service Based Architecture for Cartography (SBAC) I started to think about all the demonstration videos that I had made over the years to document the various phases of the project. I decided to dig them all up and post them on YouTube. Surprisingly, until now, these videos were not in a single easy to find place.

For those of you that don't know, a cartographer, in short, is a software component used to manage map information. In my case it also had the ability to use the map information to plan safe routes for the robots to traverse. This was the work that ultimately drew me into the robotics field.

Continue reading to see five years of my life's work documented in about 15 minutes worth of low quality video...
Since my last update I have been somewhat productive. In September I traveled to Nice, France to attend the Teaching HRI to Humans workshop hosted at IROS 2008. I was bumped by my friend and colleague Dr. Jenny Burke to present a talk regarding my experiences at the 2008 HRI Young Pioneers workshop, and discuss what students expect from an HRI curriculum. I think it went rather well, due largely to the fact that, even though I had already created a presentation, I spent the entire flight to Europe contemplating what I was going to say. My presentation was the first day of the conference which allowed me to explore Nice and sit in on other talks the remainder of the week. After writing this I just remembered that I owe Jenny a paper.

Then in November I traveled to College Station, TX to assist Dr. Jenny Burke in data collection for a NIST exercise that was taking place at Disaster City. We were testing a paperless workload measure tool (Work-IT) that Jenny has been working on for a year or so. On this trip I was essentially a support ninja... I helped with data collection, used my script-fu to get us out of some binds, assisted with setting up and tearing down the maze, and got a little bit of a tan in the process.

nist112008.jpg
Now the new year is upon us, and it looks like a large portion of it is already accounted for. I have three journal length drafts that I need to put back on the top of the stack and get them submitted. I also would like to do some sort of write up for the iPhone/Packbot interface that I developed over the summer of last year, and I need to work on that HRI paper that I just remembered that I owe Jenny.

Since I am down a major professor this semester I had to search beyond my typical research assistant funding, and was fortunate enough to secure a position as a TA. I've never been a TA before even though it's my third year as a graduate student... I have Dr. Murphy to thank for helping me pull that off. I've been assigned to the C for Engineers course with Dr. Turner, and this past Thursday was my first class. I was nervous at first, there are about 30 students in my lab, which is quite a bit larger than the audiences I've had to speak in front of in the past (if you don't count the time that I ran for class president in elementary school). Once I got past the initial awkwardness of being up there, and adjusted my voice so that people all the way in the back could hear me, things were fine. I think it's going to be a fun learning experience.

As far as classes go, I'm taking as few as possible. There just aren't that many graduate courses that keep my interest, they generally turn out to be a chore instead of a pleasure. I did find one class over in the Psychology department that I've registered for, and I think it's going to be a good one: Art, Design, and the Brain. It's taught by Dr. Sanocki, and he's teaching the course because the topic is a personal interest of his, that fact alone makes it worth taking to me. Part of our assigned reading comes from the book Emotional Design by Donald A. Norman. What really surprised me was that the last couple chapters in the book are actually dedicated to my thesis topic, not my specific work obviously (i have yet to publish) but similar. I've already done the assigned reading for next week and want to keep going.

I think this post covers most of what I've been meaning to blog about, but kept putting off. If it does take me until the end of this semester to update again, I hope that I can at least say it was because I was finishing up some of the publications that I've had collecting digital dust.
Ever since I got the video feed working on my Packbot OCU application the reds and the blues have been swapped, giving the video feed a weird spacey look and totally cramping my style. Apparently the data is sent this way because leaving it in BGR format reduces the load for the Packbot's onboard computer. In other languages correcting this problem is a simple task, all you have to do is get the raw data and swap the red and blue components for each pixel. However I wasn't exactly clear how to retrieve the raw image data from a CGImageRef based on the Apple documentation. Using some creative search terms in Google this weekend I was able to piece together what I needed to get a proper ARGB image. The following code may not be the best way to do this, but it definitely works.

- (CGImageRef) CreateARGBImageWithABGRImage: (CGImageRef) abgrImageRef {

// the data retrieved from the image ref has 4 bytes per pixel (ABGR).

CFDataRef abgrData = CGDataProviderCopyData(CGImageGetDataProvider(abgrImageRef));

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(abgrData);

int length = CFDataGetLength(abgrData);


// abgr to rgba

// swap the blue and red components for each pixel...

UInt8 tmpByte = 0;

for (int index = 0; index < length; index+= 4) {

tmpByte = pixelData[index + 1];

pixelData[index + 1] = pixelData[index + 3];

pixelData[index + 3] = tmpByte;

}

// grab the bgra image info

size_t width = CGImageGetWidth(abgrImageRef);

size_t height = CGImageGetHeight(abgrImageRef);

size_t bitsPerComponent = CGImageGetBitsPerComponent(abgrImageRef);

size_t bitsPerPixel = CGImageGetBitsPerPixel(abgrImageRef);

size_t bytesPerRow = CGImageGetBytesPerRow(abgrImageRef);

CGColorSpaceRef colorspace = CGImageGetColorSpace(abgrImageRef);

CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(abgrImageRef);

// create the argb image

CFDataRef argbData = CFDataCreate(NULL, pixelData, length);

CGDataProviderRef provider = CGDataProviderCreateWithCFData(argbData);

CGImageRef argbImageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, 

colorspace, bitmapInfo, provider, NULL, true, kCGRenderingIntentDefault);

// release what we can

CFRelease(abgrData);

CFRelease(argbData);

CGDataProviderRelease(provider);

// return the pretty new image

return argbImageRef;

}


So there you have it. I hope this helps someone else. Suggestions for improvements on this are certainly welcome.

I had wanted to do something like this since I got the iPhone last summer. At the moment it's a rough draft of sorts. The current interface shows the video feed from the Packbot, and provides a directional pad for driving the robot and adjusting the flippers. I feel like I have the basic code needed to communicate with the Packbot, but what's really interesting are the possibilities introduced by the iPhone's unique interface, so that's the next step. I plan to experiment with the iPhone's accelerometers, and with the multi-touch interface for interacting with the robot. In the YouTube video below you can see some promising initial results of the work:


Here's some of the press that this got on the bigger blogs around the net:


I'd like to thank Jeff Craighead, Kevin Pratt, and Greg Higley for helping me out in various ways while working on this project.
At last I have a super fancy blogging getup! I've been meaning to do this for a while, but kept putting it off. I'm hoping to use this space as a means to solidify my thoughts, perhaps get input on them, and by putting my thoughts out in the open I think it will encourage me to follow through slightly more than I have in the past.

As I set this blog up the first thing I notice is how much iWeb does not like to play with anything that wasn't created in iWeb. All I want to do is have an external link pointing to this blog in the navigation menu, and it can't be done without editing the HTML after i publish the site. It's easy enough to do, but the whole reason I went with iWeb was so I wouldn't have to worry about touching HTML. I think in time I will have to transition over to a site creation app that is a little less picky.

So here's to keeping this thing up to date, and getting a reasonably usable and informative site.