用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"/>
- 用hector slam和Hokuyo创建地图并导航
- 用hector mapping构建地图
- rplidar进行hector-slam
- ROS hector slam
- hokuyo 01LX激光传感器驱动程序的安装和创建地图时出现的问题
- 用hector mapping构建地图rplidar
- Hokuyo URG-04LX用hector_slam创建地图(无IMU)
- 10.SLAM和导航
- 路径规划A*算法及SLAM自主地图创建导航算法
- 菜鸟级-使用rplidar进行hector slam
- 如何跑通运行hector slam
- Hector—slam源码分析(转)
- Hector SLAM算法学习与代码解析
- ROS机器人Diego 1#制作(二十)搭载EAI F4激光雷达Hector创建室内地图
- 激光SLAM导航系列(三)Costmap(代价地图)(上)
- 激光SLAM导航系列(三)Costmap(代价地图)(下)
- 跳转原生地图并导航
- ROS下使用Hokuyo和AMCL进行P3dx平台导航的实现
- 触摸java常量池
- 支付--支付宝APP支付
- CodeForces
- Android Studio 硬编码的排查
- NOIP2013花匠超多方法的题解
- 用hector slam和Hokuyo创建地图并导航
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
- 曲面的渐近方向和共轭方向、主方向、曲率线网
- itextPdf 中的一些细节问题
- ubuntu桌面上给文件夹创建快捷方式
- 瀑布流
- 《程序员的自我修养》第二章笔记
- php+html图片上传处理