最近没啥可写博客了的,而且自己的毕业设计刚好是ROS的SLAM+MoveIt相关的,怕写的太多论文查重没法通过。

最近有小伙伴联系到我,问了我八个ROS问题,我觉得很有意义,所以在这里给大家整理一下供大家一起学习。

大家在学习有困惑可以发送问题给我(1692697820@qq.com),我会找时间整理并回复大家。也欢迎大家在“泡泡”里面进行提问~

这里我们来讲解第四个问题,使用Kinect的功能包在18.04可以直接用吗?需要进行修改吗?


这里我要和你确认一点,是kinect深度相机,还是Kinetic版本的ROS,经常有人问我的时候这两个关键字给搞混。

但这两个问题的实质上是一样的——老版本的功能包能否在新版本的ROS系统当中使用。答案是可以的,但是你需要做适配。

首先是驱动的适配,像思岚A1这种的雷达,我们可以直接使用它的功能包来发布scan话题,但是对于一些深度相机来说,你还需要来配置它相应的驱动程序,而这部分驱动程序的配置也是最麻烦的地方。不同版本的Ubuntu系统配置的方法存在差异,而且网络上的环境、教程确实很让人难受。可能你上周使用的安装教程,这周就已经不能使用,很是难受。

第二类的是功能包的配置,比如cartographer功能包,你需要安装的东西简直太多了。Intel的Realsense深度相机同样也是,需要你下载对应的源代码,通过cmake的方式进行进行驱动安装,然后是功能包的编译。

大家在安装ROS的时候,rosdep这一步没有代理的情况下,国内现在基本是铁定要失败的,而这一步我们使用的基本上都是鱼哥的rosdepc。那么这个rosdep到底是什么作用呢?

其实rosdep这一步不执行也没有问题,不影响ROS系统的使用。关于rosdep的作用,我们先来聊一下功能包当中package.xml文件的作用。package.xml文件是功能的“清单”,在这个文件我们可以知道功能包的信息、开发者和维护者信息、版权信息,除了这三个之外,就是依赖项的配置。我这里以其中的注释为例。

<!-- 依赖关系可以是catkin包或系统依赖关系 -->
  <!-- Examples: -->
  <!-- 使用depend作为构建依赖和执行依赖的包的快捷方式 -->
  <!-- <depend>roscpp</depend> -->
  
  <!-- 注意,这相当于以下内容: -->
  <!-- <build_depend>roscpp</build_depend> -->
  <!-- <exec_depend>roscpp</exec_depend> -->
  
  <!-- 对编译时需要的包使用build_depend: -->
  <!-- <build_depend>message_generation</build_depend> -->
  
  <!-- 使用build_export_depend来构建你需要的包: -->
  <!-- <build_export_depend>message_generation</build_export_depend> -->
  
  <!-- 使用buildtool_depend构建工具包: -->
  <!-- <buildtool_depend>catkin</buildtool_depend> -->
  
  <!-- 对运行时需要的包使用exec_depend: -->
  <!-- <exec_depend>message_runtime</exec_depend> -->
  
  <!-- 对只用于测试的包使用test_depend: -->
  <!-- <test_depend>gtest</test_depend> -->
  
  <!-- 使用doc_depend包,你只需要建立文档: -->
  <!-- <doc_depend>doxygen</doc_depend> -->

基本上我们用的只有四个buildtool_depend、build_depend、build_export_depend、exec_depend。

buildtool_depend是编译工具依赖,在ROS-I下这里就是catkin。

build_depend是编译依赖,这个功能包在编译的时候需要有哪些依赖项。

build_export_depend是编译输出依赖,这个功能在编译的时候输出的内容的依赖项。

exec_depend是运行依赖,这个功能包在运行的时候需要有哪些依赖项。如果是更早的ROS-I版本的话,这里是run_depend。

rosdep命令的作用就是用来安装功能包的依赖项。在没有执行rosdep的情况下,依赖项我们需要自己去手动修复,这个时候就很考验你Linux的基础是否咋实,可能是功能包依赖的丢失,编译的时候找不到相应的功能包;也有可能是这个功能包里面某个代码对环境的依赖项丢失(比如boost、C++的OpenCV、Qt4之类等等,很多),这个时候很考验你的能力。这里有什么技巧呢,也确实有!

这种情况基本上(起码80%的概率)是缺什么东西,我们根据报错的提示,结合输出内容的上下文来分析。再或者你把报错消息百度、或者在古月居社区搜索,60%的情况下你都可能会找到相应的解决方案。

rosdep可以很好的来修复这些依赖,通过下面的这条命令可以直接去修复所有工作空间的依赖。

rosdep install --from-paths src --ignore-src -r -y

然而遗憾的是,现在的网络环境在没有代理的情况下,执行个rosdep初始化和rosdep更新都是问题。所以,学会手动修复吧!如果你对Linux系统不熟悉的情况下,我强烈建议你去买一块ROS2GO,它会为你剩下很多时间,而且可能会挽救你的心态。(好多玩ROS的呗环境搞到心态爆炸转向放弃)

以上是我阐述的第一点,Kinetic的功能包在Ubuntu18.04上面的使用,这个内容适用于所有的功能包。我很喜欢古月居社区的“泡泡”功能,解答别人的问题,可以让我更好更快的得到提升。以战养战,百战不殆!错误见的多了,也就那么回事!

如果你的这个问题是Kinect深度相机在Ubuntu18.04下使用的话,那么驱动安装是少不了的。必要的情况下显卡驱动、GPU的配置、CUDA、cuDNN等等都是跑不掉的。配置好驱动的情况下使用melodic的openni——launch功能包是可以直接打开Kinect并发布相关数据的。驱动安装的话,可以参考官网的教程,如果你看的懂的话。

我比较喜欢去百度搜索一些博客的安装教程,以时间为参考,找时间最近的一篇安装教程90%的情况下基本都可以。

功能包,通过apt-get安装的一定能使用,无法通过apt-get安装的就需要从github/gitee下载相应的功能包进行编译,这个过程也是个踩坑修依赖的过程。所以,加油吧!少年!有问题记得来古月居社区发“泡泡”~

功能包还有个问题,就是Python版本。这问题怎么说呢,以前用py2to3可以解决,到现在的话,我基本上是将所有功能包设计python的代码往Python3做迁移。这个过程其实就是你对Python语法掌握程度,Python2和Python3差别不大,只是一些关键字及其语法等方面发生了变化,还是可以修复的。ros_arduino_bridge功能包的Python驱动,这个无法在Pthon3的环境下使用,大家有兴趣的可以挑战一下,试着来修复实现在Python3下的兼容。

我也将系统的python创建了软链接,直接连向了Python3的环境,终端输入python直接打开python3,这里可以通过ln -s的指令来实现。如果你说Ubuntu20.04 + Noeitc的系统,可以直接链接,Ubuntu20.04没有python,只有python2和python3两个;但如果你说Ubuntu18.04 + Melodic的情况下,切记一定要将之前的链接做个bak,以备不时之需。

Ubuntu 16.04对应Kinetic

Ubuntu 18.04对应Melodic

Ubuntu 20.04对应Noetic

还是建议大家使用Ubuntu 20.04,安装ROS-I的Noetic和ROS-II的Foxy,而且个人感觉Ubuntu20.04的环境比16和18的容易配置一些。