ros如何编译python文件_ros使用python3编译cv_bridge、tf等packages

https://stackoverflow.com/questions/49221565/unable-to-use-cv-bridge-with-ros-kinetic-and-python3

https://community.bwbot.org/topic/499/%E5%9C%A8ros%E4%B8%AD%E4%BD%BF%E7%94%A8python3/2

理解不到位的地方还请多多指正

在使用kitti2bag时候,会出现各种问题,下面简单列举

先看一下kitti2bag的文件内容

#!/home/s/anaconda3/envs/py3.7/bin/python3.7

# -*- coding: utf-8 -*-

import sys

try:

import pykitti

print('-----')

except ImportError as e:

print('Could not load module \'pykitti\'. Please run `pip install pykitti`')

sys.exit(1)

# clear py2.7

# sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

# print(sys.path)

# sys.path.append('/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages')

# sys.path.remove('/home/s/ros_study/devel/lib/python2.7/dist-packages')

# print(sys.path)

# sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')

# print(sys.path)

import tf

import os

import cv2

import rospy

import rosbag

import progressbar

from tf2_msgs.msg import TFMessage

from datetime import datetime

from std_msgs.msg import Header

from sensor_msgs.msg import CameraInfo, Imu, PointField, NavSatFix

import sensor_msgs.point_cloud2 as pcl2

from geometry_msgs.msg import TransformStamped, TwistStamped, Transform

print(tf.__file__)

sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')

import cv_bridge

from cv_bridge import CvBridge

print(cv_bridge.__file__)

import numpy as np

import argparse

可以看到,其中需要tf、cv2、rospy、pykitti等packages。

这里面既有Python2的,也有python3的。

问题1

在开始运行命令

(py3.7) ➜ ~ kitti2bag -t 2011_09_26 -r 0001 raw_synced

时,会出现说pykitti找不到这个问题。

对于这个问题,可以开一个Ipython然后Import pykitti

这时可能会找到原因,我的原因是cv2的原因,然后我的解决方案是将环境中的python2的cv2改个名,

sudo mv cv2.so cv2_ros.so

然后在找cv2就找的是当前环境中的cv2了。

问题2

tf的问题,这个问题经查找是由于在python3中无法使用tf

File "/home/s/test/src/py3_cv_bridge/scripts/bev_image.py", line 13, in

import tf

File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf/__init__.py", line 28, in

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

from tf2_py import *

File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_py/__init__.py", line 38, in

from ._tf2 import *

ImportError: dynamic module does not define module export function (PyInit__tf2)

这个问题的原因比较复杂,主要是由于路径引起的。

在python中使用tf的tf只能是python3编译的,所以为了解决这个问题我们需要使用python3编译tf

参考:在ROS中使用Python3

编译完成后,需要将该目录source在.zsh中。

在我们想要使用tf的py文件中,在sys.path需要将python3编译的tf的功能包放在ros自带的packages前面,如下所示,

新建一个ipython

(py3.7) ➜ test ipython

Python 3.7.6 | packaged by conda-forge | (default, Mar 23 2020, 23:03:20)

Type 'copyright', 'credits' or 'license' for more information

IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import sys

In [2]: sys.apth

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

in

----> 1 sys.apth

AttributeError: module 'sys' has no attribute 'apth'

In [3]: sys.path

Out[3]:

['/home/s/anaconda3/envs/py3.7/bin',

'',

'/opt/ros/kinetic/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf_conversions/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_sensor_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_kdl/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_geometry_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_ros/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_py/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/image_geometry/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages',

'/home/s/anaconda3/envs/py3.7/lib/python37.zip',

'/home/s/anaconda3/envs/py3.7/lib/python3.7',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/lib-dynload',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages/IPython/extensions',

'/home/s/.ipython']

In [4]: sys.path.remove("/opt/ros/kinetic/lib/python2.7/dist-packages")\

...: sys.path.append("/opt/ros/kinetic/lib/python2.7/dist-packages")\

...: sys.path

File "", line 2

sys.path.append("/opt/ros/kinetic/lib/python2.7/dist-packages")\

^

SyntaxError: invalid syntax

In [5]: sys.path

Out[5]:

['/home/s/anaconda3/envs/py3.7/bin',

'',

'/opt/ros/kinetic/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf_conversions/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_sensor_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_kdl/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_geometry_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_ros/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_py/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/image_geometry/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages',

'/home/s/anaconda3/envs/py3.7/lib/python37.zip',

'/home/s/anaconda3/envs/py3.7/lib/python3.7',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/lib-dynload',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages/IPython/extensions',

'/home/s/.ipython']

In [6]: sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

In [7]: sys.path

Out[7]:

['/home/s/anaconda3/envs/py3.7/bin',

'',

'/home/s/py3_ws/devel_isolated/tf_conversions/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_sensor_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_kdl/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_geometry_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_ros/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_py/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/image_geometry/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages',

'/home/s/anaconda3/envs/py3.7/lib/python37.zip',

'/home/s/anaconda3/envs/py3.7/lib/python3.7',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/lib-dynload',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages/IPython/extensions',

'/home/s/.ipython']

In [8]: sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')

In [9]: sys.path

Out[9]:

['/home/s/anaconda3/envs/py3.7/bin',

'',

'/home/s/py3_ws/devel_isolated/tf_conversions/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_sensor_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_kdl/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_geometry_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_ros/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_py/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/image_geometry/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages',

'/home/s/anaconda3/envs/py3.7/lib/python37.zip',

'/home/s/anaconda3/envs/py3.7/lib/python3.7',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/lib-dynload',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages',

'/home/s/anaconda3/envs/py3.7/lib/python3.7/site-packages/IPython/extensions',

'/home/s/.ipython',

'/opt/ros/kinetic/lib/python2.7/dist-packages']

In [10]: import tf

In [11]: tf.__file__

Out[11]: '/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages/tf/__init__.py'

问题3

ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

python貌似是可以使用Python2的cv_bridge的,但是如果要想使用python3编译的cv_bridge的话,也是需要python2的packages的。如下所示

#### Python2的cv_bridge

(py3.7) ➜ test ipython

Python 3.7.6 | packaged by conda-forge | (default, Mar 23 2020, 23:03:20)

Type 'copyright', 'credits' or 'license' for more information

IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import cv_bridge

In [2]: cv_bridge.__file__

Out[2]: '/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/__init__.py'

In [3]: import sys

In [4]: sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

In [5]: import cv_bridge

In [6]: cv_bridge.__file__

Out[6]: '/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/__init__.py'

#### python3的cv_bridge

(py3.7) ➜ test ipython

Python 3.7.6 | packaged by conda-forge | (default, Mar 23 2020, 23:03:20)

Type 'copyright', 'credits' or 'license' for more information

IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import sys

In [2]: sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

In [3]: import cv_bridge

---------------------------------------------------------------------------

ModuleNotFoundError Traceback (most recent call last)

in

----> 1 import cv_bridge

~/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages/cv_bridge/__init__.py in

33 for __execfile in __execfiles:

34 with open(__execfile, 'r') as __fh:

---> 35 exec(__fh.read())

36 del __fh

37 del __execfile

~/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages/cv_bridge/__init__.py in

~/py3_ws/src/vision_opencv/cv_bridge/python/cv_bridge/core.py in

32 # POSSIBILITY OF SUCH DAMAGE.

33

---> 34 import sensor_msgs.msg

35 import sys

36

ModuleNotFoundError: No module named 'sensor_msgs'

In [4]: sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')

In [5]: import cv_bridge

In [6]: cv_bridge.__file__

Out[6]: '/home/s/py3_ws/src/vision_opencv/cv_bridge/python/cv_bridge/__init__.py'

(venv) ➜ py3_ws catkin_make_isolated -DPYTHON_EXECUTABLE:FILEPATH=/home/s/py3_ws/venv/bin/python3.5

结果

(venv) ➜ py3_ws source devel_isolated/setup.zsh

(venv) ➜ py3_ws echo $ROS_PACKAGE_PATH

/home/s/py3_ws/src/vision_opencv/vision_opencv:/home/s/py3_ws/src/geometry/tf_conversions:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_tools:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_sensor_msgs:/home/s/py3_ws/src/geometry2-noetic-devel/test_tf2:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_kdl:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_geometry_msgs:/home/s/py3_ws/src/geometry/tf:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_ros:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_py:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_eigen:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_bullet:/home/s/py3_ws/src/geometry2-noetic-devel/tf2:/home/s/py3_ws/src/geometry2-noetic-devel/tf2_msgs:/home/s/py3_ws/src/vision_opencv/opencv_tests:/home/s/py3_ws/src/geometry/kdl_conversions:/home/s/py3_ws/src/vision_opencv/image_geometry:/home/s/py3_ws/src/geometry2-noetic-devel/geometry2:/home/s/py3_ws/src/geometry/geometry:/home/s/py3_ws/src/geometry/eigen_conversions:/home/s/py3_ws/src/vision_opencv/cv_bridge:/opt/ros/kinetic/share

(venv) ➜ py3_ws ipython

Python 3.5.2 (default, Apr 16 2020, 17:47:17)

Type 'copyright', 'credits' or 'license' for more information

IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import tf

In [2]: tf.__file__

Out[2]: '/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages/tf/__init__.py'

In [3]: import sys

In [4]: sys.path

Out[4]:

['/home/s/py3_ws/src/geometry2-noetic-devel/tf2_py/src',

'/home/s/py3_ws/src/geometry2-noetic-devel/tf2_ros/src',

'/home/s/py3_ws/src/geometry/tf/src',

'/home/s/py3_ws/venv/bin',

'',

'/home/s/py3_ws/devel_isolated/tf_conversions/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_sensor_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_kdl/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_geometry_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_ros/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_py/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_msgs/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/image_geometry/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages',

'/home/s/py3_ws/devel_isolated/tf_conversions/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_sensor_msgs/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_kdl/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_geometry_msgs/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_ros/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_py/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/tf2_msgs/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/image_geometry/lib/python2.7/dist-packages',

'/home/s/py3_ws/devel_isolated/cv_bridge/lib/python2.7/dist-packages',

'/opt/ros/kinetic/lib/python2.7/dist-packages',

'/usr/lib/python35.zip',

'/usr/lib/python3.5',

'/usr/lib/python3.5/plat-x86_64-linux-gnu',

'/usr/lib/python3.5/lib-dynload',

'/home/s/py3_ws/venv/lib/python3.5/site-packages',

'/home/s/py3_ws/venv/lib/python3.5/site-packages/IPython/extensions',

'/home/s/.ipython']

In [5]: import cv_bridge

In [6]: cv_bridge.__file__

Out[6]: '/home/s/py3_ws/devel_isolated/cv_bridge/lib/python3/dist-packages/cv_bridge/__init__.py'

In [7]:

Do you really want to exit ([y]/n)? n

In [7]: from cv_bridge.boost.cv_bridge_boost import getCvType

In [8]:

总结

python3使用的tf必须是python3自己编译的,其余的packages貌似是可以使用Python2的。

在Python3环境中使用packages要时刻注意sys.path中的先后顺序,导入时会自动从前面向后查找。所以,对于python3的tf,要将其路径放在ros自带的路径之前

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ros_arduino_bridge 是一个 ROS 软件包,它可以将 Arduino 板与 ROS 系统进行通信。下面是关于 ros_arduino_bridge 的安装和使用步骤: 安装: 1. 首先,在你的系统上安装 Arduino IDE。你可以从 Arduino 官方网站下载并安装适合你操作系统的版本。 2. 确保你的系统上已经正确安装了 ROS. 如果没有,请按照 ROS 官方网站的说明进行安装。 3. 在 ROS 中创建一个工作空间,可以使用以下命令: ``` mkdir -p ~/ros_arduino_bridge_ws/src cd ~/ros_arduino_bridge_ws/src catkin_init_workspace ``` 4. 将 ros_arduino_bridge 软件包克隆到你的工作空间中的 src 目录下: ``` git clone https://github.com/hbrobotics/ros_arduino_bridge.git ``` 5. 使用以下命令编译并安装软件包: ``` cd ~/ros_arduino_bridge_ws catkin_make source devel/setup.bash ``` 使用: 1. 首先,打开 Arduino IDE,并将你的 Arduino 板连接到电脑上。 2. 使用 Arduino IDE 打开 ros_arduino_bridge 软件包中的 Arduino 代码文件。代码文件位于 ros_arduino_firmware 文件夹中。 3. 在 Arduino IDE 中按下上传按钮将代码上传到你的 Arduino 板上。 4. 在终端中,使用以下命令启动 ros_arduino_bridge: ``` roslaunch ros_arduino_bridge arduino.launch ``` 5. 现在,你可以通过发布 ROS 消息来与 Arduino 板进行通信。例如,可以使用 rostopic 命令发布消息。可以通过查看软件包文档了解更多关于 ROS 消息和话题的信息。 以上就是关于安装和使用 ros_arduino_bridge 的简要步骤。通过这个软件包,你可以在 ROS 系统中与 Arduino 板进行通信并控制各种传感器和执行器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值