setting up your robot with tf(二)

2024-06-23 09:38
文章标签 robot tf setting

本文主要是介绍setting up your robot with tf(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,using the robot state publisher on your own robot

上面一节是使用TF树结构来表示不同的框架之间的关系,且这棵TF转换树是一棵单遍历的树,表示了不同框架之间的关系,我们写了一个节点,用来定义两个框架的关系,这样下次使用就能自动调用这种关系,这样tf就帮我们做了很重要的一份工作。这一节我们学习robot state publisher。当我们的机器人有很多个相关连的框架时,这样把它们所有的相关框架信息发布给tf即形成一棵tf结构树就变得十分麻烦,而robot state publisher就为你做了这份工作即TF树帮助你避免每次都要调用计算框架之间的关系,只要定义一次就能自动调用使用,而robot state publisher却能帮我们将复杂的框架信息发布给TF即做一棵TF树,这样就能自动调用了微笑(太棒了)

robot state publisher帮你发布状态消息给tf转换库。它内部有一个机器人运动模型,这样当给定机器人的节点位置时,robot state publisher能计算和发布这个机器人的每个连杆的3D位置。使用robot state publisher可以通过一个节点或者通过一个库。

使用robot state publisher最简单的一种方法是将它当作一个节点,对普通的用户来说,这是推荐的方法,运行它需要两样东西:第一个是一个urdf文件用来描述机器人,第二个是一个source文件用来发布节点位置信息作为一个sensor_msgs/JointState.

如何为robot_state_publisher来配置参数和主题呢?

订阅joint_states主题,设置tf前缀为命名空间用来发布转换消息,设置发布频率(默认为50Hz)

当建立好一个urdf机器人描述文件,且建立了一个节点位置信息的source文件,再创建一个简单的.launch文件即可。

这样就将位置信息通过robot state publisher(包含在source文件中)发布给了tf,tf形成了一棵tf结构树,如果用rviz就可调用tf来查看所生成的tf树,即robot state publisher通过计算节点关节信息来生成相应的tf结构转换树,解决了复杂的结构不用像上节tf_broadcaster一个个来发布框架相应关系,可以直接运行一个类似robot state publisher的节点来使用它,生成一棵tf转换树,对于以后的使用能自动调用转换。

2,using urdf with robot_state_publisher

2.1, create the URDF file即一个R2D2简单机器人的URDF描述文件

2.2Publishing the state为了指定机器人的状态,我们必须指定三个节点关节和总里程,先创建一个节点名称是state_publisher

注意创建source文件后要在CmakeLists.txt文件里添加可执行文件名称state_publisher,再用catkin_make进行编译,生成一个可执行文件。还要注意依赖包,应该包括tf,geometry_msgs ,roscpp,否则会出现错误,transformBroadcaster()会找不到(吐舌头)。

2.3创建一个launch文件,这个文件调用了两个节点robot_state_publisher和state_publisher(刚才我们所建立的节点)

2.4运行launch文件,然后打开rviz,调用机器人模型及TF后能看到结果:机器人绕着一个odom坐标运动,机器人上有TF框架显示。

3,分析source文件:

state_publisher.cpp:

   1 #include <string>
   2 #include <ros/ros.h>
   3 #include <sensor_msgs/JointState.h>
   4 #include <tf/transform_broadcaster.h>
//这里要用到转换发布对象TransformBroadcaster,所以要添加头文件
   5 
   6 int main(int argc, char** argv) {
   7     ros::init(argc, argv, "state_publisher");
//初始化ROS命名节点为state_publisher
8     ros::NodeHandle n;
//NodeHandle是与ROS交流最主要的接入点
9     ros::Publisher joint_pub = n.advertise<sensor_msgs::JointState>("joint_states", 1);
//ROS发布消息给主题joint_states,消息类型为sensor_msgs::JointState
10     tf::TransformBroadcaster broadcaster;
//tf的转换对象
11     ros::Rate loop_rate(30);
  12 
  13     const double degree = M_PI/180;
  14 
  15     // robot state机器人状态
  16     double tilt = 0, tinc = degree, swivel=0, angle=0, height=0, hinc=0.005;
  17 
  18     // message declarations消息声明
  19     geometry_msgs::TransformStamped odom_trans;
  20     sensor_msgs::JointState joint_state;
//定义了两个消息odom_trans和joint_state
21     odom_trans.header.frame_id = "odom";
  22     odom_trans.child_frame_id = "axis";
//消息odom_trans下的两个frame,父框架为odom,子框架为axis
23 
  24     while (ros::ok()) {
  25         //update joint_state更新关节点状态
  26         joint_state.header.stamp = ros::Time::now();
  27         joint_state.name.resize(3);
  28         joint_state.position.resize(3);
  29         joint_state.name[0] ="swivel";
  30         joint_state.position[0] = swivel;
  31         joint_state.name[1] ="tilt";
  32         joint_state.position[1] = tilt;
  33         joint_state.name[2] ="periscope";
  34         joint_state.position[2] = height;
  35 
  36 
  37         // update transform更新转换,使绕一个半径为2的圆移动
  38         // (moving in a circle with radius=2)
  39         odom_trans.header.stamp = ros::Time::now();
  40         odom_trans.transform.translation.x = cos(angle)*2;
  41         odom_trans.transform.translation.y = sin(angle)*2;
  42         odom_trans.transform.translation.z = .7;
  43         odom_trans.transform.rotation = tf::createQuaternionMsgFromYaw(angle+M_PI/2);
  44 
  45         //send the joint state and transform发送关节点消息并且发布odom_trans转换消息,发送关节点的消息是state_publisher通过主题joint_state发送
//给robot_state_publisher的,而odom与axis框架之间的关系是通过节点state_publisher发送的,即节点state_publisher完成了转换树的根部分,而robot_state_publisher
//则完成了机器人各个框架之间的转换树。注意根树即框架odom与axis之间的关系是一个圆形的关系,故能看到机器人绕着odom坐标做圆形轨迹运动。
46         joint_pub.publish(joint_state);
  47         broadcaster.sendTransform(odom_trans);
  48 
  49         // Create new robot state
  50         tilt += tinc;
  51         if (tilt<-.5 || tilt>0) tinc *= -1;
  52         height += hinc;
  53         if (height>.2 || height<0) hinc *= -1;
  54         swivel += degree;
  55         angle += degree/4;
  56 
  57         // This will adjust as needed per iteration
  58         loop_rate.sleep();
  59     }
  60 
  61 
  62     return 0;
  63 }
总结:用tf tool查看框架之间的关系,即用 $rosrun tf view_frames来查看, 可以看出新生成的框架odom与机器人的轴框架axis之间的关系是由节点state_publisher发布的,且它们的关系不是简单的线性关系,而是一个圆形的关系,而机器人本身的各个框架之间的对应关系是由robot_state_publisher生成的(是不是自动生成的?疑问),这样就由节点state_publisher和节点robot_state_publisher生成了一棵包括odom框架的完整的tf转换树,注意state_publisher与robot_state_publisher之间的通信也是由一个主题joint_state发布消息形成的,这个可以使用rqt工具来查看。












这篇关于setting up your robot with tf(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086791

相关文章

【深度学习 走进tensorflow2.0】TensorFlow 2.0 常用模块tf.config

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。人工智能教程 本篇文章将会教大家如何 合理分配显卡资源,设置显存使用策略。主要使用tf.config模块进行设置。下面我们一起了解下具体用法和例子。 一、指定当前程序使用的 GPU 例如,在一台具有 4 块 GPU 和一个 C

【maven】setting.xml配置国内镜像地址

1、用文本编辑器打开 setting.xml 文件 找到 <mirrors> 节点,注意不是mirror 2、加入以下配置。讲道理,只要这一个就行了。 注意不要放到注释的结构了去了。 <mirrors><mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/cont

利用Setting Provider添加保存数据项

Framework需要定制的时候,可能会增加新的数据项,setting的数据实际是从SettingProvider里面读出来的,里面有一个settings.db的文件,在第一次启动android手机的时候会在默认的文件中读取设定的值,下面就以添加一项来说明这个过程: 1)第一次启动默认值在frameworks/base/packages/SettingsProvider/res/values

Tensorflow 中train和test的batchsize不同时, 如何设置: tf.nn.conv2d_transpose

大家可能都知道, 在tensorflow中, 如果想实现测试时的batchsize大小随意设置, 那么在训练时, 输入的placeholder的shape应该设置为[None, H, W, C]. 具体代码如下所示: # Placeholders for input data and the targetsx_input = tf.placeholder(dtype=tf.float32, s

NLP-词向量-发展:词袋模型【onehot、tf-idf】 -> 主题模型【LSA、LDA】 -> 词向量静态表征【Word2vec、GloVe、FastText】 -> 词向量动态表征【Bert】

NLP-词向量-发展: 词袋模型【onehot、tf-idf】主题模型【LSA、LDA】基于词向量的静态表征【Word2vec、GloVe、FastText】基于词向量的动态表征【Bert】 一、词袋模型(Bag-Of-Words) 1、One-Hot 词向量的维数为整个词汇表的长度,对于每个词,将其对应词汇表中的位置置为1,其余维度都置为0。 缺点是: 维度非常高,编码过于稀疏,易出

亦菲喊你来学机器学习(18) --TF-IDF方法

文章目录 TF-IDF词频TF逆文档频率IDF计算TF-IDF值 应用实验使用TF-IDF1. 收集数据2. 数据预处理3. 构建TF-IDF模型对象4. 转化稀疏矩阵5. 排序取值完整代码展示 jieba分词总结 TF-IDF TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索与文本挖掘的常用加

NLP03:使用TF-IDF和LogisticRegression进行文本分类

公众号:数据挖掘与机器学习笔记 1.TF-IDF算法步骤 1.1 计算词频 考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。 1.2 计算逆文档频率 需要一个语料库(corpus),用来模拟语言的使用环境。 如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数

文本数据分析-(TF-IDF)(2)

文章目录 一、TF-IDF与jieba库介绍1.TF-IDF概述2.jieba库概述 二、TF-IDF与jieba库的结合1.结合2.提取步骤 三,代码实现1.导入必要的库读取文件:3.将文件路径和内容存储到DataFrame4.加载自定义词典和停用词5.分词并去除停用词 TF-IDF(Term Frequency-Inverse Document Frequency)与jieba

tf.train.batch 和 tf.train.batch_join的区别

先看两个函数的官方文档说明 tf.train.batch官方文档地址: https://www.tensorflow.org/api_docs/python/tf/train/batch tf.train.batch_join官方文档地址: https://www.tensorflow.org/api_docs/python/tf/train/batch_join tf.train.ba

《NLP自然语言处理》—— 关键字提取之TF-IDF算法

文章目录 一、TF-IDF算法介绍二、举例说明三、示例:代码实现四、总结 一、TF-IDF算法介绍 TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。词语的重要性随着它在文件中出现的次数成正比