前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROS Tranform出错简易处理 tf出错现象及解析

ROS Tranform出错简易处理 tf出错现象及解析

作者头像
zhangrelay
发布2019-01-23 11:47:20
2.7K0
发布2019-01-23 11:47:20
举报
文章被收录于专栏:机器人课程与技术

有时候由于urdf以及代码中有些遗漏,可能导致TF出现问题,此文只作为阐明TF重要性的示例,不是解决方案!

请注意此方法不保证正确和唯一,解决方案多样,欢迎留言补充,这里抛砖引玉~

以下面为例:

启动地图构建程序,但是没有出现地图,rviz现象为:

这里有两个警告和两个错误:

使用下面命令查看TF tree:

$ rosrun rqt_tf_tree rqt_tf_tree

/odom和/base_footprint断开了!

这里有一点需要重点说明,tf中的odom和topic的odom虽然名称一样,但完全不是一类。

怎么办呢?

只需要一步即可:可以参考官网robot_state_publisher具体可以参考附录:~

在launch文件中添加:

<node pkg="tf" type="static_transform_publisher" name="fix_odom" args="0 0 0 0 0 0 odom base_footprint 50" />

然后重新运行:

熟悉的地图出来了,再看一下tf:

OK!

在自己的机器人上使用机器人状态发布器

说明:本教程介绍如何发布机器人的状态,TF,使用机器人状态出版商。 教程级别: BEGINNER 下一个教程:有关如何结合使用robot_state_publisher与urdf的详细教程,请查看 本教程

内容

  1. 作为ROS节点运行
    1. robot_state_publisher
      1. 订阅主题
      2. 参数
    2. 示例启动文件
  2. 作为库运行

当你使用一个有许多相关框架的机器人时,将它们全部发布到tf就成了一项任务。机器人状态发布者是一个工具,将为您完成这项工作。

frames2.png
frames2.png

机器人状态发布器帮助您将机器人的状态广播到tf转换库。机器人状态发布器内部具有机器人的运动学模型; 因此给定机器人的关节位置,机器人状态发布者可以计算和广播机器人中每个链接的3D姿态。

您可以将robot状态发布者用作独立的ROS节点或库:

作为ROS节点运行

robot_state_publisher

运行机器人状态发布器的最简单方法是作为节点。对于正常用户,这是建议的用法。你需要两件事来运行机器人状态发布者:

请阅读如何配置参数和主题下面的章节robot_state_publisher

订阅主题

joint_states(sensor_msgs / JointState

  • 关节位置信息
参数

robot_description(urdf地图)

tf_prefix(string)

  • 设置TF的变换的空间感知出版前缀。见tf_prefix了解更多详情。

publish_frequency(double)

  • 状态发布者的发布频率,默认值:50Hz。

示例启动文件

一旦你设置了XML机器人描述和一个关节位置信息源,只需创建一个启动文件,像这样:

代码语言:javascript
复制
  <launch>
    <node pkg =“robot_state_publisher”type =“robot_state_publisher”name =“rob_st_pub”>
      <remap from =“robot_description”to =“different_robot_description”/>
      <remap from =“joint_states”to =“different_joint_states”/>
    </ node>
  </ launch>

作为库运行

高级用户还可以从自己的C ++代码中将机器人状态发布者作为库运行。在添加标题后:

代码语言:javascript
复制
  #include <robot_state_publisher / robot_state_publisher.h>

所有你需要的是一个发生在一个构造函数KDL树

代码语言:javascript
复制
  RobotStatePublisher(const KDL :: Tree&tree);

现在,每次你想发布你的机器人的状态,你调用publishTransforms函数:

代码语言:javascript
复制
  //发布移动关节
  void publishTransforms(const std :: map <std :: string,double>&joint_positions,
                         const ros ::时间&time);

  //发布固定关节
  void publishFixedTransforms();

第一个参数是具有关节名称和关节位置的映射,第二个参数是记录关节位置的时间。如果地图不包含所有的联合名称,可以。如果地图包含一些不是运动模型一部分的关节名称,也可以。但请注意,如果你不告诉关节状态出版者关于你的运动学模型中的一些关节,那么你的tf树将不完整。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在自己的机器人上使用机器人状态发布器
    • 作为ROS节点运行
      • robot_state_publisher
      • 示例启动文件
    • 作为库运行
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档