Ask Your Question
0

Connecting ROS to Arduino Serial Port

asked 2018-06-13 16:14:07 -0500

Prasanth Suresh gravatar image

updated 2018-06-13 19:05:08 -0500

jayess gravatar image

Hi,

I'm using ROS-Indigo on Ubuntu 14.04. I have ROS properly installed, sourced and dependencies configured properly (wiki.ros.org/indigo/Installation/Ubuntu). I have arduino installed and ROS libraries setup perfectly ( https://www.arduino.cc/en/Guide/Linux ) (wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup) (wiki.ros.org/rosserial_arduino/Tutorials).

Now, my arduino stand-alone works perfectly, I tested that with a servo motor.

I did the following steps:

  1. Dumped the example servo motor program into arduino without any changes.
  2. Started roscore.
  3. When I tried connecting ROS with arduino using this command:

    rosrun rosserial_python serial_node.py /dev/ttyUSB0

I get this error:

[INFO] [WallTime: 1528924023.535404] ROS Serial Python Node
[INFO] [WallTime: 1528924023.543175] Connecting to /dev/ttyUSB0 at 9600 baud
Traceback (most recent call last):
  File "/home/prasanth/catkin_ws/src/rosserial/rosserial_python/nodes/serial_node.py", line 88, in <module>
    client = SerialClient(port_name, baud, fix_pyserial_for_test=fix_pyserial_for_test)
  File "/home/prasanth/catkin_ws/src/rosserial/rosserial_python/src/rosserial_python/SerialClient.py", line 358, in __init__
    self.port = Serial(port, baud, timeout=self.timeout, write_timeout=10)
TypeError: __init__() got an unexpected keyword argument 'write_timeout'

I tried using this alternate command:

rosrun rosserial_python serial_node.py /dev/ttyACM0

and adding different baud rates to the end like:

rosrun rosserial_python serial_node.py /dev/ttyACM0 _baud:=38400

I couldn't find any help for this problem online. Without crossing this step, I cannot progress to

rostopic pub servo std_msgs/UInt16  <angle>

I'm following this tutorial for the steps: http://wiki.ros.org/rosserial_arduino...

Kindly help, Prasanth.S.S

edit retag flag offensive close merge delete

Comments

Could you show the setup part of your code, I had a similar issue due to a bad configuration of the serial communication(s). Also you can try rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 to launch the node.

RicHykkie gravatar imageRicHykkie ( 2018-06-15 02:26:00 -0500 )edit

Hi Ric,

Assuming you mean the setup of the arduino code, I'm using the exact sample code that is in the library:

void setup(){ pinMode(13, OUTPUT);

nh.initNode(); nh.subscribe(sub);

servo.attach(9); //attach it to pin 9 }

Prasanth Suresh gravatar imagePrasanth Suresh ( 2018-06-15 14:48:30 -0500 )edit

Try adding

Serial.begin(9600)

This should open the serial connection with the Arduino.

RicHykkie gravatar imageRicHykkie ( 2018-06-17 00:45:51 -0500 )edit

Hi Ric, I tried that, it didn't make any difference, so just for debugging sakes, I tried commenting out the line that was mentioned in the error above and now I get this: self.port.flushInput() AttributeError: 'SerialClient' object has no attribute 'port'; Does any of this mean anything to you?

Prasanth Suresh gravatar imagePrasanth Suresh ( 2018-06-17 15:48:41 -0500 )edit

Regarding what you've done, it's normal. Line 358 of SerialClient.py goes:

self.port = Serial(port, baud, timeout=self.timeout, write_timeout=10)

If you comment it, the class SerialClient has no more port data defined, hence the error.

I'm still looking at your issue.

RicHykkie gravatar imageRicHykkie ( 2018-06-19 00:05:05 -0500 )edit

This same line in my SerialClient.py is: self.port = Serial(port, baud, timeout=self.timeout*0.5)

Be aware that I'm using lunar and 16.04, but that might be related to your issue.

RicHykkie gravatar imageRicHykkie ( 2018-06-19 00:07:08 -0500 )edit
2

try changing write_timeout to writeTimeout. I am not sure about this but you can try. From what I read its different for py2.7 and py3.0. Try it and let me know.

PratNag gravatar imagePratNag ( 2018-06-19 13:49:18 -0500 )edit

I shall try that asap and get back to you, thanks.

Prasanth Suresh gravatar imagePrasanth Suresh ( 2018-06-19 13:53:11 -0500 )edit

3 Answers

Sort by ยป oldest newest most voted
0

answered 2018-06-14 01:22:06 -0500

saurabh gravatar image
  1. Please confirm your cable is working.
  2. Arduino usually makes ttyACM0 only, as much as I know.
  3. Give permission to this interface using below command:

    sudo chmod 777 /dev/ttyACM0

  4. Were you able to flash the code?

  5. You have to run roscore in a separate tab as well.

Saurabh

edit flag offensive delete link more

Comments

Hi, thank you for the prompt reply, here are the answers to your questions:

1.) Yes, my cable is working, because I used the same cable to test arduino stand-alone to control a servo motor. 2.) Yes, you are right, I tried both ACM0 and USB0, but neither of them cause any change in the error.

Prasanth Suresh gravatar imagePrasanth Suresh ( 2018-06-14 10:13:34 -0500 )edit

I also tried adding baud rate to the end, like, rosrun rosserial_python serial_node.py /dev/ttyACM0 _baud:=9600. That doesn't help either. 3.) I did give it all the permissions now, that didn't change anything. 4.) Yes, I was able to flash the code successfully. 5.) Yes, roscore is in a seperate tab

Prasanth Suresh gravatar imagePrasanth Suresh ( 2018-06-14 10:14:43 -0500 )edit

Are you sure that arduino is connected to ACM0? You can see the serial port name as /dev/USBx or /dev/ACMx in the arduino IDE. Please check that once and use that.

PratNag gravatar imagePratNag ( 2018-06-19 13:30:24 -0500 )edit

@PratNag, yes, I made sure of that.

Prasanth Suresh gravatar imagePrasanth Suresh ( 2018-06-19 13:33:20 -0500 )edit
0

answered 2018-06-21 04:32:56 -0500

PratNag gravatar image

So that happens due to differences in libraries for Python 2.7 and Python 3.0. The tutorials are based on Python 2.7 so be careful of that.

edit flag offensive delete link more
0

answered 2019-06-11 01:33:19 -0500

ojboba gravatar image

ROS-Indigo on Ubuntu 14.04 is a pain. The reason it doesn't work is because in Indigo "write_timeout" was in camel case being "writeTimeout". If you change the code and replace "write_timeout" with "writeTimeout" that should do the trick. You could also just upgrade to kinetic or higher and that should solve your problem as well.

Have a nice day.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

Stats

Asked: 2018-06-13 16:14:07 -0500

Seen: 1,568 times

Last updated: Jun 21 '18