Category Archives: Uncategorized

Book Review: BeagleBone Robotics Projects

I was asked by Packt Publishing if I would read and review this book. I’ve owned a BeagleBoneBlack for a little while now. My use case was not robotics. This book might shed some new light on my old Black, so I agreed to review it.

The book starts off very accessible. Chapter 1 covers just about everything I did with my BBB when I first received it, hooking it up like a PC, replacing the default distro, making sure I could SSH to it were all in there. The author, Richard Grimmett, goes a step further and installs XFCE gui and vncserver and walks through connecting from a Windows PC using vncclient. All in all, chapter 1 is a great super basic tour.

Chapter 2 dives into programming on the thing and introduces Python. It does it in a really weird (to me) way. It has the reader running emacs in a putty window remote connected to the device. This must just feel weird to me because I do a lot of remote programming and its never with emacs (I’m a vim guy) and its rarely remote. For a new user, it seems to me like it would have been simpler and more friendly to say “use an editor of your choice” and “here is notepad2 or sublime” along with “here is how you copy files to and from the device.” I think this is mostly my background causing me to see things differently. The emacs in putty walk-through is very adequate.

Its not a programming book, so this is really a nit pick, but technically some of the descriptions of python aren’t really true. For example, if __name__==”__main__”: does not “tell the program to begin its execution at this point.” Again I’m nit picking, but I do feel like a different phrase that isn’t so very false to someone who knows python could have been found. Still, its not a programming book. The beginning of the chapter does list many resources for learning python.

Ugh, and then the book moves on to C++ and has quotes like this, “C++ is the original language of Linux” I’ve used Linux for almost as long as I’ve programmed C, and I am very (perhaps overly?) sensitive to the difference between C and C++.

OMG what do you mean Speech Input and Output? Really?  Chapter 3 tackles it. Really. For real. Speech Input and Output on that tiny little board. I can make my own Siri! This is a really cool topic; espeek is something I’ve only played with a little bit prior to reading this. It looks fun.

Speech recognition is done with software I’ve never used before called PocketSphinx. It isn’t packaged and so one has to compile it. Pretty sweet BBB being able to compile stuff like that. (I’m thinking of iOS and Android where I’ve not seen a compiler run on device.) The demo walks through limiting the grammar of speech input so that you don’t have to train the recognizer.

I’m a programmer, so I’m going to nitpick programmer things. I really wish authors wouldn’t do this, “I like to make a copy of the current file into continuous.c.old, so I can always get back to the starting program if it is required.” I really do wish authors would just say “go read about version control systems.”

Whew, speech is fun. Next step is video. Hook up a webcam and let’s do some image recognition. The book walks through OpenCV and it is as this point that we are forced to do a bunch of Linux sysadmin stuff to make our SD have enough free space to have a dev environment. This really could have gone anywhere in the book. I kind of like that it put it off until it was necessary.

The python image tracking example using OpenCV looks pretty cool. It is a complete example without going too deep or going off in the weeds.

Making the Unit Mobile introduced me to mobile platforms. The Magician Chassis that the book shows first, I found online for under $20! I knew that this stuff was accessible, but this is downright cheap. I feel almost guilty NOT getting one and trying it out.

The motor controller tutorial looks very straightforward. I already have ideas for code changes. Immediately after the simple time based tutorial it goes into speech controlled movement, which is pretty sweet.

After the wheeled robot tutorial is a walking robot example. The author makes a compelling argument for this type of robot, and the Pulse Width Modulation servo motors are cool, but I have to admit, this type of robot just doesn’t excite me. The book also punts on the PWM, using a controller which interprets serial USB commands into the PWM for the servos. For beginners, this is certainly the right choice.

Incidentally, the –help output from UscCmd includes Version, Culture, PublicKeyToken values like a Mono program might. I wonder if it is written in C# and running via Mono. I’m going to assume it is. That is pretty sweet. Indeed the linked download page mentions C#. http://www.pololu.com/docs/0J40/3.b

The sonar sensors section is a straightforward and great introduction to the use of them. I never knew how those things worked or what kind of value they returned. Now I do. Mounting the sensor to a survo makes for a nice subsystem on the bot.

Next, a fully remote control system is built. I don’t know if I like the choice of using an LCD monitor. It seems like overkill, but depending on the particular robotic application it would be a good choice. For the applications I have in mind, I think I’ll skip it. A wireless usb keyboard and mouse makes for an obvious choice. At this point, I just keep thinking about bluetooth and using an extra Wiimote, mostly because I think it would be a more fun control.

Oh, a GPS receiver! This could be necessary for when I lose my robot in a parking lot or the woods. As with the LCD Monitor and KB chapter, I kind of feel like I know how to do this since I’ve looked into it before. It is great coverage and good intro to the topic.

Much of my day job is what would traditionally be called Systems Programming so Chapter 10 is kind of a duh to me. I’d have started there, but that is just how I think about coding these days. Its great to have this in a chapter to tie some things together. In other words, read this chapter!

Using the BBB in sea, air and submarine applications is an interesting idea. I don’t think it is for me yet, but the book gives introduction to some ideas on the topic. The introduction to feedback control is very welcome.

Overall this is a great book. It really gave me a lot of ideas. It also showed me how easy it is to get started, something which I’d been a little hesitant to do. I’m actually a little excited to dive in now. I’ll be doing a bunch of this stuff with my 6yo over the next few years.

I recently read a post by someone lamenting the thanklessness a programmer gets. I once worked in IT where services are really considered a utility. No one calls the utility company unless there is a problem. Have you ever called your electric, phone, or gas company to thank them for the great service? I didn’t think so. This was my response:

Sounds like a bad environment. For a long time now, I’ve worked on teams where we are our own worse critic and where I’ve received more thank you emails than criticizing emails. That said, I don’t consider error reports to be criticizing emails. They are just that, a report of something which went wrong. Things always go wrong, not just in programming. In business and in life, something will always go wrong. How you respond to the wrong doing can largely influence your happiness as a human being.

Sometimes mind shift has to happen to really make this effective. Things like http://www.c2.com/cgi/wiki?EgolessProgramming can help you remember that you are not your code. Error reports mean that someone care about what you created and wants to help you make it better. That is awesome. I’d love much but maybe not too much of that kind of feedback.

Setting up a new mac…

3 months ago I started using OSX full time. Today I found myself setting up a new mac. I wished that I had a checklist of my personal must haves. This is that list.

XCode (from AppStore)
Firefox Aurora
Chrome dev channel
EnvyCodeR font
iTerm2 (and configure with EnvyCodeR font)
twitter (only in AppStore)
brew — /usr/bin/ruby -e “$(curl -fsSL https://raw.github.com/gist/323731)”
KeePassX
growl
MenuMeters
copy my ssh keys and load them into my ssh-agent
copy my .vimrc and .vim dir
copy my .bash{rc,_profile}
Squeezeslave

Scala 2.9.1 on Fedora 16

yum install scala on Fedora will grab all the dependencies, including a JVM, but its a pretty old scala.

Luckily it is pretty easy to install scala-2.9.1 by snagging it from rawhide, but just the RPMS only get you so far. Fedora seems to be changing their JAVA_HOME in 17. A little hack, and you are off and running.

  1. sudo yum install scala
  2. sudo curl -O http://mirror.us.leaseweb.net/fedora/linux/development/rawhide/x86_64/os/Packages/j/jline2-2.5-5.fc17.noarch.rpm
  3. sudo curl -O http://mirror.us.leaseweb.net/fedora/linux/development/rawhide/x86_64/os/Packages/s/scala-2.9.1-3.fc17.noarch.rpm
  4. sudo yum install jline2-2.5-5.fc17.noarch.rpm scala-2.9.1-3.fc17.noarch.rpm
  5. rpm -ql scala | grep bin | xargs sudo perl -pi.orig -e ‘s@JAVA_HOME=/usr/lib/jvm/java-1.6.0/@JAVA_HOME=/usr/lib/jvm/jre-1.6.0/@’

 

Ubuntu testdrive networked to your LAN

testdrive uses the -net user feature of kvm by default, which is really cool because it becomes a lan client and magically gets internet via proxy. If you want to test server software, you probably want your testdrive VM directly on the same LAN as your host OS.

In my case I already had a bridge setup so it was as simple as changing the -net option on my kvm command line.

kvm -m 1024 -smp 2 -cdrom /home/jrwren/.cache/testdrive/iso/ubuntu_precise-desktop-amd64.iso -drive file=/home/jrwren/.cache/testdrive/img/testdrive-disk-43F4RO.img,if=virtio,cache=writeback,index=0,boot=on -usb -usbdevice tablet -net nic,model=virtio -net tap -soundhw es1370 -vga cirrus -vnc 127.0.0.1:1 -k en-us

 

brctl will now show you the new tap device added to your bridge.

bridge name     bridge id               STP enabled     interfaces
br0             8000.001fd085d98b       no              eth0
eth2
tap0
tap1

The only drawback is that kvm has to be run as root. There is a way around that by specifying a network interface start script which would be suidroot, but for a personal system or testing development system, I find that overkill. I let her run as root.

I still like wired networks

I needed to archive 472MB of photos onto the home file server so that my wife could access them.

Over wifi, I got an estimate of 35minutes. Yes this is horribly slow, even for a 54Mbit “G” speed network.

So I plugged in the CAT5 cable, I disabled wifi on my laptop and I pressed refresh in windows explorer so that SMB2 was now talking on the wired network.

I performed the exact same drag and drop to copy the files and it was done in 5 seconds, almost faster than I could expand the Windows 7 copy dialog and see the transfer rate of > 50MBytes/second.

I can’t use var in my foreach loop

A month ago, I asked a coworker to implement IEnumerable<blah> on a blahCollection type that we had implemented back in 1.1. We had only recently moved to the C# 3.0 compiler for this project and I was a little surprised that I wasn’t able to use the var keyword inside a foreach statement of this type. (I could use it, but it types the object as object instead of a strong type, which is effectively “cannot use it”.)

Its a combination of “we used to implement our own iterators” and the way the foreach finds the GetEnumerator method. foreach doesn’t actually work off of IEnumerable or IEnumerable<T>. It just looks for a GetEnumerator method. So when you implement IEnumerable<T>, foreach won’t find it if it is an explicit implementation. It needs to be an implicit implementation. But this will conflict with the old IEnumerable implementation, and so the change is a break in binary compatibility. Its a small price to pay for use of new language features.

note: Bill Wagner told us all of the above but wrapped it in a <guess> tag when he emailed us.

I wrote a test to show the behavior. Huge thanks to someone (I don’t recall who) in #csharp on freenode who helped me in creating the CompileTimeType method. Its very different to me to use the compiler in this way.

using System;
using System.Collections.Generic;
using System.Collections;
using NUnit.Framework;
namespace Scratch.IEnumerableFixtures
{
    [TestFixture]
    public class foreachFixture
    {
        [Test]
        public void implicitIsStrong()
        {
            foreach(var item in new I())
                Assert.AreEqual(typeof(int), CompileTimeType(item));
        }
        [Test]
        public void explicitIsWeak()
        {
            foreach (var item in new E())
                Assert.AreEqual(typeof(object), CompileTimeType(item));
        }
        [Test]
        public void noInterface()
        {
            foreach (var item in new N())
                Assert.AreEqual(typeof(object), CompileTimeType(item));
        }
        [Test]
        public void noInterfaceGeneric()
        {
            foreach (var item in new NG())
                Assert.AreEqual(typeof(int), CompileTimeType(item));
        }
        public Type CompileTimeType<T>(T item) { return typeof(T); }
        class I : IEnumerable<int>, IEnumerable
        {
            public IEnumerator<int> GetEnumerator() { yield return 1; }
            IEnumerator IEnumerable.GetEnumerator() { yield return 1; }
        }
        class E : IEnumerable<int>, IEnumerable
        {
            IEnumerator<int> IEnumerable<int>.GetEnumerator() { yield return
1; }
            public IEnumerator GetEnumerator() { yield return 1; }
        }
        class N { public IEnumerator GetEnumerator() { yield return 1; } }
        class NG { public IEnumerator<int> GetEnumerator() { yield return
1; } }
    }
}

VS2k8 and VS2k5 so close… so far away…

Expanding on some thoughts which I put in reply to http://igloocoder.com/archive/2007/12/12/opening-vs2k5-.net-2.0-projects-in-vs2k8.aspx 

The issue isn’t that Visual Studio 2008 (VS2k8) has “sweet compiler sugar that allows you to use the new language features in .NET 2.0, 3.0 or 3.5″.

VS2k8 is ALWAYS using the C# 3.0 compiler. PERIOD. done.* C# 3.0 code ALWAYS compiles down to IL which will run on the 2.0 runtime (there is no newer runtime).

So the “2.0, 3.0, 3.5″ combo box is really just a filter for what assemblies you reference. Have you referenced WPF? Then studio (msbuild) will warn you that this is not a 2.0 target, and to use 3.0.  Trying to use LINQ or something else from System.Core? You will get a warning to use 3.5.

I’ve done this, and I was (like the igloo coder) a little surprised at what I saw. Then I went and clicked “3.0″ and things worked. But it was just an assembly reference that did it. It is nice if you have to deploy to Windows 2000 servers or workstations which only have 2.0 runtime and cannot move to 3.0, or if you target XP machines which can’t install 3.0 or 3.5. But it isn’t the ultimate in 2005 to 2008 migration for which some of us were hoping.

What is a bummer is that all the nice languages features such as auto properties and use of ‘var’ will not ever work in VS2k5. So even though the project format is portable, its a bit useless. This bit me too. I had left a project set at 2.0, and I just started coding in 2008. That damn ‘var’ implicit typing just saves on keystrokes so much that I use the heck out of it. The next day I openned up the 2k5 solution, which openned the same project and now my project didn’t compile. OOPS. Luckily I hadn’t defined any new types using the nice property syntax. I would have cried given all the extra typing I had to do. My fingers hurt from this rant.

* Ok, so ASP.NET can be told which compiler to use, but arguably that isn’t VS doing the compile then, it is ASP.NET doing the compile. Maybe there is an MSBuild target which I can specify which will let me use the old 2.0 compiler so that my use of ext methods, var and property syntax is caught?

February AADND meeting on Wednesday the 14th.

Jennifer Marsman and Drew Robbins, Developer Evangelists for
Microsoft’s Heartland District, will be speaking at the Ann Arbor .NET
Developers Group
on Windows Presentation Foundation with talks entitled “3D
Graphics in the Windows Presentation Foundation” and “Layouts,
Styles and Templates in Windows Presentation Foundation”. They decided
that they would team-up for the meeting with Jennifer covering our tutorial
session and Drew the main. If you are looking for a jumpstart on WPF, don’t
miss AADND on February 14th starting at 6:00 pm at the Ann Arbor IT
Zone Spark Central located at 330 E. Liberty, Ann Arbor, MI 48104.

 

Tutorial with Jennifer Marsman: 3D Graphics in the Windows Presentation
Foundation

 

The Windows Presentation Foundation is Microsoft’s
unified presentation platform for Windows.  WPF provides an integrated set
of APIs allowing the developer to create 2D and 3D content with ease. 
Developers and designers can construct scalable, high-quality content in both
two and three dimensions using WPF’s advanced vector-based rendering
system.  In this session, we will discuss how to create 3D graphics in WPF.

 

Main Session with Drew Robbins: Layouts, Styles and
Templates in Windows Presentation Foundation

 

Windows Presentation Foundation is Microsoft’s unified
presentation subsystem for Windows, which enables developers and designers to
create visually stunning user experiences. One powerful feature of Windows
Presentation Foundation is the separation of the appearance of controls and the
behavior of controls. In this session, we’ll look at the power of layouts,
styles and templates and how you’ll use them in your applications. We’ll also
look at the underlying concepts that make them work and how you can use them to
compose your own WPF components.