敞开成长之旅!这是我参与「日新方案 12 月更文挑战」的第33天,点击检查活动详情
遇到问题:
在 turtlebot3 的gazebo 仿真环境下
经过rosbag 保存tf 和scan 的信息,然后经过回放rosbag 里的内容 再经过 gmapping slam_gmapping 进行地图树立
建图进程中出现如下问题
[ WARN] [1584192934.752228918]: MessageFilter [target=odom ]: Dropped 100.00% of messages so far. Please turn the [ros.gmapping.message_notifier] rosconsole logger to DEBUG for more information.
解决进程1
意思是从odom 后边的信息都被丢弃了。 为什么丢弃,由于 tf 不对 。
$ rosrun rqt_tf_tree rqt_tf_tree
显现tf tree 额,到odom后边没有tf信息了。 urdf根本就没有发布啊。
看 turtlebot3 的launch文件 , 这儿没有将 urdf 的 tf 信息发布
<!-- start robot state publisher -->
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" >
<param name="publish_frequency" type="double" value="50.0" />
</node>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
再运行仿真程序时 ,出来了理想的 tf tree
再遇问题
然后保存rosbag,再建图一次,仍是报错。
检查rosbag回放数据的tf tree。 便是在rosbag 回放数据的进程中,执行 指令
$ rosrun rqt_tf_tree rqt_tf_tree
额, base_footprint 和 base_link 为什么是断得. 并且其它传感器去哪了
解决进程2
现在得问题是 在gazebo运行时 tf 是对得 ,在 rosbag回放时tf 是错得 下面把 数据悉数保存
rosbag record -O data_all.bag -a
然后看回放rosbag里的tf tree
是对的。
阐明少订阅了什么内容,
检查一切topic 把 /tf_static 加上 ,中间试过了 加 /tf_staic 是不可的
rosbag 里边的 tf tree 总算对了
下面看 /tf_static 到底是个啥东西啊
ROS 的 tf 功用包有一个晋级版别 tf2 这个 tf_static 便是 tf2 中多的功用 详细能够看官网的解释
tf2 Migration WIKI 这儿的英文解释很模糊,实际上 tf_static 简略了解 便是 发布的一个锁存功用的tf。 锁存功用 便是订阅者能够订阅 发布者发布的最新的一次topic,而不是发布者发布了才能订阅。
tf::TransformListener 会订阅 /tf 和 /tf_static。
answers.ros.org 上有人解释说 : Transforms on the /tf_static topic are assumed to never change and be valid for all timestamps. tf_static 是假定不会改变的的坐标改换关系(例如fixed型的joint),能够被随时使用(便是锁存)。
假设一个坐标改换是固定的那么能够发布一次,之后随时就能够使用了。 当然假如固定的关系变了,那么能够再发一次。
这个是 tf2 相对于 tf 晋级的一个功用。
依据上面的调试进程推断:
在 urdf 中的 joint ,假设是 fixed 的joint ,则会往发布 /tf_static 上发布 continue类型的joint 则会往 /tf 上发布
所以 base_footprint 和base_link是fixed 的关系,没有订阅 /tf_static 是断开的 ,轮子的link和base_link是continued ,订阅/tf就 能够连上 当订阅了 /tf_static 这个之后 , 激光、相机、IMU这种固定衔接的就有了