本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于Azure Percept 避障乐高汽车

发布时间:2022-01-09
分享到:

基于Azure Percept 避障乐高汽车

发布时间:2022-01-09
分享到:

本项目使用 LEGO Boost 汽车避障,由 Azure Percept 提供支持。

硬件组件

  • 微软 Azure ×    1    
  • LEGO BOOST 创意工具箱×    1    

软件应用程序和在线服务

  • 微软 Azure

项目背景

Azure Percept 是一个硬件和服务平台,可简化 Azure AI 技术在边缘的使用。我决定在周末尝试建造简单的避障车,我对结果很满意,所以这里有一个关于它的故事。

汽车底座采用 LEGO Boost 建造,它是经过轻微修改的 MTR 4 模型,该模型的说明包含在标准的 LEGO Boost 包装中。

在此基础之上,我将 Azure Percept 与摄像头 Azure Percept Vision 放置在一起。由于 Azure Percept 的输入电压为 40V,我没有尝试制造一些可以为汽车供电的电池,如果您决定这样做,您可能需要进一步扩展汽车底座。

训练模型
Azure Percept 与 Azure 服务(例如认知服务、机器学习、实时视频分析)开箱即用。LEGO Boost 包中有 3 个锥体,所以我拍摄了 100 张锥体的照片并使用 Azure 自定义视觉训练模型。

训练中使用的所有图片都可以在GitHub 存储库中找到,如果您需要经过训练的模型,请随时下载它们。

训练模型后,您可以通过 Azure 门户中的 Azure Percept Studio 服务轻松将其部署到 Azure Percept 设备。

您还可以立即从设备查看实时提要并测试模型的工作方式。如果需要,您可以通过界面拍摄更多照片并重新训练模型以获得更高的准确度。

获取数据
在 Azure Percept 上运行模型时,它会进行检测并将数据发送到云。您可以通过不同的方式访问数据,对于这个项目,我使用了 NodeJS,并且 Microsoft 已经为此准备了很棒的快速入门示例:“将遥测数据从设备发送到 IoT 中心并使用后端应用程序读取它”。

示例将需要有关 IoT 中心的端点和密钥的一些值,您可以通过 Azure 门户界面或使用 Azure CLI 和以下命令获取这些值:

az iot hub show --query properties.eventHubEndpoints.events.endpoint --name {YourIoTHubName}

az iot hub show --query properties.eventHubEndpoints.events.path --name {YourIoTHubName}

az iot hub policy show --name service --query primaryKey --hub-name {YourIoTHubName}

您可以在代码中输入值并使用 node 运行它,您将看到来自设备的消息快速出现:

Telemetry received:
[{"width":"102","height":"91","position_x":"363","position_y":"214","label":"cone","confidence":"0.514648","timestamp":"1619706241105940526"}]

节点后端
我决定以某种方式升级节点示例,使其能够在本地主机上提供数据,并且我安装了express

npm install express

修改后的代码引入了一个简单的字符串变量 coneVisible,它会跟踪检测到的锥体是否具有高于 50% 的准确度。

var coneVisible = "no";

var printMessages = function (messages) {
    coneVisible = "no";
    for (const message of messages) {
        console.log(JSON.stringify(message.body));
        if (message.body.length > 0) {
            for (detection of message.body) {
                if (detection.label == "cone" && detection.confidence > 0.40) {
                    coneVisible = "yes";
                }
            }
        }
    }
};

使用 express 这个变量在本地主机上的 3333 上可用。您也可以使用其他端口,但请记住 3000 用于前端应用程序。

const app = express();

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    next();
});

app.get("/", function(req, res) {
    res.send(coneVisible);
});

let port = process.env.PORT;
if(port == null || port == "") {
    port = 3333;
}

app.listen(port, function() {
    console.log("Success");
});

如果您想进一步扩展它,您可以使用 JSON 代替字符串变量。

前端应用
乐高积木很棒,但是如果您曾经尝试“破解”某些乐高积木,您可能知道这几乎是一场噩梦。非常感谢那些花费时间和精力创建不同图书馆以使与乐高智能积木更容易交流的人们。

“浏览器中的 LEGO Boost ”是一个很棒的 React 应用程序,用于通过 Web 蓝牙 API 从浏览器控制 LEGO Boost。有了它,您可以轻松连接到 LEGO Boost,该应用程序为您提供了一个漂亮的界面,您不仅可以在其中控制电机和其他传感器,还可以编写不同的命令并围绕它编写编程逻辑。

当您运行应用程序并连接到 LEGO Boost 时,您可以在“代码编辑器”中编写代码。以下示例向您展示了如何向 localhost 上的后端发出 HTTP 请求,并根据响应将增强灯变为红色或绿色。

var request = new XMLHttpRequest();

request.open('GET', 'http://localhost:3333', false);
request.send()

var data = request.response;

if (request.status >= 200 && request.status < 400) {
    if (data === 'yes') {
        boost.led('red');
    } else {
        boost.led('green');
    }
}

以同样的方式,您可以将 LEGO Boost 旋转一定度数,而不是打开浅红色,或者如果结果为“否”,则您可以将其向前驱动,这意味着在途中没有检测到锥体。

视频演示

我准备了一个简短的演示视频来向您展示它是如何工作的。您可以看到汽车向前移动,直到它检测到锥体,还有一个带有物体检测和 LEGO Boost 灯的小测试。

项目很有趣,我真的很喜欢把它们放在一起。Azure Percept 是一款很棒的设备,而且非常易于使用。

对了,为什么我称它为 Perceptmobile?因为蝙蝠车很老派,我的朋友乐高蝙蝠侠说他宁愿开这辆车。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论