How to get the Cyton Gamma 300 working in ROS

The Cyton Gamma 300 arm from Robai
The Cyton Gamma 300 arm from Robai

Things to know

First thing to know is that you’ll need a 12V battery. Supposedly it works off of a 12VDC wall wart power supply, but for me it seems to have given problems. My suspicion is that it creates a ground loop through the USB (though it’s supposed to be protected against that).

Secondly, the arm’s internal hardware is very simple. It is made up of 7 Dynamixel MX-28 motors. These motors are daisy chained together on a communication bus which goes into a little black box in the base of the arm. Inside the box there is nothing more than a couple decoupling capacitors and a plug for the 12V input supply. According to the manufacturer, the motors can handle up to 18V. I have not tested that, nor is it necessary. From the little black box, there is a 2-wire cable going to the USB2DYNAMIXEL converter (its the white USB dongle). The two wires are ground and data.

Thirdly, if the arm stops responding, it may very simply be that you’ll need to power-cycle the arm (and possibly the USB2DYNAMIXEL). I’m still trying to figure out why that is.

Cyton Software

All the smarts for the arm are in the software that controls it. Cyton’s software is very fragile. There are two aspects to the software: the low-level drivers and the interface to ROS using pieces of the low level drivers.

*EDIT:* I’ve since created a new repository on github ( that integrates the Cyton hardware into ROS without the use of the Cyton software. It’s more stable and simpler to use. Hopefully it can perform faster too since it doesn’t have to go through all those extra layers of abstraction.

Low level drivers

To get these working, you must have the script. It essentially extracts its self and contains the proprietary Cyton drivers and ActinSE. It also gives some example code for getting communication up with the arm. I have taken one of these and made a super-simple one that makes the arm go to its ‘home’ position which is straight up. You can access it here: cytonAndras.tar.gz. The simplest way to compile it is to add it into the Robai/Cyton\ Gamma\ 300\ Viewer_4.0.20130130/cyton/examples folder and modify the Makefile in the parent folder.

Once you have the drivers compiled, you should test with the cytonAndras executable first. You’ll read online about cytonViewer and how it’s an amazing tool for testing this arm, but in my experience it is a buggy program that sometimes loads but mostly gets stuck in some infinite loop on startup if you have the arm connected. If you’re on an Ubuntu system, you’ll need to add your user to the ‘dialout’ group so that when you plug in the USB you’ll have permissions to the /dev/ttyUSB0 device. Otherwise you’ll need to do “sudo chmod ugo+rw /dev/ttyUSB0” each time you plug the USB into the computer.

ROS Interface

The interface files are available at the following git repository: You can get it by doing a “git clone” on the local machine. There is a setup video that you could watch, but it’s pain to watch, and it’s a lot easier if you run the shell script I’ve created located here: cytonInstaller.tar.gz. Just extract the tar file, put the Robai folder in the extracted folder and run the ‘’ and you should be fine.

If you have problems with functions with too many parameters (in cyton_move.cpp) you’ll have to remove the extra parameters so that the line looks like:
passed &=hardware.setJointCommands(angles,jointRates);
Another problem you’ll find is with template classes. In actinSE_node.cpp you’ll have to rename the occurrences of ControlSystem::JointAngles with ControlSystem::JointAngle. Same thing for ControlSystem::JointVelocities to ControlSystem::JointVelocity. That should make it so you can compile.

Cyton files

There are several strange files in Cyton. In this section, I’ll attempt to explain what my findings are for each.


This is a gzip compressed file containing a giant XML file for the model of the arm. Big shoutout to Gert Kanter (gert at cs dot ttu dot ee) for helping me find out about details to many of the secrets to the Cyton arm. If you follow this forum (!msg/cyton-robots/GLcqKvljFRg/8-z3CTu9iXMJ) you should be able to get the DAE file extracted using the script they talk about.


If you don’t have one of these, create one with “cytonCreateConfig –gamma300”. You can then tweak settings like the default port to look for the arm on. It’ll be at the end of the file under the ‘port’ tag.


I have no idea what this file is at this time, but it seems to be necessary for the ROS interface.

*EDIT:* I’ve found out that the guide_frame.txt is just a file that the Cyton code reads in to make the arm move to some predetermined locations. So if you’re not using the guide_frame_node then you won’t need it and you won’t need to set the CYTON_EE_FILE variable.

This page is also available on the UNH AI Wiki page, but just in case it gets deleted or relocated from there, I wanted to make it available here.

Liked it? Take a second to support me on Patreon!

2 thoughts on “How to get the Cyton Gamma 300 working in ROS

  1. Hello,

    First of all I would highlight that I am in a learning phase of moveit. Till now I successfully managed to integrate a Cyton Gamma 1500 arm in Rviz/moveit, but unfortunately I am not able to control separately the gripper.
    In order to access it within moveit, I created two groups (1 for the arm and 1 for the gripper) and I managed to make the group for the arm to run correctly, but when I select the gripper and try to move it it reads and executes only the value that is in the cyton_controller.yaml and not the value from Rviz.

    I think that that I used the wrong type and module for the gripper, even if no error pops out.
    I saw on the github that you used the “gripper action” in the gripper controller group.
    Could you please tell me how to define gripper_action and gripperCommand?
    I can send you my work so far on email if you would want.


    1. Hi Loachim,

      You should take a look at my github: I’ve since moved on from the buggy cyton software. There is someone who made a dynamixel ROS interface that I used in my repo. In the repo, I’ve gotten pretty close to getting it all hooked up together, but I ran out of time and am no longer maintaining that project. What I can recommend is for you to take a look at Baxter’s code, because they also use the gripper_action. Perhaps it’s a module they provided for their robot in which case you could probably just use the same thing.


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.