CMake如何编译CUDA(.cu)源文件

现在的项目,如果需要用到计算加速,NvidiaCUDA往往是首选。那么如何在CMake中编译写好的CUDA源代码,可以参考如下。

首先使用FIND_PACKAGE找到已经安装的CUDA,此时需要配置的环境变量等,应该已经自动配置完成了

SET(CUDA_VERSION 8.0)
FIND_PACKAGE(CUDA ${CUDA_VERSION} REQUIRED)
STRING (TOLOWER ${CMAKE_SYSTEM_NAME} LOWER_SYSTEM_NAME)
SET(CUDA_TARGET_INCLUDE  ${CUDA_TOOLKIT_ROOT_DIR}-${CUDA_VERSION}/targets/${CMAKE_HOST_SYSTEM_PROCESSOR}-${LOWER_SYSTEM_NAME}/include)

接下来,使用CUDA_ADD_LIBRARY取代原来的ADD_LIBRARY,如下:

CUDA_ADD_LIBRARY(mylib SHARED
    file1.cpp
    file2.cu
    file3.cpp
    OPTIONS -arch sm_20
)

TARGET_LINK_LIBRARIES(mylib ${CUDA_LIBRARIES})

如果是可执行程序,请使用CUDA_ADD_EXECUTABLE取代ADD_EXECUTABLE

参考链接


CMake: how to add cuda to existing project

Ubuntu 14.04.5源代码编译ROS Indigo并建立自己的DEB安装源

正常情况下我们使用已经编译好的ROS安装包来安装配置默认的ROS环境,就可以比较好的完成工作了。具体参考Ubuntu14.04安装和配置ROS Indigo

但是在某些情况下,比如,我们需要替换或更新里面的某些默认安装包的版本(比如OpenCV)。

这种情况下,我们就只能重新从源代码开始编译,或者构建自己的安装源了。

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

$ sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential

$ sudo rosdep init

$ rosdep update

$ mkdir ~/ros_catkin_ws
$ cd ~/ros_catkin_ws

$ export ROS_VER_NAME=indigo
$ export OS_VER_NAME=trusty

#如果是全部重新编译,则删除整个src目录再进行操作
$ rosinstall_generator desktop_full --rosdistro $ROS_VER_NAME --deps --wet-only --tar > $ROS_VER_NAME-desktop-full-wet.rosinstall

$ wstool init -j8 src $ROS_VER_NAME-desktop-full-wet.rosinstall

$ rosdep install --from-paths src --ignore-src --rosdistro $ROS_VER_NAME -y

$ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release

#如果想一步到位,安装到最终目录,请执行如下命令,主要是 --install-space /opt/ros/$ROS_VER_NAME
# sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/$ROS_VER_NAME

上面的操作是生成完整的文件,然后再拷贝到需要安装的最终目录(--install-space /opt/ros/$ROS_VER_NAME指定),但是并没有生成DEB格式的安装包。

如果我们需要建立自己的安装源,那么参照上面的操作,并且正常编译完成后,使用下面的步骤编译安装包:

$ export ROS_VER_NAME=indigo 
$ export OS_VER_NAME=trusty

#如果要生成deb安装包,需要按照顺序操作
$ sudo apt-get install python-bloom

#编译并安装基础核心模块
#-----------------------catkin-------------------------------
$ cd ~/ros_catkin_ws/src/catkin/

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME

$ fakeroot debian/rules binary

#需要安装,后续的模块编译依赖前面编译的模块
$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-catkin*.deb

#部分Python模块依赖我们刚刚编译的模块,把路径加入,否在后续模块编译会报错
$ export PYTHONPATH=$PYTHONPATH:/opt/ros/indigo/lib/python2.7/dist-packages

#-----------------------genmsg-------------------------------
$ cd ~/ros_catkin_ws/src/genmsg/

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME 

$ fakeroot debian/rules binary

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-genmsg*.deb


#-----------------------genpy-------------------------------
$ cd ~/ros_catkin_ws/src/genpy/ 

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME 

$ fakeroot debian/rules binary 

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-genpy*.deb


#-----------------------gencpp------------------------------- 
$ cd ~/ros_catkin_ws/src/gencpp/ 

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME 

$ fakeroot debian/rules binary 

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-gencpp*.deb


#-----------------------genlisp------------------------------- 
$ cd ~/ros_catkin_ws/src/genlisp/ 

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME 

$ fakeroot debian/rules binary 

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-genlisp*.deb


#-----------------------message_generation------------------------------- 
$ cd ~/ros_catkin_ws/src/message_generation/

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME

$ fakeroot debian/rules binary

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-message-generation*.deb

#-----------------------message_runtime------------------------------- 
$ cd ~/ros_catkin_ws/src/message_runtime/

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME

$ fakeroot debian/rules binary

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-message-runtime*.deb

........................................................................

#-----------------------std_msgs------------------------------- 
$ cd ~/ros_catkin_ws/src/std_msgs/

$ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME

$ fakeroot debian/rules binary

$ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-std-msgs*.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版本了。

参考链接


Ubuntu14.04安装和配置ROS Indigo

安装ROS

配置Ubuntu的软件源

配置Ubuntu要求允许接受restricted、universe和multiverse的软件源,可以根据下面的链接配置:
https://help.ubuntu.com/community/Repositories/Ubuntu

配置成如下图所示即可,一般情况下,这些配置都是默认的。

添加软件源到sources.list

设置软件源的代码如下:

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'

一旦添加了正确的软件源,操作系统就知道去哪里下载程序,并根据命令自动安装软件。

设置密钥

$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

安装

首先确认你的Debian的软件包索引是最新的。Debian计划是一个致力于创建一个自由操作系统的合作组织。我们所创建的这个操作系统名为 Debian。Debian系统目前采用Linux内核或者FreeBSD内核。

$ sudo apt-get update

在ROS中有许多不同的函数库和工具,建议是完全安装,也可以根据自己的要求分别安装。完全安装时的工具包括ROS、rqt、可视化环境rviz、通用机器人库robot-generic libraries、2D(如stage)和3D(如Gazebo)仿真环境2D/3D simulators、导航功能包集navigation and 2D/3D(移动、定位、地图绘制、机械臂控制)、感知库perception(如视觉、激光雷达、RGB-D摄像头等)。

$ sudo apt-get install ros-indigo-desktop-full

初始化rosdep

rosdep不仅能够使你更方便的安装一些系统依赖程序包,而且ROS的一些主要部件的运行也需要rosdep。

$ sudo rosdep init
$ rosdep update

安装rosinstall

rosinstall命令是一个使用的非常频繁的命令,使用这个命令可以轻松的下载许多ROS软件包。

$ sudo apt-get install python-rosinstall

设置环境

添加ROS的环境变量,这样,当你打开你新的shell时,你的bash会话中会自动添加环境变量。

$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
# 使环境变量设置立即生效
$ source ~/.bashrc

配置你的ROS环境

注意:当你用像apt这样的软件包安装管理器安装ROS,那么这些软件包用户是没有权利的去编辑的,当创建一个ROS package和处理一个ROS package时,你应该始终选择一个你有权限工作的目录作为工作目录。

管理你的环境

在安装ROS的时候,你会看到提示:source(命令)几个setup.*sh文件,或者甚至添加sourcing到你的shell启动脚本中。这是必须的,因为ROS依赖于结合使用shell环境的概念上。这使得开发依赖不同版本的ROS或者不同系列的package更加容易。

如果你在寻找或者使用你的ROS package上有问题,请确定的你的ROS环境变量设置好了,检查是否有ROS_ROOT和ROS_PACKAGE_PATH这些环境变量。

$ export | grep ROS

如果没有,你需要source一些setup.*sh文件。

环境设置文件是为你产生的,但是可以来自不同的地方:

  • 使用package管理器安装的ROS package提供setup.*sh文件;
  • rosbuild workspace使用像rosws这样的工具提供setup.*sh文件;
  • setup.*sh文件在编译和安装catkin package时作为副产品创建。

注意:rosbuild和catkin是两种组织和编译ROS代码的方式,前者简单易用,后者更加复杂但是提供更多灵活性尤其是对那些需要去集成外部代码或者想发布自己软件的人。

如果你在Ubuntu 14.04上使用apt工具安装ROS,那么你会在'/opt/ros/indigo/'目录中有setup.*sh文件,你可以这样source它们:

$ source /opt/ros/indigo/setup.bash

你每次打开新的shell都需要运行这个命令,如果你把source /opt/ros/indigo/setup.bash添加进.bashrc文件就不必要每次打开一个新的shell都运行这条命令才能使用ROS的命令了。

创建ROS工作环境

对于ROS Groovy和之后的版本可以参考以下方式建立catkin工作环境。在shell中运行:

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

可以看到在src文件夹中可以看到一个CMakeLists.txt的链接文件,即使这个工作空间是空的(在src中没有package),任然可以建立一个工作空间。

$ cd ~/catkin_ws/
$ catkin_make

catkin_make命令可以非常方便的建立一个catkin工作空间,在你的当前目录中可以看到有build和devel两个文件夹,在devel文件夹中可以看到许多个setup.*sh文件。启用这些文件都会覆盖你现在的环境变量,想了解更多,可以查看文档catkin。在继续下一步之前先启动你的新的setup.*sh 文件。

$ source devel/setup.bash

为了确认你的环境变量是否被setup脚本覆盖了,可以运行一下命令确认你的当前目录是否在环境变量中:

$ echo $ROS_PACKAGE_PATH

输出:

/home/youruser/catkin_ws/src:/opt/ros/indigo/share:
/opt/ros/indigo/stacks

至此,你的环境已经建立好了,可以继续学习ROS文件系统了!

参考链接


Ubuntu14.04安装和配置ROS Indigo

ROS Kinetic切换OpenCV到2.X版本

注意,本文章只针对简单的应用,不涉及到复杂的严重依赖OpenCV模块的项目。如果依赖复杂,可能会导致OpenCV 2.XOpenCV 3.X的运行时库同时被加载,导致运行时候崩溃。

最近在使用ROS开发项目,代码从Indigo(Ubuntu 14.04)升级到KineticUbuntu 16.04)。

发现OpenCV升级到了opencv-3.2.0-dev版本,但是实际使用中发现代码在opencv-2.4.9版本上能正确运行,但是升级到opencv-3.2.0-dev版本之后,就不能正常工作了。

为了查找问题,需要降级一下OpenCV版本。

网上查找了一下,找到如下解决方法:

$ sudo apt-get install libcv-dev

$ sudo apt-get install libopencv-dev

$ sudo apt-get install libopencv-contrib-dev

$ sudo apt-get install libopencv-gpu-dev

$ sudo gedit /opt/ros/kinetic/share/cv_bridge/cmake/cv_bridgeConfig.cmake

然后修改如下的内容(修改之前请注意先备份

第94-96行:
    if(NOT "include;/opt/ros/kinetic/include/opencv-3.1.0-dev/opencv;/opt/ros/kinetic/include/opencv-3.1.0-dev " STREQUAL " ")
      set(cv_bridge_INCLUDE_DIRS "")
      set(_include_dirs "include;/opt/ros/kinetic/include/opencv-3.1.0-dev/opencv;/opt/ros/kinetic/include/opencv-3.1.0-dev")

#112行:
set(libraries "cv_bridge;/opt/ros/kinetic/lib/libopencv_calib3d3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_core3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_features2d3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_flann3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_highgui3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_imgcodecs3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_imgproc3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_ml3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_objdetect3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_photo3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_shape3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_stitching3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_superres3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_video3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_videoio3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_videostab3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_viz3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_aruco3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_bgsegm3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_bioinspired3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_ccalib3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_cvv3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_datasets3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_dpm3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_face3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_fuzzy3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_hdf3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_line_descriptor3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_optflow3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_phase_unwrapping3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_plot3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_reg3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_rgbd3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_saliency3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_stereo3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_structured_light3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_surface_matching3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_text3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_xfeatures2d3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_ximgproc3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_xobjdetect3.so.3.2.0;/opt/ros/kinetic/lib/libopencv_xphoto3.so.3.2.0")

指向系统自带的opencv-2.4.9版本

#94-96行:
if(NOT "include;/usr/include/opencv;/usr/include " STREQUAL " ")
  set(cv_bridge_INCLUDE_DIRS "")
  set(_include_dirs "include;/usr/include/opencv;/usr/include")

#112行:
set(libraries "cv_bridge;/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so;/usr/lib/x86_64-linux-gnu/libopencv_contrib.so;/usr/lib/x86_64-linux-gnu/libopencv_core.so;/usr/lib/x86_64-linux-gnu/libopencv_features2d.so;/usr/lib/x86_64-linux-gnu/libopencv_flann.so;/usr/lib/x86_64-linux-gnu/libopencv_gpu.so;/usr/lib/x86_64-linux-gnu/libopencv_highgui.so;/usr/lib/x86_64-linux-gnu/libopencv_imgproc.so;/usr/lib/x86_64-linux-gnu/libopencv_legacy.so;/usr/lib/x86_64-linux-gnu/libopencv_ml.so;/usr/lib/x86_64-linux-gnu/libopencv_objdetect.so;/usr/lib/x86_64-linux-gnu/libopencv_ocl.so;/usr/lib/x86_64-linux-gnu/libopencv_photo.so;/usr/lib/x86_64-linux-gnu/libopencv_stitching.so;/usr/lib/x86_64-linux-gnu/libopencv_superres.so;/usr/lib/x86_64-linux-gnu/libopencv_ts.so;/usr/lib/x86_64-linux-gnu/libopencv_video.so;/usr/lib/x86_64-linux-gnu/libopencv_videostab.so")

修改完成后,必要的情况下,请在删除~/workspace/ros/catkin/目录下的builddevel目录之后,重新编译。

参考链接


NVIDIA TX2 (Ubuntu 16.04)上安装ROS

首先编辑安装源

$ sudo vim /etc/apt/sources.list

找到如下内容

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted

deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse

开启universe源,修改为:

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted

deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe
# deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse

然后更新源

$ sudo apt-get update

然后执行如下安装脚本:

#!/bin/bash
sudo apt-get update 
sudo apt-get upgrade -y --force-yes
sudo apt-get autoremove -y

# 必须先安装boost ,否则,整个安装过程会失败,应该是apt的BUG
sudo apt-get -y install libboost-all-dev

UBUNTU_VERSION=`lsb_release -c -s`
ROS_DISTRO=hydro

if [ $UBUNTU_VERSION = trusty ] || [ $UBUNTU_VERSION = saucy ] ; then
  ROS_DISTRO=indigo
elif [ $UBUNTU_VERSION = xenial ] ; then
  ROS_DISTRO=kinetic
fi

ROS_PACKAGES="python-rosinstall ros-$ROS_DISTRO-robot-state-publisher ros-$ROS_DISTRO-cmake-modules ros-$ROS_DISTRO-freenect-stack ros-$ROS_DISTRO-openni-launch ros-$ROS_DISTRO-camera-info-manager-py"

echo "deb http://packages.ros.org/ros/ubuntu $UBUNTU_VERSION main" | sudo tee /etc/apt/sources.list.d/ros-latest.list
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-get update
sudo apt-get install ros-$ROS_DISTRO-desktop-full -y
sudo rosdep init
rosdep update
sudo apt-get install $ROS_PACKAGES -y --force-yes

参考链接


Ubuntu 16.04上使用crosstool-ng编译Nvidia TX2上使用的boost库

目前在Nvidia TX2上尝试安装ROS Kinetic的时候发现依赖libboost-all-dev,但是自带的源http://ports.ubuntu.com下面没有合适的源,尽管在universe源下面包含libboost-all-dev ,但是实际安装的时候发现安装不上。

因此尝试手工编译最新的boost安装包,建立自己的源。

首先,编译安装最新的crosstool-ng,如下:

$ sudo apt-get install git

$ sudo apt-get install gperf

$ sudo apt-get install bison

$ sudo apt-get install flex

$ sudo apt-get install texinfo

$ sudo apt-get install help2man

$ sudo apt-get install gawk

$ sudo apt-get install libncurses5-dev

$ cd ~

$ git clone https://github.com/crosstool-ng/crosstool-ng.git

$ cd crosstool-ng

$ git checkout crosstool-ng-1.23.0

$ ./bootstrap

$ ./configure --prefix=/usr/local

$ make

$ sudo make install

$ cd ~

$ mkdir tx2

$ cd tx2

#用树莓派的模板作为参考模板即可
$ cp ~/crosstool-ng/samples/aarch64-rpi3-linux-gnueabi/crosstool.config .config

$ ct-ng oldconfig

#默认一路回车即可,如果使用图形界面配置执行 ct-ng menuconfig
 
$ unset LD_LIBRARY_PATH

$ ct-ng build

生成的工具链在~/x-tools/aarch64-rpi3-linux-gnueabi目录下,编译的时候,指定编译工具即可。

安装编译依赖

$ sudo apt-get install devscripts

$ sudo apt-get install cdbs

$ sudo apt-get install python-dev

$ sudo apt-get install libbz2-dev

接着,下载并编译最新的代码

#!/bin/bash
export DEBVERSION=1.58.0-1
if [ ! -d "boost_1_58_0" ]; then
    wget "http://nchc.dl.sourceforge.net/project/boost/boost/1.58.0/boost_1_58_0.tar.bz2" -O boost_1_58_0.tar.bz2
    tar xjvf boost_1_58_0.tar.bz2
fi
cd boost_1_58_0

:<<BLOCK
'export DEBVERSION=1.60.0-1
if [ ! -d "boost_1_60_0" ]; then
 wget "http://downloads.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.bz2" -O boost-all_1.60.0.orig.tar.bz2
 tar xjvf boost-all_1.60.0.orig.tar.bz2
fi
cd boost_1_60_0
'
BLOCK

#Build DEB
rm -rf debian
mkdir -p debian
#Use the LICENSE file from nodejs as copying file
touch debian/copying
#Create the changelog (no messages needed)
dch --create -v $DEBVERSION --package libboost-all ""
#Create copyright file
touch debian
#Create control file
cat > debian/control <<EOF
Source: libboost-all
Maintainer: LongSky <wangqiang1588@sina.com>
Section: misc
Priority: optional
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 8), cdbs, libbz2-dev, zlib1g-dev

Package: libboost-all
Architecture: arm64
Depends: \${shlibs:Depends}, \${misc:Depends}, libboost-all (= $DEBVERSION)
Description: Boost library, version $DEBVERSION (shared libraries)

Package: libboost-all-dev
Architecture: any
Depends: libboost-all (= $DEBVERSION)
Description: Boost library, version $DEBVERSION (development files)

Package: libboost-build
Architecture: any
Depends: \${misc:Depends}
Description: Boost Build v2 executable
EOF
#Create rules file
cat > debian/rules <<EOF 
#!/usr/bin/make -f
%:
	dh \$@
override_dh_auto_configure:
	./bootstrap.sh
override_dh_auto_build:
	./b2 link=static,shared -j 1 --prefix=`pwd`/debian/libboost-all/usr/
override_dh_auto_test:
override_dh_auto_install:
	mkdir -p debian/libboost-all/usr debian/libboost-all-dev/usr debian/libboost-build/usr/bin
	./b2 link=static,shared --prefix=`pwd`/debian/libboost-all/usr/ install
	mv debian/libboost-all/usr/include debian/libboost-all-dev/usr
	cp b2 debian/libboost-build/usr/bin
	./b2 install --prefix=`pwd`/debian/libboost-build/usr/ install
EOF
#Create some misc files
echo "8" > debian/compat
mkdir -p debian/source
echo "3.0 (quilt)" > debian/source/format
#Build the package
nice -n19 ionice -c3 debuild -b -d -uc -us

注意,对于boost-1.58来说,当时的代码是没有检测ARM64的功能的,当年也没有ARM64的芯片。因此需要修改{boost_root}/libs/config/checks/architecture/arm.cpp里面的代码,增加ARM64的判断

#if !defined(__arm__) && !defined(__thumb__) && \
    !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \
    !defined(_ARM) && !defined(_M_ARM)
#error "Not ARM"
#endif

调整为

#if !defined(__arm__) && !defined(__thumb__) && \
    !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \
    !defined(_ARM) && !defined(_M_ARM) && !defined(__aarch64__)
#error "Not ARM"
#endif

参考链接


OpenCV使用cv::imshow在子线程中更新图片不刷新

Ubuntu 16.04上测试OpenCV 3.2,遇到一个在子线程中更新图像,而界面不刷新的问题。

$ sudo apt-get install libopencv-dev

编译执行如下代码:

#include <pthread.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <stdlib.h>

void* imshowWorker(void*){
	for(int i = 0;i < 100;i++){
		char str[10+1];
		snprintf(str, 10,"%d",i);
		cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 );  
		cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 ));
		cv::imshow("Number View", img ); 
		if(i > 90){
			i = 0;		
		}
	}	
}

int main(void){
	cv::namedWindow("Number View");
	pthread_t id;
	pthread_create(&id,NULL,imshowWorker,NULL);
	getchar();
	return (0);
}
$ g++ opencv_imshow.cpp   -I `pkg-config --libs opencv` -lpthread -o opencv_imshow

可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。

这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。

修改后的代码如下:

#include <pthread.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <stdlib.h>

void* imshowWorker(void*){
	for(int i = 0;i < 100;i++){
		char str[10+1];
		snprintf(str, 10,"%d",i);
		cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 );  
		cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 ));
		cv::imshow("Number View", img ); 
		cv::waitKey(30);
		if(i > 90){
			i = 0;		
		}
	}	
}

int main(void){
	cv::namedWindow("Number View");
	pthread_t id;
	pthread_create(&id,NULL,imshowWorker,NULL);
	getchar();
	return (0);
}

也就是每次更新图片后手工调用代码

cv::waitKey(30);

这个等候时间,只要大于0即可,比如:

cv::waitKey(1);

参考链接


c++ opencv image not display inside the boost thread

Ubuntu 16.04.3系统上OpenPTrack V1版本安装配置(Kinect V2)

对于Ubuntu 14.04.5系统上的安装操作,请参考Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)

下面是我自己fork出来修改后的代码在Ubuntu 16.04.3系统上的安装操作

要求机器上必须有CUDA 8.0/9.0支持的显卡才可以。

1.从GitHub上获取项目代码
$ sudo apt-get install git -y
$ cd ~
$ git clone https://github.com/wangqiang1588/open_ptrack_org.git open_ptrack
2.安装ROS
$ cd open_ptrack/scripts
$ chmod +x *.sh
$ ./ros_install.sh

$ source /opt/ros/kinetic/setup.bash
$ ./ros_configure.sh
3.安装OpenPTrack
$ sudo apt-get install libdrm-dev

$ ./openptrack_install.sh
4.链接OpenPTrack目录
$ ln -s  ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack
5.Kinect V2驱动程序安装

检查当前用户目录下的.bashrc文件,注释掉如下内容:

export KINECT_DRIVER=openni

然后执行如下命令:

# Nvidia Jetson TX1/TX2 不要安装这个
$ sudo apt-get install nvidia-375-dev

# Nvidia Jetson TX1/TX2不支持OpenCL,因此编译的时候,不要安装ocl-icd-opencl-dev
$ sudo apt-get install ocl-icd-opencl-dev

$ sudo apt-get install m4
$ sudo apt-get install automake
$ sudo apt-get install libjpeg-dev
$ sudo ln -s -f /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so.0 /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so
$ sudo apt-get install libglewmx-dev
$ sudo apt-get install libudev-dev
$ sudo ln -s -f /lib/`uname -m`-linux-gnu/libudev.so.1 /lib/`uname -m`-linux-gnu/libudev.so

$ cd ~/workspace/ros/catkin/src
$ source ~/.profile 
$ roscd open_ptrack/../scripts
$ chmod +x kinect2_install.sh
$ ./kinect2_install.sh

6.重新编译代码

UBUNTU_VERSION=`lsb_release -c -s`
ROS_DISTRO=hydro

if [ $UBUNTU_VERSION = trusty ] || [ $UBUNTU_VERSION = saucy ] ; then
  ROS_DISTRO=indigo
elif [ $UBUNTU_VERSION = xenial ] ; then
  ROS_DISTRO=kinetic
fi

GCC_VERSION=`gcc -dumpversion | cut -f1 -d.`
source /opt/ros/$ROS_DISTRO/setup.bash 
cd ~/workspace/ros/catkin
catkin_make --pkg calibration_msgs
catkin_make --pkg opt_msgs
#GCC 5 bug out of memory
if [ $GCC_VERSION > 4 ] ; then
  catkin_make --force-cmake -j 1
else
  catkin_make --force-cmake
fi

执行如下命令:

$ roscore

检查当前用户目录下的.bashrc文件,然后注释掉如下内容:

export KINECT_DRIVER=openni

上面语句如不注释,会导致程序启动时候的崩溃。

新建一个Shell,执行如下命令

$ cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge
$ sudo ./kinect2_bridge

执行此步的时候如果提示找不到Kinect设备,请重启一下系统再试试。

7.测试系统

可能需要重新插拔一下KinectUSB数据线,然后执行如下命令

$ roslaunch kinect2_bridge kinect2_bridge.launch

执行之后,等待十几秒,然后Ctrl+C中断执行。
执行完成后,执行

$ roslaunch tracking detection_and_tracking_kinect2.launch

之后,会弹出三个界面出来。

参考链接


机器人程序设计之如何正确入门ROS

当前大家学习ROS还是以自学为主,所以会走很多的弯路,目前所谓的大神们也都是这样过来的。基本上早期开发机器人大家都是各干各的,甚至是防着彼此,生怕别人把我们的代码、设计抄袭过去,这样其实大家就是在重复地造轮子,进行一些底层的无聊工作。

继续阅读机器人程序设计之如何正确入门ROS