我们如何使用IoT和计算机视觉为远程工作人员构建替代机器人(二)

在商量如何解决此问题时时,我们想到了WebRTC,它可以满足我们的要求。

WebRTC适用于网真、对讲及VoIP软件,因为它具有非常强大的标准和现代协议,功能种类众多并可与Firefox、Chrome、Opera等各种浏览器兼容。

WebRTC在UV4L流媒体服务器中的扩展允许用户按照WebRTC协议的定义,实时从音频、视频和数据源中传输多媒体内容流。

具体来说,我们使用了UV4L中包含的WebRTC扩展。该工具使我们能够在机器人与远程工作人员的计算机之间以极低的延迟创建双向通信。

只要我们启用含WebRTC扩展的UV4L服务器,我们就能从RaspberryPi找到一个web app。然后我们只需用远程工作人员的浏览器访问app即可建立实时的双向通信。多简单!

这使我们能够设置一个从PiCamera到浏览器的视频单向通道;一个音频双向通道;以及一个额外的单向通道来从浏览器向机器人发送指令。

建立UI来管理通讯

为了方便远程工作人员查看数据并发送命令,我们对如何将这些功能集成到可访问且实用的前端中进行了一定研究。

受来自UV4L项目的Web app的启发,我们将上述数据通道集成到一个功能齐全的基础前端中。它包括以下组件:

  • html:HTML5页面,包含用于显示传入流的UI内容(主要是视频)和用于显示姿势估计关键点的canvas。
  • js:定义由用户操作(例如“开始传输”、“ 载入元件列表”、“切换姿势估计”等)触发的回调。
  • js:通过WebSocket运行WebRTC信令协议

这是我们在hackathon期间拍摄的短视频

以下是控制器类的代码片段:

class MotorsWheels:

    def __init__(
            self, r_wheel_forward=6, r_wheel_backward=13, l_wheel_forward=19, l_wheel_backward=26):
                self.r_wheel_forward = r_wheel_forward
                ...
                GPIO.setmode(GPIO.BCM)
        GPIO.setup(r_wheel_forward, GPIO.OUT)
                GPIO.setup(r_wheel_backward, GPIO.OUT)
                ...
                # Turn all motors off
        GPIO.output(r_wheel_forward, GPIO.LOW)
        GPIO.output(r_wheel_backward, GPIO.LOW)

    def _spin_right_wheel_forward(self):
        GPIO.output(self.r_wheel_forward, GPIO.HIGH)
        GPIO.output(self.r_wheel_backward, GPIO.LOW)

    def _stop_right_wheel(self):
        GPIO.output(self.r_wheel_backward, GPIO.LOW)
        GPIO.output(self.r_wheel_forward, GPIO.LOW)

    def go_fw(self):
        self._spin_left_wheel_forward()
        self._spin_right_wheel_forward()

class ServoCamera:
    CENTER = 40000
    UP_LIMIT = 80000
    DOWN_LIMIT = 30000
    STEP = 5000

    def __init__(self, servo=18, freq=50):
        self.servo = servo
        self.freq = freq
        self.pi = pigpio.pi()

        self.angle = self.CENTER
        self._set_angle()

    def _set_angle(self):
        self.pi.hardware_PWM(self.servo, self.freq, self.angle)

    def up(self):
        if self.angle + self.STEP < self.UP_LIMIT:
            self.angle += self.STEP
            self._set_angle()

    def down(self):
        if self.angle - self.STEP > self.DOWN_LIMIT:
            self.angle -= self.STEP
            self._set_angle()

运行上述代码,我们就能控制机器人“步行”走过办公室。而相对应的远程工作人员可以通过机器人(的摄像头)看到自己的团队并靠近他们。

但是对于我们这群充满干劲的年轻人来说,这样还不够。我们继续进行研究,想要达成我们的终极目标——拥有一个全自动机器人。

原文地址:https://tryolabs.com/blog/hackathon-robot-remote-work-iot-computer-vision/

文章作者:Lucas

填写常用邮箱,接收社区更新

WebRTC 中文社区由

运营