基于机器人(irobot)和激光雷达(rplidar)gmapping地图构建
来源:互联网 发布:网络餐饮服务 编辑:程序博客网 时间:2024/05/16 05:29
基于机器人(irobot)和激光雷达(rplidar)gmapping地图构建
说明
- 介绍irobot搭载激光雷达irplidar通过gmapping算法构建地图
安装准备
- 测试环境Ubuntu14.04 + indigo
- ROS依赖包:
- Turtlebot机器包
https://github.com/turtlebot/turtlebot
https://github.com/ncnynl/turtlebot_apps.git - 激光雷达rplidar一代驱动包
https://github.com/ncnynl/rplidar_ros.git - slam_gmapping
https://github.com/ros-perception/slam_gmapping - openslam_gmapping包
https://github.com/ros-perception/openslam_gmapping
- Turtlebot机器包
步骤
- 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
- 下载turtlebot相关包
git clone https://github.com/turtlebot/turtlebot
git clone https://github.com/ncnynl/turtlebot_apps.git
- 下载激光雷达rplidar一代驱动
git clone https://github.com/ncnynl/rplidar_ros.git
- 下载slam_gmapping
git clone https://github.com/ros-perception/slam_gmapping
- 下载openslam_gmapping
git clone https://github.com/ros-perception/openslam_gmapping
- 编译
cd ~/catkin_ws
catkin_make
source devel/setup.bash
参数设置
环境参数设置
export TURTLEBOT_BASE=roomba
export TURTLEBOT_STACKS=circles
export TURTLEBOT_3D_SENSOR=rplidar
export TURTLEBOT_SERIAL_PORT=/dev/ttyUSB0
激光雷达串口设置
- 创建激光雷达串口别名,确认idVendor和idProduct,ID后面的部分idVendor:idProduct
lsusb
Bus 001 Device 006: ID 10c4:ea60
- 新建 /etc/udev/rules.d/rplidar.rules文件,内容如下:(别名为rplidar,实际名称为:/dev/rplidar)
KERNEL==”ttyUSB*”, ATTRS{idVendor}==”10c4”, ATTRS{idProduct}==”ea60”,
MODE:=”0666”, GROUP:=”dialout”, SYMLINK+=”rplidar”
- 增加当前用户对串口的默认访问权限:
sudo usermod -a -G dialout 用户名
- 使UDEV配置生效:(使串口的默认访问权限生效,需要重启机器)
sudo service udev reload
sudo service udev restart
制作雷达启动文件
- 建立rplidar_laser.launch文件
roscd turtlebot_navigation
mkdir -p laser/driver
touch rplidar_laser.launch
- 完整代码为:
<launch> <!--激光rplidar的启动文件,设置相关参数 --> <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> <param name="serial_port" type="string" value="/dev/ttyUSB1"/> <param name="serial_baudrate" type="int" value="115200"/> <param name="frame_id" type="string" value="laser"/> <param name="inverted" type="bool" value="false"/> <param name="angle_compensate" type="bool" value="true"/> </node> <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0.0 0.0 0.0 base_link laser 100"/> </launch>
说明:
- 检查serial_port是否正确,正确使用别名
- 增加tf,修改args=”x y z qx qy qz frame_id child_id period_in_ms”,单位为m
增加rplidar_gmapping.launch.xml文件,设置gmapping参数
<launch> <arg name="scan_topic" default="scan" /> <arg name="base_frame" default="base_footprint"/> <arg name="odom_frame" default="odom"/> <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true" > <param name="base_frame" value="$(arg base_frame)"/> <param name="odom_frame" value="$(arg odom_frame)"/> <param name="map_update_interval" value="5"/> <!--地图更新的时间间隔。更新间隔越小,计算负荷越大,地图更新也受scanmatch的影响,如果scanmatch没有成功的话不会更新地图 default: 5.0--> <param name="maxUrange" value="6.0"/> <!--探测最大可用范围,计光束能到的范围default80.0 --> <param name="maxRange" value="6.0"/> <param name="sigma" value="0.05"/> <!-- 用作结束点匹配--> <param name="kernelSize" value="1"/> <param name="lstep" value="0.05"/> <param name="astep" value="0.05"/> <param name="iterations" value="5"/> <param name="lsigma" value="0.075"/> <!--波束的sigma,用来计算似然估计每次扫描跳过的波束--> <param name="ogain" value="3.0"/> <!--用来平滑重采样的影响--> <param name="lskip" value="0"/> <!--每次扫描跳过的波束评估似然的增益,用来平滑重采样的影响--> <param name="minimumScore" value="80"/> <!--避免在大空间范围内使用有限距离的激光仪出现的jumping pose estimates问题,决定对激光的一个置信度,越高说明对激光匹配算法的要求越高,激光的匹配也越容易失败转而去使用里程计数据,太低又会使地图出现大量噪声,所以需要权衡条在--> <param name="srr" value="0.01"/> <!--平移时里程误差作为平移函数0.1--> <param name="srt" value="0.02"/> <!--平移时里程误差作为旋转函数0.2--> <param name="str" value="0.01"/> <!--旋转时里程误差作为平移函数0.1--> <param name="stt" value="0.02"/> <!--旋转时里程误差作为旋转函数0.1--> <param name="linearUpdate" value="0.05"/> <!--机器人每旋转这么远处理一次扫描1--> <param name="angularUpdate" value="0.0436"/> <param name="temporalUpdate" value="-1.0"/> <!--如果最新扫描处理比更新慢,则处理1次扫描,该值为负数时关闭基于时间的更新--> <param name="resampleThreshold" value="0.5"/> <!--基于重采样门限的Neff--> <param name="particles" value="200"/> <!--滤波器中粒子个数30--> <param name="xmin" value="-1.0"/> <!--地图初始尺寸-100,-100,100,100--> <param name="ymin" value="-1.0"/> <param name="xmax" value="1.0"/> <param name="ymax" value="1.0"/> <param name="delta" value="0.05"/> <!--地图分辨率--> <param name="llsamplerange" value="0.01"/> <param name="llsamplestep" value="0.01"/> <param name="lasamplerange" value="0.005"/> <param name="lasamplestep" value="0.005"/> <remap from="scan" to="$(arg scan_topic)"/> </node> </launch>
- 增加rplidar_gmapping_demo.launch文件,用于启动gmapping
roscd turtlebot_navigation
touch launch/irobot_rplidar_gmapping_demo.launch
- 代码为:
<launch> <!--启动irobot机器人--> <include file="$(find turtlebot_bringup)/launch/minimal.launch"/> <!-- 启动rplidar雷达驱动 --> <include file="$(find turtlebot_navigation)/laser/driver/rplidar_laser.launch" /> <!-- Gmapping--> <include file="$(find turtlebot_navigation)/launch/rplidar_gmapping_params.launch.xml"/> <!-- Move base--> <include file="$(find turtlebot_navigation)/launch/move_base.launch"/> <include file="$(find turtlebot_rviz_launchers)/launch/view_navigation.launch"/> </launch>
- 新建move_base.launch文件
roscd turtlebot_navigation
touch launch/move_base.launch
<launch> <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true"> <param name="footprint_padding" value="0.01" /> <param name="controller_frequency" value="10.0" /> <param name="controller_patience" value="3.0" /> <param name="oscillation_timeout" value="30.0" /> <param name="oscillation_distance" value="0.5" /> <rosparam file="$(find turtlebot_navigation)/config/costmap_common_params.yaml" command="load" ns="global_costmap" /> <rosparam file="$(find turtlebot_navigation)/config/costmap_common_params.yaml" command="load" ns="local_costmap" /> <rosparam file="$(find turtlebot_navigation)/config/local_costmap_params.yaml" command="load" /> <rosparam file="$(find turtlebot_navigation)/config/global_costmap_params.yaml" command="load" /> <rosparam file="$(find turtlebot_navigation)/config/base_local_planner_params.yaml" command="load" /> </node> </launch>
- 增加move_base.launch文件中的.yaml文件
roscd turtlebot_navigation
mkdir -p config
touch config/costmap_common_params.yaml
touch config/lobal_costmap_params.yaml
touch config/global_costmap_params.yaml
touch config/base_local_planner_params.yaml
- 增加costmap_common_params.yaml文件
obstacle_range: 2.5 raytrace_range: 3.0 robot_radius: 0.17 inflation_radius: 0.18 max_obstacle_height: 0.6 min_obstacle_height: 0.0 observation_sources: laser_scan_sensor laser_scan_sensor: {sensor_frame: /base_laser_link, data_type: LaserScan, topic: /base_scan, marking: true, clearing: true}
- 增加local_costmap_params.yaml文件
local_costmap: global_frame: /odom robot_base_frame: /base_link update_frequency: 3.0 publish_frequency: 2.0 static_map: false rolling_window: true width: 4.0 height: 4.0 resolution: 0.05
- 增加 global_costmap_params.yaml文件
global_costmap: global_frame: /odom robot_base_frame: /base_link update_frequency: 3.0 publish_frequency: 0.0 #static_map: true
- 增加base_local_planner_params.yaml文件
controller_frequency: 5.0 TrajectoryPlannerROS: max_vel_x: 0.20 min_vel_x: 0.10 max_rotational_vel: 0.4 min_in_place_rotational_vel: 0.1 acc_lim_th: 0.75 acc_lim_x: 0.50 acc_lim_y: 0.50 holonomic_robot: false yaw_goal_tolerance: 0.05 xy_goal_tolerance: 0.1 goal_distance_bias: 0.8 path_distance_bias: 0.6 sim_time: 1.2 heading_lookahead: 0.325 oscillation_reset_dist: 0.05 vx_samples: 6 vtheta_samples: 20 dwa: false
测试激光雷达gmapping构建地图
- 打开roscore,启动turtlebot、gmapping、rviz
roslaunch turtlebot_navigation irobot_rplidar_gmapping_demo.launch
- 启动键盘操作irobot
roslaunch turtlebot_teleop keyboard_teleop.launch
- 建图结束后保存
mkdir -p ~/map
rosrun map_server map_saver -f ~/map/my_map
ls ~/map
记录建图数据
- 列出当前运行的topic
rostopic list -v
- 新建一个文件夹用于保存录制的内容,在该目录下运行
mkdir tempbagfiles
cd tempbagfiles
rosbag record -a
- 使用rosbag info检查bag文件
rosbag info
- 使用rosbag play命令回放,以再现系统运行过程
rosbag play
默认模式下,rosbag play命令在公告每条消息后会等待一小段时间(0.2秒)后才真正开始发布bag文件中的内容。等待时间可以通过-d选项来指定。你可以通过-s参数选项让rosbag play命令等待一段时间跳过bag文件初始部分后再真正开始回放。最后一个可能比较有趣的参数选项是-r选项,它允许你通过设定一个参数来改变消息发布速率。
- 数据提取
rostopic echo -b file.bag -p /topic > data.txt
- 地图创建
roscore
rosmake gmapping
rosparam set use_sim_time true
- 启动slam_gmapping
rosrun gmapping slam_gmapping scan:=base_scan
- 在一个新的终端回放bag文件
rosbag play –clock filename
- 使用map_server包的map_saver保存地图
rosrun map_server map_saver
- 查看地图的进展
rosrun rviz rviz
- 基于机器人(irobot)和激光雷达(rplidar)gmapping地图构建
- ROS机器人Diego 1#制作(二十一)搭载EAI F4激光雷达gmapping创建室内地图
- 基于RPLIDAR激光雷达开发无人机机载室内二维重建装置(1)——RPLIDAR介绍
- 基于RPLIDAR激光雷达开发无人机机载室内二维重建装置(2)——RPLIDAR测试
- ROS机器人Diego 1#制作(二十)搭载EAI F4激光雷达Hector创建室内地图
- (ros/navigation/gmapping)导航/建地图
- (ros/navigation/gmapping)导航/建地图
- (ros/navigation/gmapping)导航/建地图
- ROS机器人Diego 1#制作(二十二)基于EAI F4激光雷达数据进行定位amcl
- 用hector mapping构建地图rplidar
- rplidar 三角测距激光雷达原理
- rplidar 三角测距激光雷达原理
- ROS(机器人操作系统)使用sick LMS1xx激光雷达 一
- 机器人技术(9)AtdRobot读取激光雷达数据教程
- ROS下用gmapping 构建实验室地图的实现
- ros中kobuki(turtlebot)+rplidar 跑gmapping
- 【产品评测】用RPLIDAR A2搭建gmapping
- [me]美国的irobot 机器人
- tar 命令
- 怎么理解的:----mybatis
- Java中的枚举
- 为5种思维导图软件打分
- linux tcp 之setsockopt
- 基于机器人(irobot)和激光雷达(rplidar)gmapping地图构建
- dom4j解析xsd
- __cdecl、__clrcall、__stdcall、__fastcall、__thiscall、__vectorcall等含义
- spring 定时 Cron 表达式
- 创新实训6.13
- 避免常见的Android内存泄漏
- Python中类的定义与调用
- 概率图模型8:独立性
- swift 16进制颜色转换