如何在Ubuntu上使用Python ROS从Intel Realsense摄像头获取深度信息。
有关如何设置ROS和Intel Realsense摄像机的信息,请参阅上一篇文章。
直到可以在Ubuntu(带或不带ROS)上使用Intel Realsense D415
这次,我们将使用ROS Python从Realsense相机获取RGB图像信息和深度信息。
我使用了Jupyter ROS,它可以从Jupyter笔记本操作ROS,但是我会写它,因为有些地方会卡住。
下次,我将尝试一种不使用Jupyter的方法。
目录
1.设置
2.关于ROS发布者,订阅者,主题
3.用Python
编写订阅服务器
环境
Ubuntu 18.04
ROS旋律
Python 3.6(Anaconda)
实感D415
1.设定
1.1 rospy
使用rospy能够处理Python中的ROS。
用pip安装。
安装后运行以下代码时,出现错误消息。错误消息似乎有多种原因,但是就我而言,我可以通过使用
1 | import rospy |
1.2 jupyter-ros设置
这次,我尝试使用jupyter操作ROS的方法来立即检查ROS的结果。 jupyter的操作不是标准的,并且由于正在开发中,因此操作不稳定。
https://github.com/RoboStack/jupyter-ros
安装方法在github上。
https://github.com/RoboStack/jupyter-ros#installation-and-dependencies
2.关于ROS发布者,订阅者,主题
ROS作为主题交换数据。创建和发送主题的节点称为发布者,接收主题的节点称为订阅者。
这次,realsense发布了图像的主题,而在Python中定义的节点订阅了该主题。
realsense发射
首先,启动realsense节点。
在终端
检查主题
接下来,检查从realsense发布了哪些主题。为此使用rostopic命令。
在另一个终端
您也可以使用relasense-ros检查零件
https://github.com/IntelRealSense/realsense-ros#usage-instructions
每个主题都有一个固定的类型,在以后订阅该主题时,请在需要指定类型之前对其进行检查。
为此使用
例如,要检查/ camera / color / image_raw / compressed的类型,请执行以下操作。
您可以看到它的类型为
sensor_msgs / CompressedImage。
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tr>
tbody>
table>
3.用Python编写订阅服务器
这次,我将描述如何在Juypter中编写订户。我偶然发现了一些东西,因此下次我将尝试一种不使用Jupyter的方法。
ROS Python教程很有帮助,因为它描述了如何避免使用Jupyter。
http://wiki.ros.org/ja/ROS/Tutorials/WritingPublisherSubscriber(python)
导入rospy和jupyros
1 2 | import rospy as rp import jupyros as jr |
导入主题类型
1 2 | from sensor_msgs.msg import CompressedImage, Image from std_msgs.msg import String |
启动节点
1 | rp.init_node('test') |
订阅者准备
定义一个回调函数(一个处理收到的输入的函数)
将接收到的数据转换为numpy数组
根据应用程序
,可以从此处进行进一步处理
1 2 3 | def call_back(ros_data): np_arr = np.fromstring(ros_data.data, np.uint8) print(np_arr) |
订阅
1 | jr.subscribe('camera/depth/image_rect_raw/compressed',CompressedImage,call_back) |
如果通过此命令打印numpy数组,则成功。
jupyter ros的错误修复
但是,就我而言,出现以下错误。
显然jupyros pubsub.py的第25行是错误的。
也许是字典中的关键问题?

由于反复试验的结果,我如下直接编辑了包的第24-25行,并且效果很好。
我认为这不是一个基本的解决方案,但目前它运行良好。
1 2 3 | if thread_name != 'MainThread': # output_registry[threading.currentThread().getName()].append_stdout(msg) self.original.write(msg) |
尽管它与主要主题有所不同,但是在可以通过pip安装的版本中,第49-50行如下,但是
1 2 | if subscriber_registry.get(topic): raise Error("Already registerd...") |
正确如下。它已在github上修复。
1 2 | if subscriber_registry.get(topic): raise RuntimeError("Already registerd...") |
在我的情况下,这使得有可能从realsense中获得祝贺的图像和深度数据。
下次
这次我很难受,因为我尝试使用Jupyter处理ROS。下次,我将尝试不使用Jupyter来接收数据。