ROS和arduino连接掉线,Lost sync with device, restarting...

2016-11-091.3万
AI 快速预览详细 收起
本文讨论了在使用Arduino发布nav_msgs/Odometry类型主题时遇到的“Lost sync with device, restarting...”错误。通过去掉“odom_pub.publish(&odom);”语句可以解决该问题。文章详细分析了问题的原因,并提供了具体的解决方法。
我的Arduino板子发布nav_msgs/Odometry类型主题以及tf变换,每当我打开节点时会出现一个错误,错误如下:
[ERROR] [WallTime: 1478676771.744104] Lost sync with device, restarting...
有趣的是,我的程序中去掉这一句“odom_pub.publish(&odom);”就不会出现这个错误了,我的程序如下,请各位朋友帮我分析以下,怎么解决,谢谢.
/*
* rosserial Planar Odometry Example
*/

#include <ros.h>
#include <ros/time.h>
#include <tf/tf.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>

ros::NodeHandle  nh;

geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;
nav_msgs::Odometry odom;
ros::Publisher odom_pub("/odom",&odom);
ros::Time current_time;
ros::Time last_time;

double x = 0.0;
double y = 0.0;
double theta = 0.0;
double vx=0.0;
double vy=0.0;
double vth=0.0;


char base_link[] = "/base_link";
char base_odom[] = "/odom";

void setup()
{
  nh.initNode();
  broadcaster.init(nh);
  nh.advertise(odom_pub);
  last_time = nh.now();
}

void loop()
{
  current_time = nh.now();
  double dt=current_time.toSec()-last_time.toSec();
  double delta_x = (vx*cos(theta)-vy*sin(theta))*dt;
  double delta_y = (vx*sin(theta)+vy*cos(theta))*dt;
  double delta_th = vth*dt;

  x+=delta_x;
  y+=delta_y;
  theta+=delta_th;  
   
  // tf odom->base_link
  t.header.frame_id = base_odom;
  t.child_frame_id = base_link;
  t.transform.translation.x = x;
  t.transform.translation.y = y;
  t.transform.rotation = tf::createQuaternionFromYaw(theta);
  t.header.stamp = current_time;
//odometry odom->base_link
  odom.header.stamp=current_time;
  odom.header.frame_id="odom";
  odom.child_frame_id="base_link";

  odom.pose.pose.position.x=x;
  odom.pose.pose.position.y=y;
  odom.pose.pose.position.z=0;
  odom.pose.pose.orientation = tf::createQuaternionFromYaw(theta);

  odom.twist.twist.linear.x=vx;
  odom.twist.twist.linear.y=0;
  odom.twist.twist.linear.z=0;
  odom.twist.twist.angular.z=vth;
  odom.twist.twist.angular.x=0;
  odom.twist.twist.angular.y=0;  
  last_time=current_time;
  broadcaster.sendTransform(t);
  odom_pub.publish(&odom);
  
  nh.spinOnce();
  delay(10);
}

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(4)
southeast_cczu
southeast_cczu
楼主问题解决了吗,我也遇到了同样的问题,求答案
-stark
-stark
简单理解下就是在发布信息的时候,丢失了与硬件的同步导致重启。
试着参照一下官方的程序进行代码修改:http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom
dsweiliang
dsweiliang
@-stark 大神
dsweiliang
dsweiliang
看头像我以为是你@swanglei
dsweiliang
dsweiliang回复swanglei
哈哈哈
dsweiliang
dsweiliang回复swanglei
哈哈哈
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
- 没有更多了 -