rosserial_arduino学习笔记6《Using Time and TF》

1 在Arduino上使用Time和TF

rosserial_arduino包中包含用于在Arduino上生成时间戳的库,这些时间戳与运行在roscore的PC/Tablet同步。

本教程使用发布tf转换的示例演示如何访问时间。

1.1 程序

如果您已经按照Arduino IDE安装教程,您将能够通过从Arduino示例菜单中选择ros_lib - > TimeTf来打开下面的sketch。

这应该在IDE中打开以下代码:

/* 
 * rosserial Time and TF Example
 * Publishes a transform at current time
 */

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

ros::NodeHandle  nh;

geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;

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

void setup()
{
  nh.initNode();
  broadcaster.init(nh);
}

void loop()
{  
  t.header.frame_id = odom;
  t.child_frame_id = base_link;
  t.transform.translation.x = 1.0; 
  t.transform.rotation.x = 0.0;
  t.transform.rotation.y = 0.0; 
  t.transform.rotation.z = 0.0; 
  t.transform.rotation.w = 1.0;  
  t.header.stamp = nh.now();
  broadcaster.sendTransform(t);
  nh.spinOnce();
  delay(10);
}

1.2 程序解释

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

我们需要包括我们典型的ROS头文件以及坐标变换中的transform broadcaster头文件。

time.h这个头文件没有使用,而是使用nh.Now()。

geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;

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

接下来,我们实例化要使用的TransformStampe类以及一个broadcaster类。指定我们需要转换的参考系名称。

 broadcaster.init(nh);

在setup()函数中,我们必须在TransformBroadcaster上调用init(),并将节点句柄作为参数。这个很不常见。

如果不这样做,broadcaster将无法正确发布。

 t.header.frame_id = odom;
  t.child_frame_id = base_link;
  t.transform.translation.x = 1.0; 
  t.transform.rotation.x = 0.0;
  t.transform.rotation.y = 0.0; 
  t.transform.rotation.z = 0.0; 
  t.transform.rotation.w = 1.0;  

Arduino的loop函数内,设置不同参考系的名称,及转换的值内容,这个用法需要参考tf。

 t.header.stamp = nh.now();

调用nh.now()作为ros :: Time实例返回当前时间,就像使用roscpp的ros :: Time :: now()时一样

  broadcaster.sendTransform(t);
  nh.spinOnce();
  delay(10);
}

最后,我们发布转换,然后spinOnce并稍等一会儿再做一次。

变换应始终以常规速率发布,但通常数据字段将从实际数据中填充。

1.3 上传代码

要将代码上传到Arduino,请使用Arduino IDE中的上传功能。这与上传任何其他sketch没有什么不同。

1.4 运行代码

现在,在新的终端窗口中启动roscore

roscore

接下来,运行rosserial客户端应用程序,将Arduino消息转发给ROS的其余部分。确保使用正确的串口:

rosrun rosserial_python serial_node.py /dev/ttyACM0

最后,您可以使用以下方法检查转换:

rosrun tf tf_echo odom base_link

默认情况下,这将回应从Arduino发送的变换大约每秒一次。请注意,Arduino可能以更高的速率broadcasting(Mega2560在57600连接时播放速率在约57hz)

或者,通过运行:

rosrun tf view_frames

最后一个命令将运行大约5秒钟,并在您运行命令的目录中生成“frames.pdf”文件。

2 进一步阅读

有关使用Time实例的更多信息,请参阅rosserial / Overview

猜你喜欢

转载自blog.csdn.net/qq_27806947/article/details/83046475