Control the iRobot Roomba and read sensor data from 500 series roombas
How to add the Irobot Roomba Movement Panel robot skill
- Load the most recent release of ARC (Get ARC).
- Press the Project tab from the top menu bar in ARC.
- Press Add Robot Skill from the button ribbon bar in ARC.
- Choose the Movement Panels category tab.
- Press the Irobot Roomba Movement Panel icon to add the robot skill to your project.
Don't have a robot yet?
Follow the Getting Started Guide to build a robot and use the Irobot Roomba Movement Panel robot skill.
How to use the Irobot Roomba Movement Panel robot skill
Control the iRobot Roomba and read sensor data. This skill currently works with the 500 series robots and iRobot create. The baud rate and connection type will need to be configured in the settings menu.This robot skill can connect to an iRobot by using either a USB adapter or a microcontroller acting as an EZB (Arduino, etc.). The connection type in the config menu will specify the way this skill communicates with the iRobot. Continue reading below...
Main Window

1) Enable sensor streaming and statistics of received sensor data. This requires a bi-directional connection. See below for different connection types and reading sensor data.
2) Movement directions to drive the robot, and a box to place the mouse cursor which enables using the keyboard arrow keys.
3) The speed for the left and right wheels, which defaults to 0.
4) Commands for initializing the SCI connection, enabling cleaning, stop cleaning, or powering off the robot
5) Status and log data for successful initialization and errors.
Config Window

1) Connection type. Changing this setting will enable the selected connection type configuration below (Software serial, PC COM port, H/W UART). There is more information below in this manual on connection types.
2) Software Serial connection type. This type should only be used if there are no other supported options. This uses software serial on the EZB to emulate a transmitted serial signal. This is not 100% reliable and therefore should only be used if there are no other options. This is a one-way transmission, so sensor data cannot be read.
3) PC COM Port connection type. Uses a PC COM/Serial port that is usually a USB<->TTL convertor or an official iRobot Roomba USB cable (See details below). This is a bi-directional transmission, so sensor data can be read.
4) H/W UART on the EZB. Selecting this will use the HW UART if supported. This allows sensor data to be read because it is bi-directional.
5) NMS (Navigation Messaging System).
a) Enabling the first option in this group will send the iRobot Roomba's current coordinates to the NMS as a Level #3 Group #2 positioning/pose sensor. There is more information about this further in this manual.
b) The second option in this group will Pause NMS navigation if any of the iRobot Roomba sensors are triggered. The sensors covered are: cliff, bumper, virtual wall, and wheel drop
Baud Rates
Different models (i.e. create vs Roomba) use different baud rates. Find your Roomba's version and check it's SCI (Serial Command Interface) or OI (Open Interface) manual to see what baud rate it uses. We believe the Roomba uses baud rate 115200, and the create uses 57600. But, don't hold us to that :). We do notice that older Roomba's use 57600 baud - ensure you have selected the correct baud rate in the config settings. 500+ series Roombas use 115,200 baud. If you are unsure, try each baud rate.
Demo Video
Here's a video of the nice proportional steering that this control provides the iRobot Roomba. This video has the Roomba set to follow Kate's orange socks.
Like all movement panels, only one can exist. In this case, this Movement Panel will connect to a Roomba by its SCI interface. This control allows for a variety of speeds also, so you can use the analog joystick to control speeds. Or use the speed control in the camera to track objects with nice smooth trajectories.
ARC allows multiple physical robot controllers to be connected at once. The Movement Controls only operate on the first board (Board 0) or PC serial port.
Reading Sensor Data
You can read sensor data if the PC COM or HW UART ports are used for the connection. This also requires the TX and RX wires to be connected to the Roomba's SCI port. The data from the sensors and internal values are set as global variables. You can access everything from battery voltage to wheel encoder counts.
SCI Connection Types
The connection types that can be used to connect the Roomba to ARC are:
1. Software Serial (read-only)
2. HW UART (read/write bi-directional two-way)
3. USB COM TTL (read/write bi-directional two-way)
Roomba SCI Cable
The cable can have either TX & RX or just RX connected from the Roomba. However, do note that if only the RX pin is connected, the sensor data will not be read.
Roomba <-> USB <-> PC
This cable will allow reading sensor data. iRobot has a low-cost USB cable that can connect directly to a PC. This is useful if the PC is located within the robot. You can get it from here: https://store.irobot.com/default/parts-and-accessories/create-accessories/communication-cable-for-create-2/4466502.html
Roomba <-> EZB <-> PC (two-way communication)
This cable will allow reading sensor data. This requires a 7 pin Male Mini Din to connect to an EZB I/O Controller. Watch DJ's iRobot Roomba Live Hack to see how to make a cable. The meat of the video starts at 20:00 because the first bit is demonstrating the iRobot Roomba and talking about it. You can find the part numbers and design information for a cable on Synthiam's GitHub repo HERE.
Roomba <-> EZB <-> PC (one-way communication)
The image below demonstrates how to make a cable with RX only. Meaning, the sensor data will not be read by ARC.

Charging After SCI Connection
When the iRobot Roomba is used with this robot skill, the robot will be put into a mode that will not accept charging. The only way to enable the robot to accept charging is to power off or reset using the two buttons on the control. Pressing either the Reset/Power Off or Power Down buttons will play an acknowledge song if successful.

NMS (Navigation Messaging System)
Within the configuration, the menu has an option to enable the NMS (Navigation Messaging System). This will push calculated cartesian position/location (i.e. pose) coordinates into the NMS for use with mapping/navigation tools such as The Navigator. In order to obtain wheel encoder data from the iRobot, a two-way SCI cable is needed (i.e. RX and TX must be connected) and streaming must be enabled.
The iRobot uses wheel encoders (508.8 ticks per revolution) to keep track of the odometry. This robot skill will calculate cartesian coordinates from the wheel encoders and send those values into the NMS. The iRobot's memory will keep the wheel encoder count even when powered off. In order to use the NMS correctly, follow this procedure to clear the iRobot memory and reset the encoder counts.
Get The Navigator robot skill here.
1) Visit the iRobot robot skill configuration screen and enable NMS. Also, ensure your connection type is either PC COM Port or H/W UART because those are the only two that allow two-way communication.
*Optionally, you may select the "Pause NMS navigation with sensor detection" checkbox. This will send a pause signal to the selected NMS Level #1 navigator if any of the sensors are triggered.

2) Connect to the iRobot Roomba and enable Sensor Streaming. Verify packets are being received by the packet count increasing in the Sensor Data status display. This step ensures the cable configuration is correctly receiving sensor data from the iRobot Roomba. If the packet count is increasing, the cable configuration is correct.

3) Now we will press the Reset/Power Off button and the robot will play a little tune acknowledging that it has rebooted and reset internal settings. The Sensor Streamer checkbox will disable as well. This step will instruct the Roomba to reset the wheel encoder values which sets the position to 0 cm x 0 cm (home).

4) Position your iRobot Roomba in the room where 0,0 (home) will be. Good idea to mark the area as well so saved maps can be re-used.

5) Press the CLEAN button once on the iRobot to power on. It should light up.

6) In the robot skill, press the INIT button and then enable Sensor Streaming. Again, verify packets are being received. The robot will play a little tune acknowledging that it has been initialized.

7) If you have The Navigator robot skill added to your project, you will notice the robot will be at location 0,0 (home).

8) You may now right-click in The Navigator and specify waypoints or drive the robot around and view the trajectory. Read The Navigator for instructions on using that robot skill, as it is not covered in this manual.
Accuracy of Wheel Encoders
... or lack of accuracy is a better title. Wheel encoders are not accurate for mapping but will present a general enough position for simple tasks. This is because there are many limitations to wheel encoder odometry, such as gear slop, slipping wheels and real-world velocities are not constant.
As quoted by Andrew Kramer's work based on Edwin Olson's 2004 paper...
Quote:
The larger problem is that odometry is inherently inaccurate. Encoder ticks do not translate directly into distance traveled by the wheel because wheels slip, the wheels aren’t perfectly circular, the ground isn’t perfectly flat, encoder ticks might be missed, and the motor gearbox has a backlash that isn’t accounted for in our model. This means that the position calculated from odometry will gradually diverge from the true position. We could use other methods that might be more accurate, such as optical flow and IMUs. However, any sensor we might use suffers from some inherent random error, known as noise, and this error will accumulate over time.
Great Platform Base
How about using an iRobot Roomba for your robot wheelbase? You can attach a camera and the EZ-B to a Roomba and turn it into a lean mean cleaning security machine! Combine a USB Joystick and the HTTP Remote Server Control... Voila! Remote control security cleaning robot. That's easy!
You can use an iRobot Roomba motherboard as an H-Bridge to drive your custom motors. This gives your robot the ability to self-charge. By positioning the IR sensors on your robot in the same fashion as the Roomba, your robot can easily dock with the Roomba's self-charging base.
Related Hack Events
Related Questions
question

Adding The Caster And Extra Storage To Roomba
I printed the extra storage container on the roomba but when I went to install it I had to remove the guts of the robot....
question

Roomba Can´T Connect To PC Without EZ-B
Any one else who uses the roomba with this problem?
question

UART TX On Iotiny
Hmm the Tx pin not the same on Tiny? I had working to roomba with EZBv4 but on tiny it saying the tx not supported on...
Upgrade to ARC Pro
ARC Pro will give you immediate updates and new features needed to unleash your robot's potential!
This roomba robot skill has an option to use the PC COM port. Look in the configuration screen to see the settings available
I can indeed see a lot of Roomba-related variables when I am connected, however I don't know how to "interpret" them or use them in an "informative" way.
For example, for charging status, i can see in the Variable Watcher:
Code:
How can I use the variable to obtain the charging state (Not Charging, Full Charging, Charging Fault, etc.)?
I have the same difficulty with a lot of other variables and I cannot make the link with info available in the Roomba OI manual...
Sorry if the info is somewhere on the website.
Thanks
Does the value change when for example you charge the robot or not?
I have tested some of them in my different scripts and everything works smoothly.
So many variables to play with, now...
DJ will know better, but to my knowledge, 500 and 600 series are quite the same. At least the Open Interface (OI) Specifications are the same, so I think the hack and the Roomba Movement Panel should work just fine.
I just got the IRobot usb To roomba cable. I want to read and write to the roomba and use a PC on board the robot to control it. I’m reading this thread. When I go to the link for the roomba manual it does not link to the manual. Am I missing something?
All references to the word manual on the Synthiam website get linked back to the Docs section of the website.
@DJ was referring to looking at the manual specific to the Roomba you own. For the 400 models you'll need the Roomba SCI (Serial Command Interface) manual, for the 500 Series you'll need the Roomba OI (Open Interface) manual, for the 600 series/Create 2 series the OI manual is available and looks very similar to the 500 Series. From what I've read the 700 & 800 series of Roombas have SCI ports as well and use the same Open Interface as the 500 series.
Edit----I must need some coffee, I just realized I can simply leave the EZBv4 on top beside the Panda and still use my Favorite EZ Cam!xD
All you need is to connect the cable to the computer and select the port in arc. It’ll start working.
no need to worry about technical jargon is the Synthiam way
Well I watched the video about 4 times and I realized uart connection is different. As I got the roomba to connect using the supplied serial to usb cable so this is only for PC connecting right, but it still kept saying EZB connection not found even though I know it is serial port 4 to roomba . my USB cable also has a similar uart extra port on top of the USB wire,am I supposed to connect any wire from that to ezb? Or just the Latte Panda alone with port 4 selected.A bit confused because if Ezb not on it won't connect at all to just mini pc. I Can keep trying as it worked once I turn on Ezb with the http address it connects and finds the roomba in the roomba controls plug in but a few buttons do work for cleaning,init,brush motor on seek charge port but the movement arrows are not working in the left box forward,back,turns.It usually takes me a few hours of trying LoL!Possibly because basic version of ARK?
I guess that was punishment for not getting the Roomba fully moving,so back at it.
So are you saying I don't need the EZB controller at all? ARC always looks for the EZB or it gives connection error if I just put it to ARC Com 4 Connect/wifi button ,for direct Serial to USB cable connection to Roomba.
Now if I do turn on the EZB the first connecting is done using Http address ,connects successfully, Then instead of UART port in the Roomba plugin I pick PC--USB and com 4, Roomba beeps getting good connection, then all the buttons in the plugin work in the Init Box area which is so cool I can control all the cleaning routines and start them up but no control on the left box with 2 sliders and Left right Forward,Back nothing happens? Could this be something as simple as The roomba must be taken out of rest mode or there will be no motor access? I read that somewhere with the Create 2 bots.
It was something so simple ,The 2 sliders were down to low for giving motor power,all good now!!
that would cut the power down from the 12 volt SLA battery to 5 volts or the 7.4 Lipo 5000 also worked with the Panda. Now my only choice is to wire up the EZB with UART directly to Roomba connection. for the Roomba Movement Panel to work.(If you connect any more than 5 volts,Panda will not even start) So I am wondering if I use the serial--USB cable that came with Roomba, can I still just add 2 wires on the cable(it has a header connection) to the TX and RX directly to EZB? and then switch it to UART in the ARC Roomba movement panel,I already found where the 5 volts and main Roomba battery 15v comes out the cable header...
I know it's a shame not to be able to just use the USB cable on Panda,it was working great but now all I got is the EZBv4 to use,OR do I need to make a new cable from scratch like in the video?
Surely do not connect more than 5v to the lattepanda or it'll break.
If you do run the latte panda headless, here's a few tips
1) Save on disk space and improve performance : https://synthiam.com/Support/Install/free-space-with-windows-10
2) Run headless: https://synthiam.com/Support/Install/headless-robot-sbc
also I notice the same with all of mine
Wow checked my battery and it seems to be the more powerful Li Ion battery 14.4 -16.4 volts 3300 mah ...48 wh whatever that means
No wonder I have never seen it run low power,even 45 minutes it still runs strong ,I get bored and push the dock button to send it home for recharge but I have yet to watch it run low and return to nest by itself, 1 and half hour possibly? Will test that. So ya documents say no real power off unless removed.Another nice fact they say you can bypass the 200 Ma limit fuse, by attaching microprocessors like Ezb to the motor,brush or vacuum power connectors for more powerful amps ! Also add power switch then too.
This is interesting because if I just only use Latte Panda I can even have all my other sensors attached to it through the Arduino part on it.
Error message after ControlCommand brushes
Start
ControlCommand Error for 'iRobot Roomba Movement Panel 2' sending 'SideBrushOn'. 'ControlCommand' with parameter SideBrushOn, is not supported for this control (iRobot Roomba Movement Panel 2)
Done (00:00:01.2048716)
So I guess it could be just not yet supported or I am forgetting something simple.
Simple Code I tried was-----
controlCommand("iRobot Roomba Movement Panel 2", "Init");
sleep(1000);
controlCommand("iRobot Roomba Movement Panel 2", "SideBrushOn");
sleep(1000);
controlcommand("iRobot Roomba Movement Panel 2","Init");
sleep(1000);
controlCommand("iRobot Roomba Movement Panel 2", "MainBrushOn");
I probably just need to research the Java coding and see examples of how other people are doing it ,then Make my own scripts, I have not really done any major script writing since 2 years ago but it should be like getting back on a Bicycle once I start doing it ,but got a Doctors appointment later today ,really sucks Just want to keep at this.
Here’s the manual: https://synthiam.com/Support/Skills/User-Interface/Interface-Builder?id=16063
Edit----Also @ DJ , I do appreciate when you chime in to give help. I hate to bother you or Jer when I have problems, I do actually enjoy reading the Forum posts and skill description/help files on my own to figure out what I need. I know you must be so extremely busy with so many other coding issues and running a business, I like knowing that if I try for days and can't figure out something then and only then will I bug you ,LOL!:D
Thxs
@robo rad- Glad you got it working!
Obs: Voltage displays correct now:)
There's also a power off and reset button added
That was just what i was trying to add in the source code. Thanks DJ!!
The encoder values are not yet being sent to the NMS, right?
Got the mobile touch joystick with camera view and init , dock buttons,all works with phone ARC app!
proteusy, the NMS integration isn’t complete. I’ll need some time to figure out how to take the encoder values and concert into Cartesian coordinates
There’s instructions in the manual above on how to calibrate for home position. Be warned that wheel encoder have a large margin of error if this is your first time experiencing wheel encoders.
oh one thing - If you’re interested in navigation challenges of different types,
check the manual for the navigator robot skill. There’s some additional reading links at the bottom
here’s the link: https://synthiam.com/Support/Skills/Navigation/The-Navigator?id=20072
I also provided those links for deeper learning. A large percent of Synthiam users are education and universities. So it’s a good idea to learn and experience the troubles the industry faces.
I only got excited about the intel t265 when I experienced it. And boy I was surprised. I was also mostly surprised that with technology like this, why aren’t more robot companies doing amazing things?!
but then I remember it’s because they want to program from scratch for the ego and bankrupt themselves....
one day the world will get it and ARC will prevail
I am having problems using the roomba encoders. Here is a video first without and last with the encoders on.
- Roomba 560 with FT232 USB UART Board
- Intel Compute Stick STK1AW32SC with windows 10 Home 64bit
- Intel RealSense Tracking Camera T265
- PS3 Eye camera (has a nice 4 mic array)
- Arduino Uno with EZ-Genuino Uno firmware
- 3 HC-SR04 ultra sonic distance sensors with 3d printed supports (thingiverse.com/thing:2592461)
- USB 3.1 4 port Hub (with external power)
- 2 LM2596 1.25...30V 3A voltage converter with display. Both using 5V. One for the PC Stick and the other for the USB hub and the Arduino Uno.
- 4 MR18650 - 3.7V 3500mAh Li-ion Battery giving 7.4 Volts at 7000mAh.
the t265 will be trying to constantly fix the roomba’s pose values. And boy, that would be a mess kol
i suspect you’ll want to use The Navigator for navigation.
I also recommend reading the iRobot roomba manual on how to use the NMS with it. Scroll up to the top and you’ll find the manual
thanks
What does your battery voltage read? It is also a variable...
EDIT----- So I had to try it out and after changing to UART1 Bingo that did it ,started working again, I dont know how many times I watched that video above but every time I do it solves my problem! Saved me from spending about 40 dollars on a new com board, should send DJ a 24 pack now!
I'm glad you worked this through. Well done.
I have a xiaomi that has Lidar, and you can place it on the floor in any room and it figures out exactly where it is.
The android mapping app is so cool...
I guess a paint option on NMS would be nice so you could draw lines in to represent your rooms. Drive to every corner so you get the general location and then play join the dots.
Okay I get it...got to make a new button,label it then I can edit the Command control code for Brush On and save it in mobile Interface window.
---Wow this is really cool, DJ has made it even more easy than ever to start getting all the Roomba codes to work on the Mobile Builder and create my own custom buttons for the mobile Tablet, Using Java script now instead of EZ script, the cheat window makes this so simple to copy and paste for the mobile buttons. Like I always just copied scripts from those before me that uploaded samples but now it is so easy to do my self,I have many cool ideas for the mobile Tablet controls.
Edit-----OKay so the web site just says this code turns on all brushes and vacuum together at 100 percent, good enough.....
SendSerial (D0,115200,138,13
..............I have uploaded a sample program that does turn on all motors and brushes,vacuums floor by touch control on your phone or tablet ,I simply converted sample code from EZB4 UART code into EZB Tiny Serial code using the TX pin at D0 ,No sensors yet but you can use the joystick and video window to remote drive Roomba and Vacuum by touch control using Synthiam ARC Mobile on your device. Search my User name for the App down load, If you have EZB4 or computer then use original program By User Dunning Kruger and download his App for UART version.
Do the internal wheel encoders function as a level 3 group 2 sensor, even if inaccurate?
Also noticing that there seems to be long periods where the plugin stalls and a lot of random variables are output. Eventually it will stabalize
Hopefully, your Roomba wheel encoders aren't damaged. Maybe write a quick javascript that loops and prints the values to check. Something like...
Code:
I did use the advanced variable watcher to verify my encoders are working. I did notice that comms were intermittent and the encoder values will fluctuate wildly quite often. During this time my position start increasing non-stop. The reason I could not see the yellow dot and position movement was because it thought the bot was 75 meters away from (0,0).
So I get initial function and it works for about 30 seconds and will work for another 30 if I reset the roomba.
I’ll add an option to enable debugging to view parsing errors. That can identify noise issues.
If that isn’t it - there must be a firmware version difference and a bug in their firmware.
Encoder and limit switch cables are very susceptible to noise issues.
I used a Ethernet cable I had laying around to rewire with. It had twisted 24awg copper wires, foil wrapping and a drain wire. Just cut off the end connectors and wired it in.
I checked the code and turns out parsing errors are already logged. There is no additional logging or debug I can add. The parsing error you would see is "Missing data. Expecting 80 bytes" if there is a parse error of data.
Are you resetting the roomba before use as in step #3 of the instructions in this manual?
I am connecting via the UART and I built my cable to Jeremy's spec and instructions on your GIT repo.
if the roomba is instructed to move in reverse, for encoders count down from 0 and that is 65545
the encoders values are transmitted in the debug packet that we’re using. that’s the only information we can get from the roomba about the movement
We’re pushing the limits of what’s possible with these things.
The encoder counts are spot on, but every time the value passes from 65545 the position of the robot jumps out of the map. This happens every time the left or right encoder passes this value counting up or down.
remember this is a vacuum you’re using. It’s a vacuum that was made to bounce off walls with a bump sensor.
*Edit: an encoder count is simply an integer value (number). It increments or decrements every time a "tick" from a "switch" on a wheel. The switch is connected to a wire on the MCU which has an interrupt. That means it jumps to that piece of code every time the i/o port switches from high to low or vice versa. When that happens, you simply ENCODER_COUNT++ if it's one way, or ENCODER_COUNT-- if it's reverse.
The trouble with the roomba is the encoder count value is returned, but that's it. So there's no way to "reset it" every time it is read. So when the encoder count continually increases, it eventually wraps the small int16 they're using for the count size. That means in reverse it does the same thing, it can go from 100 to 65300 in one packet. The trouble is there's no way to know what just happened in the time between the last packet and the most recent.
What I "could" do as a hack, is see if the encoder difference is greater than 30,000 and assume it wrapped - then calculate the difference. It's probably not going to work well because the accuracy might be decreased... but the robot won't "jump" on the map. Instead, it'll go to a position that "might be close" lol
There's a lot of information in the NMS page about the challenges with pose telemetry and odometery that have plagued the world of robotics forever. The closest we've come in the industry for inside-out navigation (i.e. the robot uses its sensors) is the intel realsense. Just sucks that it has been discontinued....
The robots used in warehouses and at amazon, etc use outside-in navigation. External sensors tell the robot where it is. This is how the IPS works. I have an item on my todo list to modify the IPS to use a glyph - but that still doesn't help when something is in the way.
Have you tried to use the NMS with a roomba in this configuration? I notice in the hack videos above yo do not use the NMS and on the NMS hack you do it with the realsense camera. It seems we should be able to get something to work with the wheel encoders here.
It would be good to see a floor map from someone that had it working with just encoders. I am not sure if Proto has my basic config or something much better.
I wrote a lengthy and detailed response in the post above.
Also, there's a mention in there about cleaning the encoders really well.
I was thinking maybe we could read the encoder count to two 32bit variables and use that instead. That would give us 2147483647 i think, this number would be enough.
From: https://www.irobotweb.com/~/media/MainSite/PDFs/About/STEM/Create/iRobot_Roomba_600_Open_Interface_Spec.pdf
So I am now wondering if I have an encoder problem or whether this NMS can operate with the Roomba Create2. What is the next step besides all the cameras that keep getting cancelled?