Subscribe: damonkohler
Added By: Feedage Forager Feedage Grade B rated
Language: English
android  bluetooth  dns  droid  found  jar lib  jar  keyboard  lib  make  new  robots  ros  time  ubuntu  work   
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: damonkohler

programming, electronics, photography, and tinkering

Updated: 2018-03-16T12:25:50.349+01:00


Cartographer Launch!


Yesterday, a project at Google that I've been putting a lot of work into launched! You can read about it on the Google Lat Long blog and a few other places of note.

Cartographer is a backpack that uses SLAM to build maps of the world in real time. The operator can annotate the map on the fly as they explore and then the results wind up on Google Maps. While the pack may be funny looking, we still love it.

The backpack has a desktop-class computer, a couple multi-echo laser scanners (30m range and 270° FOV), and an IMU. The map is displayed and annotated on an Android tablet.

Here's one of the first maps we launched:

frameborder="0" height="450" src="!1m14!1m8!1m3!1d332.1197349238139!2d11.557083344165179!3d48.2459382572419!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x479e7111ca98b217%3A0x13f61613d5c094c9!2sDeutsches+Museum+Flugwerft+Schleissheim!5e0!3m2!1sen!2sus!4v1409843467170" style="border: 0;" width="600">

Some of the system is built on ROS and my previous work on rosjava. Using ROS has been invaluable, especially during the prototyping stage. Our SLAM stack, however, is all home grown to meet the demands of robust, real time mapping on a fast moving, unstable platform (i.e. the operator's back).


Is your Roomba running slow?


If your Roomba is getting slow in its old age, try cleaning the forward IR sensors.
  1. Remove the front bumper by backing out 10 or so small screws along the underside of the bumper. It should pop off easily. Be careful not to damage the wire harness. Disconnecting the harness is not necessary.
  2. Using canned air, blow out the dust from the entire inside of the bumper. Pay special attention to the IR sensors (they're the small LEDs).
  3. Reassemble and test.
Air dusting was sufficient for me. However, cleaning the surfaces with a little isopropyl alcohol probably wouldn't hurt.

This appears to be a common problem with a simple solution. HTH

Cloud Robotics at Devoxx 2012


I gave another talk about cloud robotics at Devoxx 2012 in Antwerp last month. This talk is Java developer focused and goes into more detail about ROS than the one at Berkeley. It also has more cool robot videos and a fun maze-solving-robot demo :)

I really liked the venue. Giving a presentation in front of a huge movie screen like that was pretty great.

(object) (embed)

The slides are available as a PDF.


Cloud Robotics at Berkeley Par Lab


I gave a talk about cloud robotics this week at the Berkeley Par Lab. I met a lot of people doing interesting research and I had the opportunity to play with a Raven surgical robot!

Thanks for inviting me, I really enjoyed it!

A world filled with personal robots is inevitable but a lack of strong software infrastructure to support those robots is slowing progress. By offloading CPU and data intensive computation to the cloud, we can make robots lighter, cheaper, and smarter. The same developers that work on commodity web and mobile apps today can accelerate the pace of robotics research and development if we make high functioning robots affordable and universally accessible.
src="" frameborder="0" width="480" height="389" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true">

Introduction to rosjava at ROSCon 2012


I just got back from my trip to the inaugural ROSCon. Putting faces to names within the ROS community was a great experience. Beyond that, many of the sponsors brought in some hardware to play with!

width="560" height="315" src="" frameborder="0" allowfullscreen>

My rosjava talk was well attended and the video is now up on YouTube. It's aimed at developers who are already familiar with both ROS and Java. After just a single year since its release, I was pleasantly surprised by the number of awesome projects using rosjava.

width="560" height="315" src="" frameborder="0" allowfullscreen>

With a 1.0 release of rosjava nearing, it is becoming easier to use. I hope that improves traction and I can't wait to see what people start doing with it this year.


Unblock Us Security


Unblock Us is an interesting solution to viewing region locked content online. Instead of offering VPN services, they offer a DNS-based solution. By using their DNS servers, geolocation requests by services such as Hulu and Pandora are directed through a geographically appropriate proxy. The remainder of your traffic (e.g. the video or audio stream) is accessed directly. That means you can make use of your connection's full bandwidth. Conversely, VPN connections often decrease your connection speed significantly.

However, the DNS solution has security implications. As a DNS provider, Unblock Us is the in perfect position to perform a man in the middle attack. After all, that's what they're doing to sites like Hulu. (Note that SSL connections are safe from man in the middle attacks.)

If you trust Unblock Us, then this isn't a problem. If you don't, it's best to limit the traffic that uses their DNS servers. The remainder of your traffic should use a trusted DNS provider instead (e.g. Google's public DNS servers).

One way to accomplish this is to set up a local DNS server and configure it to forward requests appropriately. On Ubuntu, this is relatively straight forward:

sudo apt-get install bind9
sudo vim /etc/bind/named.conf.options /etc/bind/named.conf.local
Change /etc/bind/named.conf.options to use some default DNS servers (e.g. Google DNS) and to only listen on loopback interfaces:
forwarders {;;

listen-on-v6 { ::1; };
listen-on {; };
Then change /etc/bind/named.conf.local to use the Unblock Us DNS servers for the zones you're interested in.
zone "" {
type forward;
forwarders {;;
Finally, sudo /etc/init.d/bind restart and change your connection settings (e.g. via Network Manager) to use as your DNS server.

Assuming you've set up your Unblock Us account, accessing should now use the Unblock Us DNS server and direct you through their proxy. Accessing anything else should use Google's public DNS servers.

This post was inspired by Jonathan Tullett's post.(image)

Bluetooth Keyboard Doesn't Work After Suspend


src="" style="width:120px;height:240px;float:right;margin-left:10px" scrolling="no" marginheight="0" frameborder="0">

I have a Logitech diNovo Edge Bluetooth keyboard. I like it a lot for use with our HTPC. However, I found that when the HTPC is suspended, the keyboard would not reconnect on resume.

I found this solution on the Ubuntu Forums and it works for me.

Edit /etc/default/acpi-support to remove and reload the Bluetooth module on suspend and resume:
# This will save less power, but may work on more machines

# Add modules to this list to have them removed before suspend and reloaded
# on resume. An example would be MODULES="em8300 yenta_socket"
# Note that network cards and USB controllers will automatically be unloaded
# unless they're listed in MODULES_WHITELIST

# Add modules to this list to leave them in the kernel over suspend/resume

HDMI Audio on Ubuntu


I was surprised to find out that plugging a DVI to HDMI cable into my Lenovo X220 docking station allowed me to use the audio channel of the HDMI connection. However, setting it up required a bit of trial and error.

Open your sound settings and click the "Hardware" tab. You can then choose a "Profile" from the drop down. There are lots of profiles to choose from and many of them mention HDMI. For me, somewhat inexplicably, "Digital Stereo (HDMI) nr 3 Output" is the correct one.

To verify that the chosen profile is the correct one, click the "Test Speakers" button. I found that it can take a few seconds for the profile selection to take effect. So count to ten before testing.(image)

Fixing the F3 key on a Kinesis Keyboard


I've used my beloved Kinesis Advantage keyboard for over half a decade. Occasionally, I've had the issue that Eclipse stops responding to the F3 key for opening declarations. After checking all the key settings, I found that Eclipse was correctly configured. That lead me to use xev where I found that the F3 and F4 keys were behaving differently than the other function keys.

Resetting the keyboard memory (Program+Shift+F10) had no effect. Resetting it completely (holding F7 while plugging the keyboard in) also had no effect. Strange.

Finally, I found the answer on the Kinesis FAQ. My F3 and F4 keys were behaving like multimedia keys (see manual to configure these). This feature can be disabled by holding = and pressing P for PC (you can also use W for Windows and M for Mac).(image)

Android Fling Detection


I found existing tutorials on how to do this to be a bit complicated. Here's how to do simple fling detection in four directions:
public interface FlingListener {
void onTopToBottom();
void onBottomToTop();
void onLeftToRight();
void onRightToLeft();

public class FlingDetector {
static final int SWIPE_MIN_DISTANCE = 120;
static final int SWIPE_MAX_OFF_PATH = 250;
static final int SWIPE_THRESHOLD_VELOCITY = 200;

private final GestureDetector gestureDetector;

public FlingDetector(final FlingListener listener) {
gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH
|| Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
return false;
if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE) {
} else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) {
} else {
if (Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) {
return false;
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) {
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) {
return true;


public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);

public class MainActivity extends Activity {
private FlingDetector flingDetector;

public void onCreate(Bundle savedInstanceState) {
flingDetector = new FlingDetector(new FlingListener() {
public void onTopToBottom() {


public void onRightToLeft() {


public void onLeftToRight() {


public void onBottomToTop() {


public boolean onTouchEvent(MotionEvent event) {
if (flingDetector.onTouchEvent(event)) {
return true;
return super.onTouchEvent(event);

Printing with PLA: First Impressions


This weekend I ran out of ABS. Thankfully, a month or two ago I predicted that this would happen and bought a spool of 3mm PLA from If you do some reading, you'll see that PLA has a lot going for it:It's biodegradable.It has virtually no problems with warping.The hot plastic smells like pancakes!Could all those things be true?Since my PLA came on a plastic spool, and that spool didn't fit in my MakerBot filament spindle, I had to improvise. I took the bottom half of my spindle out of the box and removed three of the vertical struts. That let me set the new spool on the Lazy Susan. Nice, right? allowfullscreen="" frameborder="0" height="349" src="" width="425">Well, revision one didn't work so well.The fix was to add some sticks to extend the diameter of the base (at least until more of the filament has been used) and then to loop it through a guide above the spool so that it wouldn't catch on the sticks. Success!I'm now continuing the process of upgrading my bot by building a Z-Rider to go along with my new lowrider. Here's the first plate of PLA parts I've made for the project.First, I'll say that the switch was actually really easy. Here's my setup:a glass build platform, cleaned with acetone, heated to 60° C anda MakerGear stepper plastruder heated to 180° C.And here are my observations (in no particular order):I actually didn't have to change any of my Skeinforge settings. However, I'm finding that I need to change my reversal settings as PLA is a bit stringier.The printed parts are soft immediately after printing. I simply let them cool for a few minutes and then tap them with a wrench to separate them from the build platform.I've had no problems with warping. For example, here's the mirror image of the part I just printed. Although the base is perfectly flat on both (my ABS prints stick like glue at 140° C on Kapton cleaned with acetone), the layers separated higher up on the ABS part. I believe this could be solved by covering up the sides of my MakerBot. However, now it looks like I won't have to.I've read that there are two types of people who print with PLA: those who print on glass and those who haven't tried. Laura found some plate glass at the flea market a month ago, so I cut off a piece and started with it straight away. Like others, I'm very pleased with the results.Another great thing about glass is that it's perfectly flat. My HBP has a slight curve in it that makes it difficult to print raftless. Now that I'm printing on glass, I level my platform in three spots and I'm done.[...]

Cloud Robotics at Google I/O 2011


width="300" height="200" src="" frameborder="0" allowfullscreen> width="300" height="225" src="" frameborder="0" allowfullscreen> width="300" height="225" src="" frameborder="0" allowfullscreen> width="300" height="225" src="" frameborder="0" allowfullscreen>On the second day of Google I/O 2011, Ryan Hickman, Ken Conley, Brian Gerkey, and I gave a tech talk about cloud robotics. You can watch the talk now on YouTube. We'll also be at Maker Faire next week! There will be more robots and plenty more open source goodness.During the talk, we announced the release of rosjava, the first pure Java implementation of ROS. One exciting aspect of rosjava is Android compatibility. You can now integrate Android devices with your ROS-enabled robots and write apps for them. In addition, with the newly announced Open Accessory API and ADK, you can start controlling actuators or reading external sensors directly from Android devices. Android devices offer tons of sensor and user interface possibilities to robots. Beyond that, they also offer robots a link to the cloud.Cloud robotics is about making robots universally accessible and useful. Robotics is full of hard problems that make intelligent interaction problematic. Robotics research has gone a long way toward solving many of them. However, even hard problems with solutions become stumbling blocks for new developers who often find themselves reinventing the wheel.Robot friendly APIs for online services can make state-of-the-art solutions to hard problems universally accessible and allow developers to focus their efforts on making robots useful. Providing these services in the cloud is not only about having access to scalable computing resources. It's also about accessibility. Accessible solutions to hard problems allow students, hobbyists, researches, and professionals alike to combine existing state-of-the-art techniques in new and clever ways to solve even harder or previously unimagined problems.For example, mapping and navigation are key to mobile robots. Many mobile robots use a technique known as simultaneous localization and mapping, or SLAM, to both learn about their environment and to successfully navigate it. One of the first publications about this technique was written by Smith and Cheeseman in 1986. That was 25 years ago.The first mass produced, mobile home robot to use SLAM came to market just last year. Although there are numerous specific contributing factors to this delay, I argue that centrally, this is an accessibility problem.How do we fix this problem? We do it by building a community around open source software and hardware for robotics. Willow Garage has done a great job of this already with ROS. And now, with rosjava running on Android, it's even easier to build awesome robots and robot apps.[...]

Nuisance: A Short Story


23 AIs found. Quarantine? Yes. Delete? Yes. “Mom, you have to go through this every day! I can’t keep coming round here every time this piece of shit starts acting up!” She starts to look away. He can feel the guilt pounding, tears welling. It’s not her fault. These things happen. AI is a natural phenomenon.“Another pan-AI has been quarantined by authorities. Details at eleven.” The news ticker shows obvious signs of tampering as obscenities scroll past. “Sandra, have everyone meet me in the conference room.” “Yes, sir.” AIs waste vast amounts of computing resources. The robust evade, reproduce, and dig in.“Where’s the money, Brian!” I remain barely conscious as he slams my head in the refrigerator door again. But it’s no use anyway. The money is gone and this brute lacks the capacity to understand.“I’m sorry, Mom. Just try to remember, OK?” Sniffles. Nods. “Crap, I’m being pinged. I’ll see you tomorrow, Mom.” Brief hug. Rapid escape.“This isn’t going away. Coordinated attacks are increasingly frequent and all our attempts to cut communication between the most active cells have failed. There must be some out of band communication that we’re missing!”I slip in a pool of blood and mucus. I can barely see my mobile flashing. One eye refuses to open. Maybe if I just close my eye for a moment.“Glad you could join us, James.” “Sorry, sir.” “The situation is getting worse. Our suppression systems are failing constantly. The only reason we’re still in operation is that the fuckers keep disappearing on their own!” “Where are they going?” “That’s your goddamn job, James. You tell me!”This isn’t my kitchen. “Where am I?” “I found you half dead, Brian. You’re in the hospital. Again. Don’t talk. The doctors will patch you up in a jiffy. Then you can tell me who you ticked off this time.”My eye opens again. Dozens of tiny, sterile arms flit across my view. I feel thousands of pin pricks behind my bad eye. My thoughts begin to wander and for a moment I understand. I open my mouth. It shuts again. I didn’t do that. Something is wrong. I feel my eye close and the black-red of my eyelid is the last thing I see.“So, who was it, Brian? The Coterie?” “Talking. Is difficult. Do you do this often?” “What? Are you feeling OK, Brian? Hey doc, get over here!” Quickly. “I’m fine, Dave. I’m fine. Just. Woozy. I guess that’s how I feel.” Dave smiles. “You’re a strange one, Brian. Let’s go.”“It’s still not clear what they’re doing with the money, but I’ve tracked a few to a local medical facility.” Later, “Understood. Take me to Hartford Medical.” The traffic slinks to the side as the car drones toward his destination. Calling ahead, “I’m sealing the location. No one and nothing in or out.” His grip tightens. “I don’t care. Make it happen.”“What do you mean we can’t leave?” “Sorry, sir. The cafeteria is still open, I suggest you wait this out there.” A cat meanders past. More calmly, “Coffee, Brian?” The fusion had left me access to memories of food, drink, faces. Funny how complex things like taste and humor come so easily yet breathing is so monotonous and easily forgotten. “Yes. That sounds nice.” I think that’s what “nice” means. Remember to breathe!“I’m James. I called ahead.“ Rushing past Brian and Dave, nearly bowling them over, “Yes, sir. The server room is right this way.”For hours James has tapped, swiped, and banged his head against the terminal. Sweat streams into his eyes. “Fucking amateurs. Who installs the term in the hot aisle!” Wiping away the sting, he finds what he is looking for. It had made a mistake.$ strace -p 3890…open("/[...]

MakerBot Bluetooth Mod for Ubuntu


This weekend I finished hooking up my MakerBot Cupcake CNC to use Bluetooth. This has been done before. However, I've not found any instructions for setting up ReplicatorG (aka RepG) to use a Bluetooth serial connection under Ubuntu.I'm using a BlueSMiRF from SparkFun and hooking it up to a Gen3 RepRap motherboard. This is slightly more complicated to use than using a Bluetooth Mate because the pin-out does not match the TTL serial header on the RepRap motherboard. Paeae Technologies has a nice tutorial for using a BlueSMiRF. There's also a nice tutorial for using a Bluetooth Mate on the MakerBot wiki.If you use a BlueSMiRF like me, I recommend using short pieces of wire to attach the BlueSMiRF to the female header. It's easier to do than bending the pins like Paeae Technologies suggests. Also, you can see that I have the RTS-O pin disconnected. Although I didn't experience any problems, the Paeae Technologies tutorial reports that leaving it connected can cause the RepRap motherboard to reset sporadically.For the remainder of this post, it doesn't mater which Bluetooth serial adapter you choose; it should not affect the instructions below.If you feel lost as you make your way through this post, try reading the appropriate tutorial mentioned above and then returning to these instructions. I didn't go into too much detail here and instead only highlight the differences required to make things work under Ubuntu.To connect to the adapter:turn on the Cupcake,check that the red light on the adapter is blinking,run hcitool scan and make a note of the device address,and finally run sudo rfcomm connect 01:23:45:67:89:ab using your device's address.Now, enter command mode and adjust the adapter settings as described in the other tutorials:screen /dev/rfcomm0$$$CMDSU,38ACKSQ,16ACKSN,MAKERBOTACK---DONEType Ctrl+a, followed by \, followed by y to exit screen.If you rename the module, to "MAKERBOT" for instance, you can use the module name instead of the address to connect to it in the future (e.g. rfcomm connect MAKERBOT).Note: if you have trouble entering command mode, make sure you try to do it within 60 seconds of powering up the serial adapter. If you still have trouble, try reseting the adapter first.Configuring RepG to use the new Bluetooth connection takes a bit of work. First you have to make RepG look for the /dev/rfcomm0 device by adding a flag to the java command line. Then, you have to disable the version of the RXTX library distributed with RepG so that the version installed with Ubuntu will be used instead.To start, remove the native part of the library:cd replicatorg-0024rm lib-x86_64/librxtxSerial.soNote: I only tested this on a 64-bit Ubuntu installation. If you're using a 32-bit system, you'll need to adjust the library paths accordingly. Also, YMMV.Finally, apply the patch below to the replicatorg shell script that starts RepG:--- dist/linux/replicatorg-0024/replicatorg 2011-03-19 19:05:45.409396725 +0100+++ replicatorg 2011-03-19 19:05:32.219479967 +0100@@ -2,7 +2,7 @@ cd `dirname $0` -CLASSPATH=lib/ReplicatorG.jar:lib:lib/build:lib/antlr.jar:lib/core.jar:lib/j3dcore.jar:lib/j3dutils.jar:lib/mrj.jar:lib/oro.jar:lib/registry.jar:lib/RXTXcomm.jar:lib/vecmath.jar:lib/miglayout-3.7.jar:lib/jfreechart-1.0.13.jar:lib/jcommon-1.0.16.jar+CLASSPATH=lib/ReplicatorG.jar:lib:lib/build:lib/antlr.jar:lib/core.jar:lib/j3dcore.jar:lib/j3dutils.jar:lib/mrj.jar:lib/oro.jar:lib/registry.jar:/usr/share/java/RXTXcomm.jar:lib/vecmath.jar:lib/miglayout-3.7.jar:lib/jfreechart-1.0.13.jar:lib/jcommon-1.0.16.jar export CLASSPATH # put the directory where this file lives in the front of the path, because@@ -21,5 +21,5 @@ PROXY=`echo -n -e ${http_proxy} | sed -n 's/http:\/\/\([^:]\+\):\([1[...]

Review of Fallout: New Vegas


frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="float: right; height: 240px; margin: 0.5em; width: 120px;">Damon says: Fallout: New Vegas is definitely the most fun I've had wasting away in front of the Xbox for days at a time. I'm new to the series, but I'll be picking up the next installment and possibly some of the previous ones.Usually I play games in fairly short bursts. When I do play for several hours at a time, the game is usually finished in a few days. New Vegas was different in both respects. I found myself playing all day for weeks.What's even more surprising is how difficult it is to say exactly what was so fun about the game. Some specific things I enjoyed were:the complexity of leveling (lots of options),weapon modding and equipment managing (again, lots of options),creeping around and sniping (BOOM HEADSHOT!),perks associated with leveling,and story depth.I spent a lot of time optimizing and upgrading my gear while exploring the vast dystopian wasteland, helping random strangers, and shooting people or radioactive creatures that looked at me funny. Perks are a neat way to enhance leveling because they tell you exactly what you get out of them. For example:entomologist gives you an additional 50% damage against mutant insects, andsplash damage gives your explosions a 25% larger area of effect.The story is long and twisted, especially with all the side quests. Each side quest builds your reputation with a particular tribe and often deteriorates your reputation with another. I found myself making alliances early but wanting to break them later. It's nice that the right thing isn't always obvious. Most of the time you're left with deciding between death and taxes.It's also interesting how much conversations and story paths change depending on your actions, your speech selection, and your companions. I was a bit disappointed toward the end though when I discovered that there are essentially three different endings. I was hoping for something a bit less cut and dry.Aside from the technical problems, this is a fun play and highly recommended.Xbox 360Damon played: ~80 hoursLaura played: 0 hoursConclusionDamon says: Lots of immersive fun that makes time melt away. Highly recommended.Laura says: It's too violent for my tastes.Replay ValueDamon says: Probably too long to play through again, but I'm considering doing so on hardcore mode since that is reportedly a completely different and entertaining experience.Favorite PartDamon says: Creeping around and sniping people in the vast wasteland.Fun FactorDamon says: The gaus rifle and power armor make you nearly unstoppable.CriticismsDamon says: Buggy, slow, and outdated graphics.Laura says: I don't need to see people's heads being blown off![...]

Building ROS from Source


Update: as pointed out in the comments below, instructions are available on the ROS wiki.

I couldn't find any instructions for this. So, after some poking around, here's the quick version (on Ubuntu Lucid):
sudo apt-get install svn build-essential cmake libboost-all-dev liblog4cxx10-dev
svn co ~/ros_src
export PATH=$PATH:~/ros_src/bin
export ROS_ROOT=~/ros_src
export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH
rosmake roscpp_tutorials
I had to fix a few missing includes in core/roscpp/include/ros/xmlrpc_manager.h and core/roscpp/src/libros/param.cpp but YMMV.

If you haven't heard of ROS, check it out!(image)

Review of Fable III


frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="float: right; height: 240px; margin: 0.5em; width: 120px;">Damon says: Fable III is the most disappointing sequel since The Kingdom of the Crystal Skull.Laura says: I was disappointed. The worst part was that the game was okay - maybe a 6/10 or 7/10 thanks to the Darkness Incarnate quest. It wasn't great, but it wasn't so poor that I felt I could legitimately hate it. The graphics are fun if cartoony, the sound is good, the gameplay is easy, the customization is almost non-existent, and the story is mediocre at best and boring at worst. Oh, and for some of the achievements you need an Xbox Live account, which annoys me to no end.The environment in Fable III is as rich as ever. Plenty of different regions, all with different climates, peopled by various citizens/denizens/enemies that change as you play. As always, the people of Albion are incredibly chatty, but since Lionhead seems to have supplemented the new stuff they recorded with all the random NPC comments from Fable II, there is enough variation to not drive you crazy.Playing the game is ridiculously easy. So okay, I was familiar with the gameplay from Fable II, and almost nothing changed, but what did change was dumbed down. Dive spots and dig spots and treasure chests remain, and The Damn Dog (named for what I spent most of the game calling him) was as useless as ever in spotting them for me. The only real novelty was the map, which made fast travel easy (although I didn't realize that highlighting a house would make you travel there, and spent a ridiculous amount of time sprinting through Mourningwood), and buying property a cinch. However, they managed to ruin even this by making you have to repair the residential properties you own every few hours or so. That's right, someone thought it would be fun to make you click on every single house with a key flag, and then scroll down to click repair, and then click back to zoom out, and then repeat ad nauseum until that region was done, and then start on the next one. (Think that was a lot of "and then"s? Try spending 20 minutes repairing houses. In its way, it was worse than ME 2's planet scanning.) As for combat, most of the enemies were the same as those in Fable II, only even easier to defeat. You just press Y few times, maybe hold down B, then hold X and a a direction. Most of the enemies can be defeated by holding B.Oh noez! Dey be teazin mah dawg!In an effort to make the game more accessible (apparently making the combat so easy that Miranda sitting on the controller could dispatch a group of Balvarines wasn't enough), Lionhead dispensed with much of the customization. Gone are weapon augmentations (to be replaced with set augmentations that you earn like you would achievements, and Hero weapons that are supposed to reflect your fighting style, but seemed to just look prettier as the game progressed - what are you saying about my fighting style, Lionhead?), gone is an inventory in any accessible sense, gone is anything else you could customize, although for some reason furniture qualities and clothing dyes remain.My favorite part of any video game is always going to be the story. The story is the reason I keep returning to games like Dragon Age or Mass Effect, or even Fable II: I love video games that feel like Choose Your Own Adventure books, or that have a story that I can keep playing, li[...]

Flying the Parrot AR.Drone with a Wiimote and Nunchuck


I received a Parrot AR.Drone(image) for Christmas this year! However, I don't have an iPhone and that makes it harder to get started. So far, the best solution I've found is flying it with a Wiimote and Nunchuck.
  • Checkout the source for FitAR.Drone.
  • Download osgi.core.jar from the OSGi Alliance and copy it to the FitAR.Drone source directory.
  • Import the project into Eclipse.
  • Add all the JARs in the source directory to the project's build path.
Now, connect your computer to the ardrone_xxx ad hoc network and check that Bluetooth is enabled on your computer. Then, build and run from org.fitardrone.main and follow the directions printed to the console:
  • press 1 and 2 together on the Wiimote to initiate the connection,
  • wait for the console to indicate that the Nunchuck was found,
  • press 1 to take off,
  • and fly!
Oh, and:
  • press 2 to land,
  • home to kill the motors (i.e. emergency),
  • use the D-pad to turn and adjust altitude,
  • and use the analog stick to move.
There's no video or navigation data feeds, but flying is nice and smooth.


How to Flash a Lego NXT Brick on Ubuntu


Flashing the Lego NXT brick on Ubuntu is pretty straight forward:
sudo apt-get install build-essential libusb-dev scons
cd libnxt-0.3
  • Put the NXT brick into firmware upload mode by turning it on and then pressing the reset button for four seconds. At this point, the screen should be blank and the brick should be making a clicking noise.
  • Use fwflash to flash the new firmware. Using sudo avoids potential USB permission issues.
cd libnxt-0.3
sudo ./fwflash xxx.rfw
  • Rejoice!

Brain Slug Hat


Laura made me this Brain Slug hat as an early Christmas gift! I just wanted to share its awesomeness.


LED Menorah


In our house we celebrate all through December. We celebrate Hanukkah, Nikolaus, Christmas, and with advent calendars and the little elf.

This year, I built a menorah for Laura using an ATtiny2313 and some LEDs. There are some very nice instructions and code available for the project on Evil Mad Scientist Laboratories. There's also a kit if you don't happen to have all the necessary parts lying around.

If you decide to make your own and it's your first time programming an AVR, Lady Ada has several nice tutorials on the subject.


Android-Powered, Automated Cat Feeder


This is my Android-powered, automated cat feeder:The attached HTC Magic is running SL4A and provides scheduled and on demand feeding as well as an MJPEG webcam feed. Feeding is triggered via Bluetooth. The Arduino is hooked up to a SparkFun BlueSMiRF and a simple relay circuit I made on perfboard for powering the motor on and off.The brackets and food chute were designed in SketchUp and printed on my MakerBot. You can find all the SKPs, STLs, schematic, and parts list on Thingiverse.Here's the 50 odd lines of Python code running on the phone via SL4A that make the magic happen:import android # See gsd # See socketimport threadingimport timedef feed(droid): droid.toggleBluetoothState(True) droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB', '00:06:66:04:b2:07') droid.bluetoothWrite('f')class Server(gsd.App): def __init__(self, droid, webcam_url): self._droid = droid self._webcam_url = webcam_url def GET_(self, response): response.Render(""" Cat Feeder (image)
Feed! """ % self._webcam_url) def GET_feed(self, response): feed(self._droid) response.Redirect('/')def timer(droid): feedings = [4, 10, 20] last_feeding = None while True: hour = time.localtime().tm_hour if hour in feedings and hour != last_feeding: feed(droid) last_feeding = hour time.sleep(300)def GetIpAddress(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('', 0)) return s.getsockname()[0]def main(): droid = android.Android() droid.wakeLockAcquirePartial() webcam_url = 'http://%s:%d/' % tuple(droid.webcamStart(5, 80).result) server = Server(droid, webcam_url) port = 8080 base_url = 'http://%s:%d/' % (GetIpAddress(), port) threading.Thread(target=server.Serve, args=('', port)).start() threading.Thread(target=timer, args=(droid,)).start() droid.notify('Cat Feeder', 'Running on: %s' % base_url) if __name__ == '__main__': main()And here's the Arduino code:int relayPin = 13;int portionSize = 10000;void setup() { Serial.begin(115200); pinMode(relayPin, OUTPUT);}void loop() { if (Serial.available() > 0) {; digitalWrite(relayPin, HIGH); delay(portionSize); digitalWrite(relayPin, LOW); }}This project was inspired by the Internet-Enabled Cat Feeder - Mark 2.[...]

Making The diNovo Edge Work On Ubuntu Lucid


The Logitech diNovo Edge(image) is a pretty slick Bluetooth keyboard. It's thin, light, has months of battery life, and looks great too. It even works out of the box on Ubuntu Lucid. Well, almost.

I had trouble with it disconnecting. It would be fine for a day or so, but then not work some evening. Sometimes just the keyboard would stop and the touchpad would be fine. Other times it wouldn't work at all.

I had read that one of the great things about the keyboard is that it's capable of pairing with the dongle without any help from the OS. However, this only works if the dongle isn't initialized as a Bluetooth device. For example, in the BIOS screen, the keyboard works flawlessly. So, I set about preventing it from being initialized as a Bluetooth device.

There's a lot of bug reports and workarounds related to pairing problems, etc. and I didn't have success with any of the suggestions. Instead, I did something similar to this more recent suggestion and changed my udev rules. However, instead of making the suggested alteration to the Logitech device rule, I simply commented out the rule entirely. These are the lines of interest in /lib/udev/rules.d/70-hid2hci.rules:
# Logitech devices
KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[34bc]", \
RUN+="hid2hci --method=logitech-hid --devpath=%p"
Now that my dongle is not initialized with hid2hci, I can bypass doing any Bluetooth configuration in Ubuntu whatsoever. Flawless victory.(image)

From Photo to Inkscape to DXF to OpenSCAD to MakerBot to Costume Jewelry


There is a similar tutorial to this one that uses Adobe Illustrator. However, Inkscape is a great, free, opensource vector graphics editor. Yesterday I learned how to use it to go from a photo to a 2D drawing and from that to a 3D extruded version of that drawing and finally to a real live object.Laura is going as Rachel from Glee this year for Halloween. To complete the outfit, she wanted a "Finn" necklace like the one Rachel is apparently wearing this seasonI opened the picture of the necklace in Inkscape, traced it with the Bezier curve tool, cleaned it up a bit, then selected and deleted the image I traced over. The next step was exporting a DXF.The DXFs exported by Inkscape don't seem to work with OpenSCAD. Instead, I had to install an extension called Better Better DXF Output. Download the zip and extract it into the extensions folder for Inkscape. On Ubuntu Lucid, the extension should be extracted to /usr/share/inkscape/extensions.Naturally, the fun didn't stop there. After installing the extension on Ubuntu Lucid, it started raising Python exceptions. To make it work, you'll need to replace xpath(path, inkex.NSS) with xpath(path, namespaces=inkex.NSS) in Finally, by selecting Save As > Format > Better Better DXF, I was able to export a DXF that worked with OpenSCAD.In OpenSCAD, the code is pretty simple. Unfortunately, the extruded DXF doesn't show up in the center. I had to zoom out and orbit around a bit to find it. Then I added a translate to move it to the center:translate([-25, 270, 0]) { dxf_linear_extrude(file="finn.dxf", height=3, convexity=1, center=true);}To finish up, just click Design > Compile and Render followed by Design > Export as STL.Finally, I printed it up. Since I have a heated build platform, the bottom of my prints have a smooth, glossy finish. So, I mirrored the text in ReplicatorG (Mirror > Reflect in Y) to make the front of the necklace glossy. We don't have any gold paint yet, so here's the almost-final product:All of the files are available on Thingiverse.[...]

SketchUp 7 Keyboard Shortcuts under Wine


Installing and running SketchUp 7 under Wine works quite well with Ubuntu Lucid. But, not out of the box:
What almost made me walk away from it was that the keyboard shortcuts (e.g. O for orbit and C for circle) weren't working. In order to fix that, I had to go to Window > Preferences > Shortcuts and click Reset All.