0.当前配置
- Ubuntu 16.04
- ROS Kinetic
- Opencv 3.4.1
- Ceres-solver
- gcc version 5.4.0 20160609 (g++)
- *Eigen3
- *G2O
1.前言
本人当下在学习slam_karto,在网上搜寻相关的博客,发现大家使用karto的并不多,大多都是在介绍hector_slam和gmapping_slam.当然还有Google的cartographer.参考他人的博客,gmapping与karto效果比较相似,但似乎gmapping的计算更加复杂,已经集成到ros中,使用的也比较多,cartographer效果很好,缺点是cpu占用率和内存开销较大,代码也非常高深(目前我感觉不太容易看懂,毕竟c++有点陌生还…).所以准备学习下karto,顺便可能的话,也分享下自己的经验.
2.安装Karto
因为slam_karto
是依赖于open_karto
的,所以要先安装open_karto
.有两种方式安装karto_slam
,我本人比较推荐使用第二种
方式,虽然略微复杂一点,但是后续学习修改源代码会方便一点.
第一种:
sudo apt-get install ros-kinetic-open-karto
sudo apt-get install ros-kinetic-slam-karto
注意kinetic
为你ros
对应的版本.
第二种:
cd catkin_ws/src
git clone https://github.com/ros-perception/open_karto.git
git clone https://github.com/ros-perception/slam_karto.git
cd ..
catkin_make
catkin_make
没有报错的话,基本上就安装成功了.你可以尝试运行,但在运行之前别忘记执行下source devel/setup.bash
也可以一劳永逸,在home
下的.bashrc
末尾追加
source /home/yourusername/catkin_ws/devel/setup.bash
分两个Terminal运行:
roscore
rosrun slam_karto slam_karto
现在没有数据,肯定没有输出了,如果报错的话可能电脑坏来吧,要报错也是你catkin_make
报错把.(由于我修改来launch
文件,本来可以roslaunch slam_karto karto_slam.launch
启动的….再这么写怕和我有区别).
3.下载数据集
之前大家的教程也是,光写文字或者运行,就是不给数据集,搞得我光找数据集就找了半天,功夫不负有心人还真让我给找到了,还不少呢.
戳这里:
SKrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
我不确定这个需不需要翻墙,因为我们学校的网没有墙似乎…
下载说明:
- 进去网站后点你想下载的对应的”download log file”
- 然后你可能会看到变成页面一堆数据
ctrl+a
ctrl+c
(你懂的,全部复制,这就是你要的数据集)- 新建一个文档如
data.clf
,存之.注意是.clf
.
4.处理数据集
这个.clf
不是我们用的,我们需要把它转化为特定格式的.bag
文件,然后rosbag play
来使用数据集,
下面给出转化用的python
代码.
先说使用方法:
- 在你
slam_karto
下创建一个script
文件夹,与launch
文件夹同级目录. - 把下面代码创建成一个
.py
文件如convert.py
,然后放到script中. - 因为他要用到
ros
库所以必须保存到某个parkage
的script
中. cd
这个script
下,然后python convert.py path/data.clf path/data.bag
转化成功.
这个代码是
python2.7
,python3.5+
的自己修改下不兼容的语法即可.代码参考这位博主.还有一位,暂时找不到来,往后补上.
#!/usr/bin/env python
#coding=utf8
'''This is a converter for the Intel Research Lab SLAM dataset
( http://kaspar.informatik.uni-freiburg.de/~slamEvaluation/datasets/intel.clf )
to rosbag'''
import rospy
import rosbag
from sensor_msgs.msg import LaserScan
from nav_msgs.msg import Odometry
from math import pi
from tf2_msgs.msg import TFMessage
from geometry_msgs.msg import TransformStamped
import tf
import sys
def make_tf_msg(x, y, theta, t,base,base0):
trans = TransformStamped()
trans.header.stamp = t
trans.header.frame_id = base
trans.child_frame_id = base0
trans.transform.translation.x = x
trans.transform.translation.y = y
q = tf.transformations.quaternion_from_euler(0, 0, theta)
trans.transform.rotation.x = q[0]
trans.transform.rotation.y = q[1]
trans.transform.rotation.z = q[2]
trans.transform.rotation.w = q[3]
msg = TFMessage()
msg.transforms.append(trans)
return msg
if __name__ == "__main__":
if len(sys.argv) < 3:
print "请输入dataset文件名。"
exit()
print "正在处理" + sys.argv[1] + "..."
with open(sys.argv[1]) as dataset:
with rosbag.Bag(sys.argv[2], 'w') as bag:
i = 1
for line in dataset.readlines():
line = line.strip()
tokens = line.split(' ')
if len(tokens) <= 2:
continue
if tokens[0] == 'FLASER':
msg = LaserScan()
num_scans = int(tokens[1])
if num_scans != 180 or len(tokens) < num_scans + 9:
rospy.logwarn("unsupported scan format")
continue
msg.header.frame_id = 'base_laser_link'
t = rospy.Time(float(tokens[(num_scans + 8)]))
msg.header.stamp = t
msg.header.seq = i
i += 1
msg.angle_min = -90.0 / 180.0 * pi
msg.angle_max = 90.0 / 180.0 * pi
msg.angle_increment = pi / num_scans
msg.time_increment = 0.2 / 360.0
msg.scan_time = 0.2
msg.range_min = 0.001
msg.range_max = 50.0
msg.ranges = [float(r) for r in tokens[2:(num_scans + 2)]]
msg.ranges.append(float(0)) #我修改了这
bag.write('scan', msg, t)
odom_x, odom_y, odom_theta = [float(r) for r in tokens[(num_scans + 2):(num_scans + 5)]]
tf_msg = make_tf_msg(odom_x, odom_y, odom_theta, t,'odom','base_link')
bag.write('tf', tf_msg, t)
elif tokens[0] == 'ODOM':
odom_x, odom_y, odom_theta = [float(t) for t in tokens[1:4]]
t = rospy.Time(float(tokens[7]))
tf_msg = make_tf_msg(0, 0, 0, t,'base_link','base_laser_link')
bag.write('tf', tf_msg, t)
5.尽情跑吧
roscore
rosrun slam_karto slam_karto
rosbag play data.bag
如果你装来Rviz的话,可以在Rviz中看出效果了,没装这里也不介绍怎么装了,哈哈.
rosrun rviz rviz
效果图:
6.可能出错的地方
应该没有了吧,catkin_make
可能容易出错,因为那是我根据印象写下的步骤.其次就是python
要2.7
的.
注意那个python代码我改了一点,是因为slam_karto默认的雷达数据应该是180度
,以及181
条激光束,而下载的数据集是180
个激光束,所以我最后增加了一条深度为0的激光束
.
有问题留言讨论吧,看到会及时回你.
溜溜球.skr!