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。