本帖最后由 liuyu-419812 于 2015-10-15 18:37 编辑
在机器人中,包含很多的坐标系,这些坐标系之间的关系对机器人以后的运动学、轨迹规划等是很重要的。因此,我们将在Arduino上使用ros::Time和TF创建一个tf发布者。通过tf发布者向ROS发布坐标变换信息。当然,这里只是模拟发送信息的过程,并没有一个机器人模型。 参考:http://wiki.ros.org/rosserial_arduino/Tutorials/Time%20and%20TF
可以通过在Arduino examples菜单选择ros_lib->TimeTf,打开下面的代码: - /*
- * 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);
- }
复制代码 下面,我们来分析一下代码。 - #include <ros.h>
- #include <ros/time.h>
- #include <tf/transform_broadcaster.h>
复制代码 我们需要包括通常的ROS头文件,也包含一个关于广播坐标变换的头文件。 - ros::NodeHandle nh;
- geometry_msgs::TransformStamped t;
- tf::TransformBroadcaster broadcaster;
- char base_link[] = "/base_link";
- char odom[] = "/odom";
复制代码 接着,我们实例化一个将要使用的TransformStamped消息和一个广播者。我们也需要指定发布的变换的坐标系的名字。 在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;
复制代码 在loop()函数内部,我们填充我们的变换域。坐标系ID设置正确的字符串名字,设置平移和旋转变换的值。 - t.header.stamp = nh.now();
复制代码 调用nh.now()函数,返回正确的时间,作为一个ros::Time实例。 - broadcaster.sendTransform(t);
- nh.spinOnce();
- delay(10);
复制代码 最后我们发布变换,然后调用spinOnce,延时。变换以一定的速度发布,尽管通常我们填充的数据域来自真实数据。 接着需要编译、上传代码。之后打开一个终端,运行代码: 打开一个新的终端,运行代码: - source ~/<ws>/install/setup.bash
- rosrun rosserial_python serial_node.py /dev/ttyACM0
复制代码 <ws>为放置rosserial包的工作空间 最后,打开一个新的终端,使用下面的命令检查变换 - rosrun tf tf_echo odom base_link
复制代码 或 这个命令会生成一个pdf文件。
下面的两个图为执行的命令截图,也包含收到的来自Arduino的坐标变换消息。
这幅图为运行时的图片,Arduino的TX端口一直亮着,说明在以很高的频率发送信息。
这幅图为生成的pdf内容,包含坐标变换的信息,如坐标系,发布者,频率等。
|