Ubuntu16.04LTS 下ros(kinetic)的arduino应用(五)

Ubuntu 16.04下arduino示例ros_lib例程TimeTF
介绍:

  • 该文主要讲述如何使用ros::Time和TF在Arduino上创建tf publisher
  • 使用历程为应用(一)中Arduino IDE 文件->示例->ros_lib->TimeTF

示例中的代码如下:

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

#include <ros.h>       //包含了标准ROS类的声明
#include <ros/time.h>  //包含ros库中的时间库文件
#include <tf/transform_broadcaster.h>   //包含transform broadcaster头文件

ros::NodeHandle  nh;  /*(节点句柄)对象是你的程序用于和ROS系统交互的主要机制。创建此对象会将你的程序注册为ROS节点管理器的节点。最简单的方法就是在整个程序中只创建一个NodeHandle对象*/

geometry_msgs::TransformStamped t;       //实例化TransformStamped消息类
tf::TransformBroadcaster broadcaster;    //实例化broadcaster类

char base_link[] = "/base_link"; //定义字符型数组,指定需要进行转换的参考系名称/base_link/odom
char odom[] = "/odom";           //定义字符型数组,指定需要进行转换的参考系名称/odom

void setup()        /*Arduino的Setup函数,用于初始化ROS节点处理,初始化节点处理类,初始化broadcaster类,使用节点处理类作为参数*/
{
  nh.initNode();
  broadcaster.init(nh);
}

void loop()    /*在Arduino的loop函数,转化相关参数,并调用nh.spinOnce(),这样所有的ROS回调函数就会被处理*/
{  
  //设置不同参考系的名称,及转换的值内容
  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();     /*调用nh.now(),返回当前的时间。作为ros::Time 的实例,就像使用 roscpp's ros::Time::now().**/

    /*发布转换,调用spinOnce之后,需要等待一会,在循环。*/
    /*转换都是按正常速率发布*/
    /*数据字段将从实际数据中填充*/
  broadcaster.sendTransform(t);
  nh.spinOnce();
  delay(10);
}

代码下载:

  • 将arduino开发板通过串口与电脑连接,点击Arduino IDE 文件->下载

运行代码:
1.打开终端,输入如下:

$ roscore

2.打开另一个终端,输入如下:

$ rosrun rosserial_python serial_node.py /dev/ttyACM0

$ rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0

3.打开另一个终端,输入如下代码,检查是否成功:

$ rosrun tf tf_echo odom base_link

$ rosrun tf view_frames

上述内容为本人参考下方链接并结合自身操作所遇问题,对前者进行了相关补充,由于编者水平有限,如有错误,还请指出。

参考链接:> http://wiki.ros.org/rosserial_arduino/Tutorials/Time%20and%20TF

猜你喜欢

转载自blog.csdn.net/Hacker_MAI/article/details/78667453