由于项目需求,要使用Jetson TX2安装ROS系统以及相关用于机器人控制的各种库,因此编写这篇文章用于记录过程中遇到的问题。
网上也找到各路大神的相关教材,也附加到下面以供参考。
主要是参考官网的安装教程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
安装好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来运行。
由于通过apt install python3-opencv安装到的cv2版本只有3.2,如果要安装3.4.7则需要下载源码进行安装,方法相对也简单,只是对于下载源文件的网速有些要求,有时候会很慢。
网上已经有不少用户给出了相关的安装方法,只是版本不同,具体操作差别不大,主要分为下面几个部分:
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
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/
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
python3
>>>import cv2
>>>cv2.__version__
查询成功则说明opencv安装成功
有时通过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())
参考文章: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)
__init__.py
文件,并按需求自行添加python_lib_1.py
等文件。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文件夹。
## Uncomment if the package has a setup.py
catkin_python_setup()
catkin_make
重新编译,并source后运行程序即可。随后你则可以在其他package当中使用python_lib_1.py中的程序,只需from python_lib_1 import *
即可。
利用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
在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当中。