使用时间和TF
rosserial_arduino 中文教程 专栏
原文:http://wiki.ros.org/rosserial_arduino/Tutorials/Time%20and%20TF
**描述:**本教程演示如何使用ros::Time和TF在Arduino上创建TF发布服务器。
**教程级别:**中级
**下一教程:**添加自定义消息
目录
在Arduino上使用时间和TF
守则
代码说明
上传代码
运行代码
进一步阅读
在Arduino上使用时间和TF
rosserial_arduino包包含用于在arduino上生成时间戳的库,这些时间戳与运行roscore实例的PC/平板电脑同步。本教程使用发布tf转换的示例演示如何访问时间。
守则
如果您已经遵循了Arduino IDE设置教程,那么您可以从Arduino示例菜单中选择ros_lib->TimeTf来打开下面的草图。
这将在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);
}
代码说明
现在,让我们把代码分解。
错误:找不到代码块,我们需要包含典型的ROS内容以及转换广播程序。
错误:接下来找不到代码块,我们实例化要使用的TransformStamped消息和广播程序。我们还需要指定要为其发布转换的帧的名称。
错误:在setup()函数中找不到代码块,我们必须在TransformBroadcaster上调用init(),并将节点句柄作为参数。如果不这样做,广播公司就不能正确地发布。
错误:在loop()函数中找不到代码块,我们将填充转换的字段。帧id设置为正确的字符串名称,并设置平移和旋转的值。
错误:找不到调用nh.now()的代码块,将当前时间作为ros::time实例返回,就像使用roscpp的ros::time::now()一样。
错误:最后找不到代码块,我们发布转换,然后旋转一次并稍等片刻,然后再次执行转换。转换应始终以固定的速率发布,尽管通常数据字段将从实际数据中填充。
上传代码
要将代码上载到Arduino,请使用Arduino IDE中的上载功能。这与上传其他草图没有区别。
运行代码
现在,在新的终端窗口中启动roscore:
roscore
接下来,运行rosserial客户机应用程序,将Arduino消息转发给ROS的其余部分。确保使用正确的串行端口:
rosrun rosserial_python serial_node.py/dev/ttyUSB0
最后,可以使用以下方法检查转换:
rosrun tf tf_echo odom base_link
默认情况下,这将大约每秒回显一次从Arduino发送的转换。请注意,Arduino可能以更高的速率广播(当连接到57600时,Mega2560以约57hz的频率发布)
或者,通过运行:
rosrun tf view_frames
最后一个命令将运行约5秒,并在运行该命令的目录中生成“frames.pdf”文件。
进一步阅读
有关使用时间实例的更多信息,请参见rosserial/Overview。