You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drake(pydrake)控制环中获取图像实现视觉伺服?

问题

我希望使用pydrake搭建视觉伺服仿真场景,但尚未明确如何为自定义LeafSystem的端口接线,以在控制环中读取相机图像。当前我的关节位置控制器结构如下:

class MyController(LeafSystem):

    def __init__(self, n_joints=7):
        super().__init__()

        self.position_cmd_port = self.DeclareVectorOutputPort(
            "my_command",
            BasicVector(2 * n_joints),
            self._get_position_command
        )

    def _get_position_command(self, context, command_vec):        
        # TODO I need to get an RGB image here from my camera
        rgb_img = None

        command = command_vec.get_mutable_value()
        # TODO Do the image processing and control command computation
        # needed here to populate joint position (and/or velocity) command 

我注意到pydrake.systems.sensors.ImageWriter类拥有DeclareImageInputPort方法,且该类继承自LeafSystem,因此考虑让控制器继承ImageWriter类:

class MyController(ImageWriter):
   ...

再通过DeclareImageInputPort接入相机图像,从而在_get_position_command函数中获取图像。但从概念上看,让控制器继承ImageWriter并不合理,请问是否有更优的方法在控制环中获取图像?此外,是否有Drake中实现视觉伺服的示例可供参考?


解决方案

1. 直接在自定义LeafSystem中声明图像输入端口

完全不需要继承ImageWriter,你可以直接在自己的MyController类里通过DeclareAbstractInputPort声明图像输入端口——因为Drake中的图像属于抽象值类型(AbstractValue)。

修改后的控制器代码示例:

from pydrake.systems.sensors import ImageRgba8U  # 根据实际使用的图像类型选择,比如ImageRgb8U、ImageDepth32F等

class MyController(LeafSystem):

    def __init__(self, n_joints=7):
        super().__init__()
        # 声明图像输入端口,指定对应图像类型
        self.image_input_port = self.DeclareAbstractInputPort(
            name="camera_image",
            model_value=ImageRgba8U()  # 用默认尺寸图像作为模型,实际会由相机输出覆盖
        )

        self.position_cmd_port = self.DeclareVectorOutputPort(
            "my_command",
            BasicVector(2 * n_joints),
            self._get_position_command
        )

    def _get_position_command(self, context, command_vec):        
        # 从输入端口读取图像
        rgb_img = self.image_input_port.Eval(context)

        # 可直接获取图像数据进行处理:
        # img_data = rgb_img.data  # 对应numpy数组格式
        # height = rgb_img.height()
        # width = rgb_img.width()

        command = command_vec.get_mutable_value()
        # 在这里完成图像处理与控制指令计算逻辑

后续搭建仿真系统时,只需用builder.Connect()将相机的图像输出端口与控制器的camera_image输入端口连接即可。

2. Drake中的视觉伺服参考示例

Drake的官方模块与示例中有不少可参考的视觉伺服实现:

  • Manipulation Station框架:该框架集成了机器人、相机与控制器逻辑,可参考其中如何将相机数据接入控制环的流程。
  • Pick-and-Place示例:examples/manipulation/pick_and_place目录下的代码展示了视觉识别目标+伺服抓取的完整流程,包含视觉数据读取与处理环节。
  • 官方视觉伺服教程:Drake内置教程中有专门的视觉伺服章节,覆盖从相机数据获取到控制律设计的全流程实现。

内容的提问来源于stack exchange,提问作者adamconkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:57:34