近期做的项目中需要用到ros进行通信,一是坐标传输,二是视频传输。同时需要在两台终端上实现通信,接下来对我碰到的问题做下记录,希望能帮助到有需要的开发者。
一、两台终端实现ROS通信
第一步需要在两台终端(我的两台都是ubuntu 18.04)上都安装好ros,安装的步骤我就不细讲了,可以按照下面的两篇参考连接,基本就能装好。
ROS安装参考链接一
ROS安装参考链接二
在安装的时候需要注意的是一定要确定当前ubuntu的版本,不同的版本安装ROS的时候命令有差异。
不知道自己当前ubuntu版本的,可以在终端输入:lsb_release -a
Distributor ID: Ubuntu 类别是Ubuntu
Description:Ubuntu 20.04.3 LTS LTS是Long Term Support:长时间支持版本,支持周期长达三年至五年
Release 20.04 发行日期或者发行版本号
Codename: focal ubuntu的代号名称
具体Ubuntu版本和ROS版本对应如下,如果你的ubuntu是20.04的话,那恭喜你,后面cv_bridge的问题应该与你无缘,如果像我一样是18.04的冤种,那感谢你拜读我后续的内容!
如果想深入了解一下ROS通信的原理,可以拜读一下以下文章:
参考一
参考二
接下来就是怎么实现ROS下两台计算机话题交互了。
首先确定两台终端的ip,分别输入:ifconfig
查看。
随后确定主机和从机,例如我现在从A机获得摄像头视频流,需要通过ROS通信协议发送给B机,那么可以将A机设置为主机,B机设置为从机。
在终端输入:sudo gedit ~/.bashrc
,在最下面插入以下命令。注意注意!主从机有差异,上面两行export ROS_IP=***.***.*.*** export ROS_HOSTNAME=***.***.*.***
是当前设备的IP,最下面一行是你设定的主机IPexport ROS_MASTER_URI=http://**.***.*.***
:11311`,例如我将A机设为主机,那么要插入:
export ROS_IP=192.168.1.102
export ROS_HOSTNAME=192.168.1.102
export ROS_MASTER_URI=http://192.168.1.102:11311
B机从机要插入如下内容。
export ROS_IP=192.168.1.103
export ROS_HOSTNAME=192.168.1.103
export ROS_MASTER_URI=http://192.168.1.102:11311
接下来可以测试一下:
在主机终端输入,启动ros:
roscore
再新开一个终端输入:
rosrun turtlesim turtlesim_node
同时在从机开终端,并输入:
rosrun turtlesim turtle_teleop_key
如果在从机的终端上可以操作小乌龟那么就代表两台机器之间的通信设置好了。
二、解决python3 无法调用cv_bridge的问题
ros 与opencv之间进行数据转换就要借助cv_bridge,但是在Ubuntu18.04的melodic中默认使用python2,因此python3使用rospy导入cv_bridge时会报错,不过在Ubuntu20.04的版本中听说已经适配了python3,应该不会出现这个问题(没去验证,hhh)。
from cv_bridge.boost.cv_bridge_boost import getCvType
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
二、如何解决报错问题?
我们需要重新编译一个适用于Python3的cv_bridge包,具体可参考以下几篇博文,我接下来将自己的操作过程进行记录。
参考一
参考二
参考三
1、首先安装好所有需要的依赖包
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-melodic-cv-bridge
2、创建工作空间
mkdir -p cv_bridge_ws/src
cd cv_bridge_ws
3、设置catkin编译使用的python3版本
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so
注意!!!这里的路径一定不能错,假如你的是arrch的Ubuntu系统,写这个路径肯定就编译会报错。不知道话可以使用下面命令查看,一定要核对好路径:
sudo find / -name "*python3*"
4、设定编译包后放入install文件夹中
catkin config --install
5、下载源码到工作空间目录
git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
在这里要补充一下,如果你的是opencv4 那大概率编译的时候又会报错,下载完成之后需要换源,可执行以下命令:
# 查看分支
git branch -a
# 换源
git checkout noetic
还需要更改CMakeLists.txt中的以下内容:
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python37)
else()
# Ubuntu Focal
find_package(Boost REQUIRED python)
endif()
else()
改为
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python3)
else()
# Ubuntu Focal
find_package(Boost REQUIRED python)
endif()
else()
不知道怎么查的可以输入命令:
pkg-config --modversion opencv
# 或者
pkg-config --modversion opencv3
# 或者
pkg-config --modversion opencv4
6、查询版本信息
apt-cache show ros-melodic-cv-bridge | grep Version
这个是我的,注意要以你的版本号为准!!!
Version: 1.13.1-1bionic.20221025.193650
7、上面的东西派上用场了
cd src/vision_opencv/
git checkout 1.13.1
8、编译
catkin build
或者
catkin build cv_bridge
等待编译完成即可。
!!!提示:上述操作的过程中会提示没有某些文件夹,可以手动在cv_bridge_ws/下新建一下,比如install、build、devel、logs几个文件夹。
三、如何使用编译好的包?
1、线cd到你要运行的代码所在目录
2、先source一下你的ros工作目录下的devel/setup.bash,例如我的
source ~/ros_project/devel/setup.bash
3、然后source一下刚刚新编译好的cv_bridge_里面的setup.bash
source ~/cv_bridge_ws/install/setup.bash --extend
4、使用python3 测试一下,输入:from cv_bridge.boost.cv_bridge_boost import getCvType
,没有报错就证明可以正常使用了。
(base) rczs@tegra-ubuntu:~$ cd cv_bridge_ws/
(base) rczs@tegra-ubuntu:~/cv_bridge_ws$ source ./install/setup.bash --extend
(base) rczs@tegra-ubuntu:~/cv_bridge_ws$ python3
Python 3.10.9 (main, Mar 1 2023, 18:16:50) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from cv_bridge.boost.cv_bridge_boost import getCvType
>>>
补充几点报错及解决方法:
1、工作空间初始化路径错误 WARNING: Source space /home/xxx/src
does not yet exist
直接终端运行:
rm -rf ~/.catkin_tools
2、pyqt5调用ros话题通信报线程错误
QObject::moveToThread: Current thread (0x27ebf00) is not the object's thread (0x2d9e660).
Cannot move to target thread (0x27ebf00)
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/ict/anaconda3/envs/pyqt/lib/python3.9/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl.
有说要重装python-opencv 的,有说要降版本的,操作了个遍也没解决根本问题,后来在脚本中加了两句代码,就可以运行了,非常之神奇。
envpath = '/data/xx/xx/venv/lib/python3.6/site-packages/cv2/qt/plugins/platforms'
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = envpath