在python3中使用ros的库(如geometry及下面的tf等)

在python3中使用ros的库(如geometry及下面的tf等)

文章基于python3.6和ros-kinetic 因为代码中需要在python3环境下使用geometry库,所以想办法解决ros的python3支持问题

问题

在python3环境下,直接使用tf会有如下报错(rospy可正常使用):

>>> import tf
Traceback (most recent call last):
  File "", line 1, in <module>
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf/__init__.py", line 28, in <module>
    from tf2_ros import TransformException as Exception, ConnectivityException, LookupException, ExtrapolationException
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_ros/__init__.py", line 38, in <module>
    from tf2_py import *
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_py/__init__.py", line 38, in <module>
    from ._tf2 import *
ImportError: dynamic module does not define module export function (PyInit__tf2)

冲突的原因是

当前ROS是只支持Python2.7的。Python3的支持在ROS的计划中,详细的可以看[这里](https://github.com/ros-infrastructure/rep/blob/rep151/rep-0151.rst)。简单说来就是要到2020年ROS的N版本才能完全支持Python3。

首先要了解为什么ROS不能支持Python3.对于纯的Python代码同时支持Python3和Python2.7是比较容易的,基本上ROS的代码也都是支持的。问题在于包含了C++或者C的那部分Python代码。Python2.7和Python3的c module代码相差很大。一次只能编译其中的一种版本。而且很多module没有做好Python3的支持。在Python3环境下也无法编译。这就是ROS无法支持Python3的原因。目前ROS的核心包都是支持用Python3从源码编译的。但是官方并没有发布Python3的软件包。所以想要使用的话要自己编译。

一些参考的网站

https://blog.csdn.net/liam_dapaitou/article/details/107656486 ros python3 tf 配置

https://community.bwbot.org/topic/499/%E5%9C%A8ros%E4%B8%AD%E4%BD%BF%E7%94%A8python3 在ROS中使用Python3

https://www.miguelalonsojr.com/blog/robotics/ros/python3/2019/08/20/ros-melodic-python-3-build.html Building ROS Melodic with Python3 support

https://www.pythonheidong.com/blog/article/371387/13de9a6b720aebcceabb/ ros使用python3编译cv_bridge、tf等packages

https://www.cnblogs.com/shepherd2015/p/11257356.html [源码安装ROS Melodic Python3 指南 (转) + 安装记录]

http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment ros官方安装教程

主要有两种解决的方法

1使用python3编译所需要的软件包,在引用软件包时从python3包中引用

2 利用python3源码编译(比较坑,我在其中下载的地方被卡住了,一直没有成功,如果有大佬能告诉原因最好了)

利用python3环境重新编译geometry包

创建虚拟环境

conda create --name gndnet -y
conda activate gndnet

其中gndnet为自己虚拟环境的名字

安装需要使用的包

conda install python=3.6 pip -y
conda install -c anaconda make
pip install numpy
pip install empy
pip install pyyaml
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy

新建一个工作空间(随便取名,这里取名为tf),用来编译geometrygeometry2两个包。

mkdir -p tf/src`
cd tf/src` 
git clone https://github.com/ros/geometry
git clone https://github.com/ros/geometry2#下载两个包
export ROS_PYTHON_VERSION=3`#注意这里,如果安装的ros不是利用python3编译的,加入这句话
cd ..`
catkin_make`

成功后,每次需要使用tf包时

在终端输入

source     ···/tf/devel/setup.bash  

(···为你的文件夹的位置)

为了方便使用,你同样可以把这句话加入到bashrc文件中

可能遇到的问题遇到问题:

问题1

/opt/ros/kinetic/include/ros/time.h:58:50: fatal error: boost/math/special_functions/round.hpp: 没有那个文件或目录
compilation terminated.

原因 boost崩了 考虑重装下boost

问题二 编译catkin_make的时候报错

`CMake Error at /usr/local/lib/cmake/Boost-1.77.0/BoostConfig.cmake:240 (if):
  if given arguments:
  `CMake Error at /usr/local/lib/cmake/Boost-1.77.0/BoostConfig.cmake:240 (if):
  if given arguments:
"ALL" "IN_LIST" "Boost_FIND_COMPONENTS"
  Unknown arguments specified
Call Stack (most recent call first):
  /usr/share/cmake-3.5/Modules/FindBoost.cmake:245 (find_package)
  geometry2/tf2_msgs/CMakeLists.txt:5 (find_package)`

1、这个错误的主要原因是:CMakeLists.txt里cmake_minimum_required指定的cmake版本过低造成的

2、解决办法是:把cmake_minimum_required修改成当前系统安装的cmake版本号就可以了

问题三

`CMake Error at geometry2/tf2/CMakeLists.txt:4 (find_package):
  By not providing "Findconsole_bridge.cmake" in CMAKE_MODULE_PATH this
  project has asked CMake to find a package configuration file provided by
  "console_bridge", but CMake did not find one.

  Could not find a package configuration file provided by "console_bridge"
  with any of the following names:
console_bridgeConfig.cmake
console_bridge-config.cmake`

解决办法:

安装console_bridge,命令如下:

git clone https://github.com/ros/console_bridge
mkdir build
cd build
cmake ..
sudo make install
修改CMakeLists.txt文件
删除第四行:find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs),添加语句:

set(console_bridge_DIR /home/ouc/install/console_bridge)

1
后面是你安装的console_bridge所在路径。
————————————————
版权声明:本文为CSDN博主「いしょ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40224537/article/details/107184509

问题四

  `C`Make Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):`
    `Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)`
  `(Required is at least version "2")`
`Call Stack (most recent call first):`
  `/usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)`
  `/usr/share/cmake-3.5/Modules/FindPythonLibs.cmake:265 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)`
  geometry2/tf2_py/CMakeLists.txt:13 (find_package)`

看内容 改一下python版本为3就好

在终端输入

export ROS_PYTHON_VERSION=3

你可能感兴趣的:(毕业设计三维点云,自动驾驶,python,人工智能)