Jetson TX2 Ubuntu 18.04下安装ROS melodic及相关问题汇总

由于项目需求,要使用Jetson TX2安装ROS系统以及相关用于机器人控制的各种库,因此编写这篇文章用于记录过程中遇到的问题。
网上也找到各路大神的相关教材,也附加到下面以供参考。

安装需求

  1. ROS Melodic
  2. OpenCV 3.4
  3. Python3.6
  4. Pytorch
  5. Flask
  6. Pygame

安装步骤

1. ROS Melodic

主要是参考官网的安装教程http://wiki.ros.org/melodic/Installation/Ubuntu
由于TX2上国内源会出现各种各样的奇怪问题,尽量保持原有的程序源ports.ubuntu.com,虽然慢是慢了点但是好过出现问题了而不知道怎么解决。TX2是可以使用apt来进行ros安装的,比树莓派方便了不少。
基本按照教程就可以顺利安装,选择安装ros-melodic-desktop-full,毕竟TX2还是有足够的资源和空间来安装的。安装完成后按照官网教程一步步执行到最后安装各类依赖包之后就算完成了ROS的安装了。有的时候因为网络原因可能导致apt下载或者安装不完全,则可以重新执行安装命令完成补全。

sudo apt install ros-melodic-desktop-full

2. rospkg

安装好ros之后,ros对于python3的支持有些问题,需要额外利用pip3安装一些库文件,比如:

sudo apt install python3-pip
pip3 install numpy
pip3 install catkin-tools
pip3 install rospkg

此外需要注明一点,如果需要使用python3运行rosrun中的文件,则需要在每个.py文件的头部添加

#! \usr\bin\python3

来指定相应的解释器,防止调用了ros默认的python2来运行。

3.OpenCV 3.4.7

由于通过apt install python3-opencv安装到的cv2版本只有3.2,如果要安装3.4.7则需要下载源码进行安装,方法相对也简单,只是对于下载源文件的网速有些要求,有时候会很慢。
网上已经有不少用户给出了相关的安装方法,只是版本不同,具体操作差别不大,主要分为下面几个部分:

  1. 安装依赖包
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install -y libv4l-dev v4l-utils qv4l2 v4l2ucp
sudo apt-get install -y curl
  1. 进入到一个想要下载的目录
mkdir ~/opencv
cd ~/opencv
wget https://github.com/opencv/opencv/archive/3.4.7.zip
unzip 3.4.7.zip 
cd 3.4.7/
mkdir release
cd release/
  1. 编译及安装
cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBUILD_PNG=OFF \
    -DBUILD_TIFF=OFF \
    -DBUILD_TBB=OFF \
    -DBUILD_JPEG=OFF \
    -DBUILD_JASPER=OFF \
    -DBUILD_ZLIB=OFF \
    -DBUILD_EXAMPLES=ON \
    -DBUILD_opencv_java=OFF \
    -DBUILD_opencv_python2=OFF \
    -DBUILD_opencv_python3=ON \
    -DENABLE_PRECOMPILED_HEADERS=OFF \
    -DWITH_OPENCL=OFF \
    -DWITH_OPENMP=OFF \
    -DWITH_FFMPEG=ON \
    -DWITH_GSTREAMER=OFF \
    -DWITH_GSTREAMER_0_10=OFF \
    -DWITH_CUDA=ON \
    -DWITH_GTK=ON \
    -DWITH_VTK=OFF \
    -DWITH_TBB=OFF \
    -DWITH_1394=OFF \
    -DWITH_OPENEXR=OFF \
    -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
    -DCUDA_ARCH_BIN=6.2 \
    -DCUDA_ARCH_PTX="" \
    -DINSTALL_C_EXAMPLES=OFF \
    -DINSTALL_TESTS=OFF \
    ..
make
sudo make install
  1. 查看,由于我是在python中使用,因此直接在python console里打开
python3
>>>import cv2
>>>cv2.__version__

查询成功则说明opencv安装成功

4. pip3

有时通过pip3安装时可能出现Could not find a version that satisfies the requirement ...的问题,则需要升级pip3来完善相应的资源库。
pip3 install --upgrade pip
然而升级完pip3后继续通过pip3 install来安装则又会出现下面的这种错误提示

ImportError: Cannot import name 'main'

这是由于pip文件的问题引起的,找到对应的文件/usr/bin/pip3将里面的内容改成下面的样子即可,注意是__main__和_main()。

from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())

5. ROS中引用另外一个package中的python文件

参考文章:https://hepeng.me/ros-import-python-module-from-another-package/
由于ROSwiki当中对此内容的描述过于复杂,因此本章节以一个相对简单的例子进行解释。假如在你建立好的现有package之外想要建立一个供其他package共同使用的lib,但是又不想把它放到python本身的库路径当中,则需要首先建立一个新的package叫做common,其中的python库文件在common/lib当中,则建立好的package格式如下

catkin_ws
|--src
|  |--common
|  |  |--lib (created by user)
|  |  |  |--__init__.py (created by user)
|  |  |  |--python_lib_1.py (created by user)
|  |  |  |--python_lib_2.py (created by user)
|  |  |--CMakeLists.txt
|  |  |--package.xml
|  |  |--setup.py (created by user)
  • 你可以在由catkin_create_pkg生成的库文件中添加一个lib文件夹,并创建一个空的__init__.py文件,并按需求自行添加python_lib_1.py等文件。
  • 在common文件夹层面创建一个setup.py文件,并在该文件中添加以下内容
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup

setup_args = generate_distutils_setup(
    packages=['lib_package_name'],
	package_dir={'': 'lib'}
)
setup(**setup_args)

根据个人的理解,这个lib_package_name的名字可以随意起,这个名字将是后面配置其他package的依赖时所使用,而真中python import时的名字则是common/lib里面的python文件。
同时package_dir中的字典需要指向lib文件夹。

  • 在CMakeLists.txt中删除如下命令的自带注释
## Uncomment if the package has a setup.py
catkin_python_setup()
  • 随后进行catkin_make重新编译,并source后运行程序即可。

随后你则可以在其他package当中使用python_lib_1.py中的程序,只需from python_lib_1 import *即可。

6. Flask

利用Flask创建简易的网张能够在ROS的情况下远程查看运行状态,而且不需要上位机安装任何APP或ROS,在功能要求不复杂的情况下能够有效提高开发效率。
这里主要遇到的问题是通过多线程的方式在ROS节点的函数中调用Flask框架时会出现signal only works in main thread这样的错误,这个问题出现的主要原因是Flask在debug模式下reloader一直在工作,reloader的主要作用是当你代码更新时不需要停掉并重新运行Flask,而是会将你的代码改动实时反映出来,而reloader要求必须在__main__进程当中才能被使用,所以在运行server的时候关闭reloader功能即可,如app.run(debug=True, use_reloader=False),参考https://stackoverflow.com/questions/31264826/start-a-flask-application-in-separate-thread

7.roslaunch

在roslaunch中如果需要某一个package的输出到新的terminal当中,则需要在package.xml节点配置当中添加一项,launch-prefix=“gnome-terminal -e”,例如:

<launch>
  <node pkg="a" name="a_node" type="perception_node.py" output="screen"/>
  <node pkg="b" name="b_node" type="localization_node.py" output="screen"/>
  <node pkg="c" name="c_node" type="interface_node.py" launch-prefix="gnome-terminal -e" output="screen"/>
launch>

则a_node和b_node会输出在一开始的terminal当中,而c_node则会输出到一个新的terminal当中。

你可能感兴趣的:(Jetson TX2 Ubuntu 18.04下安装ROS melodic及相关问题汇总)