用hector slam和Hokuyo创建地图并导航

来源:互联网 发布:免费服装库存软件 编辑:程序博客网 时间:2024/05/16 04:14

<launch>  <node name="hokuyo" pkg="hokuyo_node" type="hokuyo_node" respawn="false" output="screen">  <!-- Starts up faster, but timestamps will be inaccurate. -->    <param name="calibrate_time" type="bool" value="false"/>   <!-- Set the port to connect to here -->  <param name="port" type="string" value="/dev/hokuyo"/> <param name="frame_id" type="string" value="laser"/> <param name="intensity" type="bool" value="false"/> </node> <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0 0.0 base_link laser 100"/></launch>

投入了接近一天的时间,总算把这个场景搞定了,虽然还有一点小问题,但不影响大局

得意于ros的架构,不同节点间除了topic和service相互独立,可以把这个场景看成四个独立的应用。

第一部分:kobuki,使用命令就可以拉起:

roslaunch turtlebot_bringup minimal.launch

发布topic :/odom 

发布tf transform : 

odom frame transform:由kobuki nodelete根据读取的左右轮子的电机编码器脉冲数据和陀螺仪数据,计算出来的。如果换个robot,也可以自己设定计算公式。

base_footprint(也就是所说的base_frame):根据odom transform 得出的robot 的transform

base_link :robot上的各个设备和关键位置都基于此坐标系,是base_footprint的子节点。

tf图和hector图


第二部分:hokuyo

2.1. 下载代码:https://github.com/ros-drivers/hokuyo_node.git 

下载后编译catkin_make,然后设置环境变量

source . xxx/devel/setup.bash

2.2. 重要的是创建串口别名和设置串口权限

在/etc/udev/rule.d/目录下新建一个文件hokuyo.rules

KERNEL=="ttyACM[0-9]*", ACTION=="add", ATTRS{idVendor}=="15d1", MODE="0666", GROUP="dialout", SYMLINK+="hokuyo"    

串口名称是/dev/ttyACM0到9,对应的VID为15d1, MODE设置该设备节点权限 0666, 所属组为“dialout”,SYMLINK创建一个软链接 /dev/hokuyo -> /dev/ttyACM0

这样运行的ros节点就有权限read write该设备,并且创建出来的软链接还可以防止多个ttyACM设备连接主机后发生冲突。

创建完重启该服务,并重新插拔设备。

$ sudo service udev reload$ sudo service udev restart

2.3 运行该节点

写一个laucher文件,内容如下,写完可以放到turtlebot_navigation下面,可采用下载代码里面的hoyuko.test.laincher

<launch>  <node name="hokuyo" pkg="hokuyo_node" type="hokuyo_node" respawn="false" output="screen">  <!-- Starts up faster, but timestamps will be inaccurate. -->    <param name="calibrate_time" type="bool" value="false"/>   <!-- Set the port to connect to here -->  <param name="port" type="string" value="/dev/hokuyo"/> <param name="frame_id" type="string" value="laser"/> <param name="intensity" type="bool" value="false"/> </node> <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0 0.0 base_link laser 100"/></launch>

里面的内容很少:

<param name="port" type="string" value="/dev/hokuyo"/>
设置节点通信的端口,刚刚创建的软链接
<param name="frame_id"  type="string" value="laser"/>
设置hokuyo所在的坐标系名称 laser
<node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0 0.0 base_link laser 100"/>
设置坐标系laser与base_link的关系,laser在base_link上方18cm处
启动命令:
roslaunch turtlebot_navigation hokuyo.launch

可以看到节点启动后发布的三个主题:
/hokuyo_node/parameter_descriptions
/hokuyo_node/parameter_updates
/scan 
打印信息如下则运行正常
[ INFO] [1506476971.649826907]: Connected to device with ID: H1635196
[ INFO] [1506476972.073557904]: Streaming data.
也可以使用rostopic info /scan 命令查看,如果节点运行正常,可以看到hokuyo_node一直在发布很多很多的点云数据。
参考:
http://rosclub.cn/post-536.html
http://wiki.ros.org/hokuyo_node


第三部分 move_base

将move_base节点启动放到hokuyo.launch中
  <!-- Move base -->
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>
具体move_base内容不再本章介绍


第四部分 hector_slam
代码下载地址:https://github.com/tu-darmstadt-ros-pkg/hector_slam.git 
slam 即时定位与地图构建
其中和hector_slam 分成三个节点
hector_mapping : slam 算法节点,内容不在本章介绍
hector_geotiff : 保存地图和机器人的运动轨迹到geotiff图片文件
hector_trajectory_server : 保存tf基础轨迹
启动命令:
roslaunch hector_slam_launch tutorial.launch 


查看launch

<?xml version="1.0"?><launch>  <arg name="geotiff_map_file_path" default="$(find hector_geotiff)/maps"/>  <param name="/use_sim_time" value="true"/>  <node pkg="rviz" type="rviz" name="rviz"    args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>  <include file="$(find hector_mapping)/launch/mapping_default.launch"/>  <include file="$(find hector_geotiff)/launch/geotiff_mapper.launch">    <arg name="trajectory_source_frame_name" value="scanmatcher_frame"/>    <arg name="map_file_path" value="$(arg geotiff_map_file_path)"/>  </include></launch>

1.额外启动了rviz 工具
2.mapping_default.launch 启动了hector_mapping节点
3.geotiff_mapper.launch启动了剩下两个节点
我由于执行这个启动脚本,导致rviz一直出现,[map] frame is not exist 问题,因此我在脚本中将rviz和mapping启动代码屏蔽掉,手动拉起rviz和mapping节点
roslaunch hector_mapping mapping_default.launch 
重点:
需要对mapping_default.launch进行修改
分成三种场景
1.只是需要用hector_mapping替换掉gmapping,需要设置一下参数:
    <param name="pub_map_odom_transform" value="true"/>
    <param name="map_frame" value="map" />
    <param name="base_frame" value="base_frame" />
    <param name="odom_frame" value="odom" />
此时要注意在tf中base_frame具体叫什么名字,具体可以用工具rqt查看tf。我这里的是base_footprint


2.hector_mapping在没有odom frame情况下也可以运行,这取决于你的robot是否有可靠的odom数据,如果odom数据与现实数据差距很大,则不建议采用odom,建议使用这种场景,需要设置参数:
    <param name="pub_map_odom_transform" value="true"/>
    <param name="map_frame" value="map" />
    <param name="base_frame" value="base_frame" />
    <param name="odom_frame" value="base_frame" />
将odom frame也设置成base_frame


3.不需要广播tf transformations。在如下场景使用:当有一个额外的节点,发布tf transformations,从map->odom或者从map->base_frame。也就是说,有另一个节点完成了这部分工作,那么mapping节点就不需要做了。需要设置参数
    <param name="pub_map_odom_transform" value="false"/>

原创粉丝点击