用北阳激光雷达ust-10lx跑slam_karto
引言
在我的之前一篇博文中,讲述了如何用数据集,去哪找数据集,怎么转化数据集,并讲述了怎么跑karto。这篇文档主要介绍下用北阳激光雷达跑数据集的经验。
0.当前配置
- Ubuntu 16.04
- ROS Kinetic
- Opencv 3.4.1
- Ceres-solver
- gcc version 5.4.0 20160609 (g++)
- *Eigen3
- *G2O
- 北阳激光雷达ust-10lx
1.前提你得有一个雷达
哈哈,不充钱怎么做研究。
2.怎么获取雷达数据
这里主要参考了这篇博文,原来时CSDN博客的,现在找不到了。。。
-
首先下载相关节点包
$ sudo apt-get install ros-kinetic-urg-node
-
改ip地址。
之前看博文介绍修改/etc/network/interfaces
,我试了几次,不太行,让后就摸索出一条简单粗暴的方式。- 点击
ubuntu
坐上角的网络链接。 - 最下边编辑链接。
- 选择一个以太网链接,如:有线链接1.
- 编辑。
IPV4设置
,方法改为手动
。点击增加
,地址:192.168.0.20,子网掩码:255.255.255.0,网关:192.168.0.1
;- 保存,OK.
这里解释下,北阳雷达默认采用192.168.0.10
进行数据传送,所以你要把自己的网络链接改为别的地址,防止冲突。
- 点击
-
确认地址可以
ping
通,ping 192.168.0.10
。 -
运行
urg_node
获取数据。roscore
rosrun urg_node urg_node _ip_address:=192.168.0.10
这里注意,是_ip_address
不是ip_address
,一个是私有,一个时公有参数。
当你看到一堆数据,那么恭喜你运行成功了。
3.有个机器人平台
没有也没关系,可以暂时建一个一帧的图像,但是要建场景的地图,需要机器人底盘提供的tf
才能计算位姿,才能谈得上建图。
4.修改karto_slam.launch
可以看到,下面的launch
文件,我增加了urg_node,
,里面另外一点需要关注的是base_frame
和<node name="tf" ... />
中的base_footprint laser
。
- 其中
base_frame
是机器人底盘的frame_id
,可以通过rostopic echo /tf
确认是base_link
还是base_footprint
。 laser
是雷达发布的/scan
话题的LaserScan
数据类型的frame_id
,可以通过rostopic echo /scan
确认,当然,先通过rqt_graph
确定urg_node
发布的是/scan
话题。
<launch>
<include file="$(find kobuki_node)/launch/minimal.launch"/>
<node pkg="urg_node" type="urg_node" name="urg_node">
<param name="ip_address" value="192.168.0.10"/>
</node>
<node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
<param name="map_update_interval" value="5"/>
<param name="map_frame" value="map"/>
<param name="odom_frame" value="odom"/>
<param name="base_frame" value="base_footprint"/>
<param name="throttle_scans" value="1"/>
<param name="resolution" value="0.025"/>
<param name="delta" value="0.05"/>
<param name="transform_publish_period" value="0.05"/>
</node>
<node pkg="tf" type="static_transform_publisher" name="laser_base" args="0.13 0 0 0 0 0 base_footprint laser 50"/>
<node pkg="rviz" type="rviz" name="rviz" required="true"/>
</launch>
还有非常重要的一点
slam_karto里面可以支持不同类型的雷达,但是对ust-10lx支持不是很好,他是270°,1081个激光束,所以你需要把open_karto也下载下来,把karto.h中的static LaserRangeFinder* CreateLaserRangeFinder(LaserRangeFinderType type, const Name& rName)
中的一个类型修改能处理自己的雷达数据类型。
如:
case LaserRangeFinder_Hokuyo_UTM_30LX:
{
pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Hokuyo UTM-30LX"));
// Sensing range is 30 meters
pLrf->m_pMinimumRange->SetValue(0.1);
pLrf->m_pMaximumRange->SetValue(30.0);
// 270 degree range, 40 Hz
pLrf->m_pMinimumAngle->SetValue(math::DegreesToRadians(-135)); //270
pLrf->m_pMaximumAngle->SetValue(math::DegreesToRadians(135)); //270
// 0.25 degree angular resolution
pLrf->m_pAngularResolution->SetValue(math::DegreesToRadians(0.25));
pLrf->m_NumberOfRangeReadings = 1081; //1081配合自己的雷达
}
break;
然后还要修改slame_karto中的slam_karto.cpp
中的SlamKarto::getLaser(const sensor_msgs::LaserScan::ConstPtr& scan)
函数中的这一步
karto::LaserRangeFinder* laser =
karto::LaserRangeFinder::CreateLaserRangeFinder(karto::LaserRangeFinder_Hokuyo_UTM_30LX, karto::Name(name));
看到没,把laserRangeFinder_Hokuyo_UTM_30LX
修改为你在open_karto
中改的那个case
哦,终于大功搞成!!
5.然后运行就可以了
我在launch文件中加了rviz,运行应该就直接可以看到建图效果了。随便放一个效果图吧。
6.遇到的问题
- rviz中map错误,显示不出来。(可能与你的frame有关,可以
rosrun rqt_tf_tree rqt_tf_tree
看下是不是完整的tf_tree。不完整,你就需要认真检查下你的base_frame,odom_frame,map_frame,laser之中有没有错误的了。)
我遇到的就这个的问题,在ROS官网上也提问请教了外国朋友,回答的很耐心,总之,学会咨询别人解决问题吧,也欢迎评论问我,可能回答不会很及时,请见谅。
7.后记
前段时间一直在弄视觉的东西,雷达没怎么动,又很忙,没时间更新总结,也需要反思下。发现还是能给少数人提供些帮助的,就记下来当总结了。
这篇博文凭记忆总结的,可能水了点,不是很详细,额,就这样吧,改是不可能改了,这辈子是不可能改了!!!