Unable to sync with arduino
Hi all
I'm really new to ROS, Robotics and electronics and I'm figuring out things just now. I built a code for a basic sense and avoid. I have a cpp file, launch file, CMake file and package xml file. after I catkin make and use roslaunch, I get the error " Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserialpython with groovy Arduino". I tried suggestions of baud rate, USEUSBCON and I also reinstalled rosserial and made sure its all kinetic (UBUNTU 16.04). I also changed the cable and checked on the basis of one suggestion. Still this problem persists. I have attached all my files. Kindly help even if i have made a stupid mistake.
Thank you
CPP file:
#define USE_USBCON
#include <ros/ros.h>
#include "geometry_msgs/Twist.h"
#include "std_msgs/UInt64.h"
#include "std_msgs/Int16.h"
#define LINEAR_SPEED 1.4
#define ANGULAR_SPEED 4.0
#define TURN_DURATION 500
#define REVERSE_DURATION 400
#define OBJECT_DIST_NEAR 30
#define OBJECT_DIST_SAFE 60
enum STATE { FORWARD, REVERSE, TURN };
class SenseAndAvoid
{
public:
SenseAndAvoid();
private:
void leftEncoderCallback(const std_msgs::UInt64::ConstPtr& msg);
void rightEncoderCallback(const std_msgs::UInt64::ConstPtr& msg);
void sonarCallback(const std_msgs::Int16::ConstPtr& msg);
ros::NodeHandle nh;
ros::Publisher vel_pub;
ros::Subscriber left_encoder_sub;
ros::Subscriber right_encoder_sub;
ros::Subscriber sonar_sub;
geometry_msgs::Twist vel_msg;
long left_count, right_count;
long last_count;
STATE state;
};
SenseAndAvoid::SenseAndAvoid()
{
left_encoder_sub = nh.subscribe<std_msgs::UInt64>("/arduino/encoder_left_value", 10, &SenseAndAvoid::leftEncoderCallback, this);
right_encoder_sub = nh.subscribe<std_msgs::UInt64>("/arduino/encoder_right_value", 10, &SenseAndAvoid::rightEncoderCallback, this);
sonar_sub = nh.subscribe<std_msgs::Int16>("/arduino/sonar_2", 10, &SenseAndAvoid::sonarCallback, this);
vel_pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10);
state = FORWARD; left_count = 0; right_count = 0;
}
void SenseAndAvoid::leftEncoderCallback(const std_msgs::UInt64::ConstPtr& msg)
{ left_count = msg->data; }
void SenseAndAvoid::rightEncoderCallback(const std_msgs::UInt64::ConstPtr& msg)
{ right_count = msg->data; }
void SenseAndAvoid::sonarCallback(const std_msgs::Int16::ConstPtr& msg)
{
if(state == FORWARD && msg->data < OBJECT_DIST_NEAR && msg->data > 5)
{
ROS_INFO("REVERSE");
state = REVERSE;
vel_msg.linear.x = -LINEAR_SPEED;
vel_msg.angular.z = 0;
last_count = left_count;
}
else if (state == FORWARD)
{
vel_msg.linear.x = LINEAR_SPEED;
vel_msg.angular.z = 0;
}
else if(state == REVERSE && msg->data > OBJECT_DIST_SAFE && left_count > REVERSE_DURATION + last_count)
{
ROS_INFO("TURN");
state = TURN;
vel_msg.linear.x = LINEAR_SPEED / 2;
vel_msg.angular.z = -ANGULAR_SPEED;
last_count = left_count;
}
else if (state == TURN && left_count > TURN_DURATION + last_count)
{
state = FORWARD;
ROS_INFO("FORWARD");
vel_msg.linear.x = LINEAR_SPEED;
vel_msg.angular.z = 0; } vel_pub.publish(vel_msg);
}
int main(int argc, char **argv) { ros::init(argc, argv, "sense_and_avoid");
SenseAndAvoid sense_and_avoid;
ros::spin();
}
CMake:
cmake_minimum_required(VERSION 2.8.3)
project(lab2_sense_and_avoid)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
cv_bridge
image_transport
)
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs cv_bridge image_transport
)
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(sense_and_avoid src/sense_and_avoid.cpp)
Asked by srivats2794 on 2017-05-05 16:38:25 UTC
Comments
Can you edit this to have proper code indentation so it formats properly? It's hard to follow as-is.
Asked by jwhendy on 2017-05-16 22:02:21 UTC
Thanks for your reply. I have edited as much as possible.
My problem is When I connect using rosrun rosserial_python serial.node.py to my arduino it connects when the baud rate is 57600 but not at 115200. So I even included the baud rate as 57600 in my ROS launch file. But even that doesnt help.
Asked by srivats2794 on 2017-05-17 15:06:24 UTC
This is typically a problem with your arduino code or the launch file that launches the rosserial_python node; it would help if those were included in your question.
Asked by ahendrix on 2017-05-17 17:48:15 UTC
To clarify, you're saying that you can
rosrun
directly, just notroslaunch
? In that case, I agree with @ahendrix... the launch file would seem super pertinent here. Since you can connect, it's probably not the case, but permissions to/dev/tty/ACM0
can be a source of trouble sometimes.Asked by jwhendy on 2017-05-17 20:30:32 UTC
this was my original launch file
Asked by srivats2794 on 2017-05-18 09:24:30 UTC
Then when my baud rate wasnt matching I added 2 more lines:
Asked by srivats2794 on 2017-05-18 09:26:09 UTC
And @jwhendy my
rosrun
is working if i run at 57600 baud rate but not at 115200. I made sure I had permissions for/dev/tty/ACM0
so that isnt the problem.Asked by srivats2794 on 2017-05-18 09:30:51 UTC
Silly question (but no
.ino
file to examine): what are you putting inSerial.begin(xxx);
?Asked by jwhendy on 2017-05-18 17:09:12 UTC