用hector slam和Hokuyo创建地图并导航
<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
实际跑的过程中,将"odom_frame" default="nav" 的nav->odom。
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"/>
上一篇: Pytorch gpu加速方法