现在的项目,如果需要用到计算加速,Nvidia
的CUDA
往往是首选。那么如何在CMake
中编译写好的CUDA
源代码,可以参考如下。
首先使用FIND_PACKAGE
找到已经安装的CUDA
,此时需要配置的环境变量等,应该已经自动配置完成了
接下来,使用CUDA_ADD_LIBRARY
取代原来的ADD_LIBRARY
,如下:
如果是可执行程序,请使用CUDA_ADD_EXECUTABLE
取代ADD_EXECUTABLE
。
现在的项目,如果需要用到计算加速,Nvidia
的CUDA
往往是首选。那么如何在CMake
中编译写好的CUDA
源代码,可以参考如下。
首先使用FIND_PACKAGE
找到已经安装的CUDA
,此时需要配置的环境变量等,应该已经自动配置完成了
接下来,使用CUDA_ADD_LIBRARY
取代原来的ADD_LIBRARY
,如下:
如果是可执行程序,请使用CUDA_ADD_EXECUTABLE
取代ADD_EXECUTABLE
。
正常情况下我们使用已经编译好的ROS
安装包来安装配置默认的ROS
环境,就可以比较好的完成工作了。具体参考Ubuntu14.04安装和配置ROS Indigo。
但是在某些情况下,比如,我们需要替换或更新里面的某些默认安装包的版本(比如OpenCV
)。
这种情况下,我们就只能重新从源代码开始编译,或者构建自己的安装源了。
上面的操作是生成完整的文件,然后再拷贝到需要安装的最终目录(--install-space /opt/ros/$ROS_VER_NAME
指定),但是并没有生成DEB
格式的安装包。
如果我们需要建立自己的安装源,那么参照上面的操作,并且正常编译完成后,使用下面的步骤编译安装包:
至于如何建立自己的源,请参考:建立自己的apt-get源。
对于替换OpenCV
重新编译的情况,参考Ubuntu 14.04.5编译安装OpenCV-2.4.13.5,然后执行sudo apt-get remove libopencv-dev
&&sudo apt-get autoremove
&& rm -rf ~/ros_catkin_ws/install_isolated
删除已经安装好的OpenCV
以及临时文件,然后重新编译ROS
源代码。最后可以从~/ros_catkin_ws/install_isolated/share/cv_bridge/cmake/cv_bridgeConfig.cmake
中看到已经链接刚刚编译安装的OpenCV
版本了。
配置Ubuntu要求允许接受restricted、universe和multiverse的软件源,可以根据下面的链接配置:
https://help.ubuntu.com/community/Repositories/Ubuntu
配置成如下图所示即可,一般情况下,这些配置都是默认的。
设置软件源的代码如下:
一旦添加了正确的软件源,操作系统就知道去哪里下载程序,并根据命令自动安装软件。
首先确认你的Debian的软件包索引是最新的。Debian计划是一个致力于创建一个自由操作系统的合作组织。我们所创建的这个操作系统名为 Debian。Debian系统目前采用Linux内核或者FreeBSD内核。
在ROS中有许多不同的函数库和工具,建议是完全安装,也可以根据自己的要求分别安装。完全安装时的工具包括ROS、rqt、可视化环境rviz、通用机器人库robot-generic libraries、2D(如stage)和3D(如Gazebo)仿真环境2D/3D simulators、导航功能包集navigation and 2D/3D(移动、定位、地图绘制、机械臂控制)、感知库perception(如视觉、激光雷达、RGB-D摄像头等)。
rosdep不仅能够使你更方便的安装一些系统依赖程序包,而且ROS的一些主要部件的运行也需要rosdep。
rosinstall命令是一个使用的非常频繁的命令,使用这个命令可以轻松的下载许多ROS软件包。
添加ROS的环境变量,这样,当你打开你新的shell时,你的bash会话中会自动添加环境变量。
注意:当你用像apt这样的软件包安装管理器安装ROS,那么这些软件包用户是没有权利的去编辑的,当创建一个ROS package和处理一个ROS package时,你应该始终选择一个你有权限工作的目录作为工作目录。
在安装ROS的时候,你会看到提示:source(命令)几个setup.*sh文件,或者甚至添加sourcing到你的shell启动脚本中。这是必须的,因为ROS依赖于结合使用shell环境的概念上。这使得开发依赖不同版本的ROS或者不同系列的package更加容易。
如果你在寻找或者使用你的ROS package上有问题,请确定的你的ROS环境变量设置好了,检查是否有ROS_ROOT和ROS_PACKAGE_PATH这些环境变量。
如果没有,你需要source一些setup.*sh文件。
环境设置文件是为你产生的,但是可以来自不同的地方:
注意:rosbuild和catkin是两种组织和编译ROS代码的方式,前者简单易用,后者更加复杂但是提供更多灵活性尤其是对那些需要去集成外部代码或者想发布自己软件的人。
如果你在Ubuntu 14.04上使用apt工具安装ROS,那么你会在'/opt/ros/indigo/'目录中有setup.*sh文件,你可以这样source它们:
你每次打开新的shell都需要运行这个命令,如果你把source /opt/ros/indigo/setup.bash添加进.bashrc文件就不必要每次打开一个新的shell都运行这条命令才能使用ROS的命令了。
对于ROS Groovy和之后的版本可以参考以下方式建立catkin工作环境。在shell中运行:
可以看到在src文件夹中可以看到一个CMakeLists.txt的链接文件,即使这个工作空间是空的(在src中没有package),任然可以建立一个工作空间。
catkin_make命令可以非常方便的建立一个catkin工作空间,在你的当前目录中可以看到有build和devel两个文件夹,在devel文件夹中可以看到许多个setup.*sh文件。启用这些文件都会覆盖你现在的环境变量,想了解更多,可以查看文档catkin。在继续下一步之前先启动你的新的setup.*sh 文件。
为了确认你的环境变量是否被setup脚本覆盖了,可以运行一下命令确认你的当前目录是否在环境变量中:
输出:
至此,你的环境已经建立好了,可以继续学习ROS文件系统了!
注意,本文章只针对简单的应用,不涉及到复杂的严重依赖OpenCV
模块的项目。如果依赖复杂,可能会导致OpenCV 2.X
与OpenCV 3.X
的运行时库同时被加载,导致运行时候崩溃。
最近在使用ROS
开发项目,代码从Indigo
(Ubuntu 14.04
)升级到Kinetic
(Ubuntu 16.04
)。
发现OpenCV
升级到了opencv-3.2.0-dev
版本,但是实际使用中发现代码在opencv-2.4.9
版本上能正确运行,但是升级到opencv-3.2.0-dev
版本之后,就不能正常工作了。
为了查找问题,需要降级一下OpenCV
版本。
网上查找了一下,找到如下解决方法:
然后修改如下的内容(修改之前请注意先备份)
指向系统自带的opencv-2.4.9
版本
修改完成后,必要的情况下,请在删除~/workspace/ros/catkin/
目录下的build
,devel
目录之后,重新编译。
首先编辑安装源
找到如下内容
开启universe
源,修改为:
然后更新源
然后执行如下安装脚本:
目前在Nvidia TX2
上尝试安装ROS Kinetic
的时候发现依赖libboost-all-dev
,但是自带的源http://ports.ubuntu.com下面没有合适的源,尽管在universe
源下面包含libboost-all-dev
,但是实际安装的时候发现安装不上。
因此尝试手工编译最新的boost
安装包,建立自己的源。
首先,编译安装最新的crosstool-ng
,如下:
生成的工具链在~/x-tools/aarch64-rpi3-linux-gnueabi
目录下,编译的时候,指定编译工具即可。
安装编译依赖
接着,下载并编译最新的代码
注意,对于boost-1.58
来说,当时的代码是没有检测ARM64
的功能的,当年也没有ARM64
的芯片。因此需要修改{boost_root}/libs/config/checks/architecture/arm.cpp
里面的代码,增加ARM64
的判断
调整为
在Ubuntu 16.04
上测试OpenCV 3.2
,遇到一个在子线程中更新图像,而界面不刷新的问题。
编译执行如下代码:
可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。
这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。
修改后的代码如下:
也就是每次更新图片后手工调用代码
这个等候时间,只要大于0
即可,比如:
对于Ubuntu 14.04.5
系统上的安装操作,请参考Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)
下面是我自己fork
出来修改后的代码在Ubuntu 16.04.3
系统上的安装操作
要求机器上必须有CUDA 8.0/9.0
支持的显卡才可以。
OpenPTrack
OpenPTrack
目录Kinect V2
驱动程序安装检查当前用户目录下的.bashrc
文件,注释掉如下内容:
然后执行如下命令:
6.重新编译代码
执行如下命令:
检查当前用户目录下的.bashrc
文件,然后注释掉如下内容:
上面语句如不注释,会导致程序启动时候的崩溃。
新建一个Shell
,执行如下命令
执行此步的时候如果提示找不到Kinect
设备,请重启一下系统再试试。
可能需要重新插拔一下Kinect
的USB
数据线,然后执行如下命令
执行之后,等待十几秒,然后Ctrl+C
中断执行。
执行完成后,执行
之后,会弹出三个界面出来。
当前大家学习ROS还是以自学为主,所以会走很多的弯路,目前所谓的大神们也都是这样过来的。基本上早期开发机器人大家都是各干各的,甚至是防着彼此,生怕别人把我们的代码、设计抄袭过去,这样其实大家就是在重复地造轮子,进行一些底层的无聊工作。