一、SLAM 1、SLAM全称是Simultaneous Localization And Mapping,即同时定位与地图构建 2、SLAM软件包Hector_Mapping,←建图可参考链接所示文章 二、机器人定位 1、假设机器人开始建图的位置是地图坐标系的原点 2、则机器人在建图过程中的位置可以描述为机器人和这个地图原点坐标系之间的空间关系 3、定义机器人建图的初始位置为地图坐标系,坐标轴方向遵循右手法则,给该坐标系命名map 4、机器人坐标系的原点定义在机器人地盘的中心位置,坐标系同样遵循右手法则,该坐标系叫做base_footprint,它是ROS中约定俗称的一个坐标系名称 5、地图坐标系作为父坐标系,机器人坐标系作为子坐标系,则这两个坐标系的空间关系就可以描述为子坐标系在父坐标系中X、Y、Z三个轴上的距离偏移量 6、对于在地面上移动的机器人来说,Z的值为0 7、对于地面移动的机器人来说,只需要沿X、Y轴的偏移量和绕Z轴的角度,便可描述机器人坐标系相对于地图坐标系的空间关系 三、TF系统 1、TF是TransForm的缩写,主要描述两个坐标系的空间关系,可以理解为坐标系变换 2、地图坐标系和机器人坐标系的距离和角度偏移量就属于一个TF关系 3、TF关系由特定的ROS节点以消息包的形式发布到/tf话题中去,其它的节点可以订阅这个话题来查询当前运行的节点网络中都存在哪些坐标系。在RViz中能够显示地图和机器人的相对位置就是因为RViz订阅了这个/tf话题 四、在RViz中显示TF坐标系 1、进入工作空间输入source ./devel/setup.bash设置ROS的环境变量,以便在当前的终端窗口中正确运行ROS软件包。 2、输入roslaunch wpr_simulation wpb_hector.launch运行SLAM建图程序 3、控制机器人随意行走一段距离 4、在RViz里添加TF显示项目 5、可以看到机器人身上和地图原点出现了很多细小的三维坐标轴 6、修改坐标轴的显示大小 7、Frames选项里面只保留base footprint和map 8、便能直观的观察到这了两个坐标系的空间关系 9、打开一个新的终端,输入rostopic list,查找包含TF数据的话题 10、这个/tf是包含TF数据的话题 11、输入rostopic type /tf查看它的消息格式 12、可以看到/tf这个话题的消息格式是tf2_msgs的TFMessage 13、去ROS index里查查这个消息类型的结构 14、输入tf2_msgs进行搜索 15、选择noetic版本 16、进入wiki界面 17、点击TFMessage 18、这是一个TransformStamped类型的数组 19、点击进入,查看它的结构 20、结构长这样 21、header里的fram id是父坐标系的名称 22、这个child_frame_id是子坐标系的名称 23、父子坐标系的空间关系在这个transform里 24、transform里有一个translation 25、结构是x、y、z三个浮点数 26、就是子坐标系在父坐标系里的坐标偏移量 27、rotation是个四元数 28、描述的是子坐标系相对于父坐标系的角度偏差量,使用的是四元数格式 29、回到终端输入rostopic echo /tf,查看TF的具体数值 30、可以看到有很多TF消息包在刷屏,按CTRL+C暂停,找到这个“map”和“base_footprint” 31、这个便是子坐标系相对于父坐标系的位置偏移量 32、这个是子坐标系相对于父坐标系的角度偏移量(四元数形式) 33、在这个/TF话题里会不停发来TF消息,每一个TF消息包对应的是不同时刻坐标系的空间关系,它随着机器人的移动不断变化 34、TFMessage消息包包含的是一个TransformStamped类型的数组,里面除了map和base_footprint可能还会存在许多别的TF关系 35、如果有许多TF关系时都在这里刷屏,很难看清区分 36、输入rosrun rqt_tf_tree rqt_tf_tree用于理清众多TF关系 37、会弹出一个窗口 38、每个椭圆都代表一个坐标系,可以看出这些坐标系是存在层级关系的 39、上方椭圆是下方椭圆的父级坐标系,当一个ROS程序运行起来时,所有的空间坐标关系都可以在这个TF树中获取