Dora-rs 机器人框架学习教程(1)—— Dora-rs安装

1、dora简介

Dora-rs[1] 是一个基于 Rust 实现的化机器人框架,其具有极高的实时性能。Dora-rs使用Rust语言做数据流的传输和调度管理,可以大大减少了数据的重复拷贝和传输。它提供了Rust语言和Python语言之间的无缝集成,减少了跨语言的性能代价。Dora-rs通过YAML脚本配置节点、节点之间的数据流。

多语言支持:Dora 目前提供 Rust 、Cpp 、Python三种语言。

性能:Dora-rs 性能是ROS2 Python API 的 17 倍!是 ROS2 Rust API 的 10 倍!与 ROS2 C/Cpp API 共享内存快 0.06 ms。(图片来源于github[1]) (对Python有很强的优化能力,对C++性能提升不大)

请添加图片描述

2、dora安装

dora_安装文档(官方提供三种安装方法,推荐使用二进制安装):https://dora.carsmos.ai/docs/guides/Installation/installing/

注意python版本 必须要3.11.0

我使用的环境是ubuntu20.04 + conda, 推荐安装conda然后再安装python https://blog.csdn.net/wyf2017/article/details/118676765

2.1 二进制安装

创建一个install_dora.sh文件,填入以下内容

export DORA_VERSION=v0.3.0 # Check for the latest release
export ARCHITECTURE=$(uname -m)
wget https://github.com/dora-rs/dora/releases/download/${DORA_VERSION}/dora-${DORA_VERSION}-${ARCHITECTURE}-Linux.zip
unzip dora-${DORA_VERSION}-${ARCHITECTURE}-Linux.zip
pip install dora-rs==${DORA_VERSION} ## For Python API
PATH=$PATH:$(pwd)
dora --help

在终端中运行

sudo ./install_dora.sh

若新建一个终端无法识别dora命令 则把 PATH=$PATH:$(pwd) 加入到 .bashrc中最后一行

如果提示以下错误

请添加图片描述
更新一下rustc的版本

apt autoremove rustc
apt install rustc 

或者 通过以下命令更新rustc版本

sudo apt autoremove rustc
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
export PATH=~/.cargo/bin:$PATH
sudo apt  install cargo

3、运行测试程序

与官方给出的demo程序相同,我们先试用python创建程序验证程序dora-rs是否安装完整

3.1 first project

在终端中输入以下命令,创建dora工程(工程名为abc_project )

dora new abc_project --lang python
cd abc_project

打开该文件夹,这个工程下面创建一个yaml文件、一个节点文件夹,两个操作符(dora中称作operator,有点类似于功能节点、算子的概念), 该工程目录结构如下

├── dataflow.yml
├── node_1
│   └── node_1.py
├── op_1
│   └── op_1.py
└── op_2
    └── op_2.py

3.2 编写节点

1、其中dataflow.yml 文件的内容为:

nodes:
  - id: op_1
    operator:
      python: op_1/op_1.py
      inputs:
        tick: dora/timer/millis/100
      outputs:
        - some-output
  - id: op_2
    operator:
      python: op_2/op_2.py
      inputs:
        tick: dora/timer/secs/2
      outputs:
        - some-output

  - id: custom-node_1
    custom:
      source: python3
      args: ./node_1/node_1.py
      inputs:
        tick: dora/timer/secs/1
        input-1: op_1/some-output
        input-2: op_2/some-output

2、node_1.py 文件的内容为:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from dora import Node

node = Node()

event = node.next()
if event["type"] == "INPUT":
    print(
        f"""Node received:
    id: {event["id"]},
    value: {event["value"]},
    metadata: {event["metadata"]}"""
    )

3、op_1.py 文件的内容为:

from typing import Callable, Optional

from dora import DoraStatus


class Operator:
    """
    Template docstring
    """

    def __init__(self):
        """Called on initialisation"""
        pass

    def on_event(
        self,
        dora_event: dict,
        send_output: Callable[[str, bytes, Optional[dict]], None],
    ) -> DoraStatus:
        if dora_event["type"] == "INPUT":
            return self.on_input(dora_event, send_output)
        return DoraStatus.CONTINUE

    def on_input(
        self,
        dora_input: dict,
        send_output: Callable[[str, bytes, Optional[dict]], None],
    ):
        """

        Args:
            dora_input (dict): Input dict containing an `id`, `data` and `metadata`.
            send_output Callable[[str, bytes | pa.Array, Optional[dict]], None]:
                Function for sending output to the dataflow:
                - First argument is the `output_id`
                - Second argument is the data as either bytes or `pa.Array`
                - Third argument is dora metadata dict
                e.g.: `send_output("bbox", pa.array([100], type=pa.uint8()), dora_event["metadata"])`

        Returns:
            DoraStatus:
                CONTINUE means that the operator will
                    keep listening for further inputs.
                STOP means that the operator stop listening for inputs.

        """
        print(f"Received input {dora_input['id']}, with data: {dora_input['value']}")

        return DoraStatus.CONTINUE

    def __del__(self):
        """Called before being deleted"""
        pass

4、op_2.py 文件的内容为:

from typing import Callable, Optional

from dora import DoraStatus


class Operator:
    """
    Template docstring
    """

    def __init__(self):
        """Called on initialisation"""
        pass

    def on_event(
        self,
        dora_event: dict,
        send_output: Callable[[str, bytes, Optional[dict]], None],
    ) -> DoraStatus:
        if dora_event["type"] == "INPUT":
            return self.on_input(dora_event, send_output)
        return DoraStatus.CONTINUE

    def on_input(
        self,
        dora_input: dict,
        send_output: Callable[[str, bytes, Optional[dict]], None],
    ):
        """

        Args:
            dora_input (dict): Input dict containing an `id`, `data` and `metadata`.
            send_output Callable[[str, bytes | pa.Array, Optional[dict]], None]:
                Function for sending output to the dataflow:
                - First argument is the `output_id`
                - Second argument is the data as either bytes or `pa.Array`
                - Third argument is dora metadata dict
                e.g.: `send_output("bbox", pa.array([100], type=pa.uint8()), dora_event["metadata"])`

        Returns:
            DoraStatus:
                CONTINUE means that the operator will
                    keep listening for further inputs.
                STOP means that the operator stop listening for inputs.

        """
        print(f"Received input {dora_input['id']}, with data: {dora_input['value']}")

        return DoraStatus.CONTINUE

    def __del__(self):
        """Called before being deleted"""
        pass

3.3 启动程序

1、启动数据流

dora start dataflow.yml --name first-dataflow

开启程序以后在终端会输出一个类似于 “6a9279a7-e048-4e28-9616-cb3ae0adb774” 的一长串数字,这是数据流ID
参数 --name 后面的名称是我们自定义的节点名称,后续查看日志文件等操作,可以利用该自定义的名称替换数据流ID

2、结束该数据流

dora stop --name first-dataflow

3.4 查看节点输出

dora 可以通过log文件 查看节点输出(这一点不方便)

dora logs first-dataflow op_1
dora logs first-dataflow op_2
dora logs first-dataflow custom-node_1

其中 first-dataflow 是该程序的名称,也就是我们再启动命令时候 "- -name"后面跟的参数; custom-node_1 是yaml文件中一个节点的名称,

参考资料

[1] https://github.com/dora-rs/dora
[2] https://dora.carsmos.ai/docs/guides/Installation/installing

dora-rs目前资料较少 欢迎大家点赞在评论区交流讨论(cenruping@vip.qq.com) O(∩_∩)O
或者加群水一波(1149897304)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288241.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++上位软件通过LibModbus开源库和西门子S7-1200/S7-1500/S7-200 PLC进行ModbusTcp 和ModbusRTU 通信

前言 一直以来上位软件比如C等和西门子等其他品牌PLC之间的数据交换都是大家比较头疼的问题,尤其是C上位软件程序员。传统的方法一般有OPC、Socket 等,直到LibModbus 开源库出现后这种途径对程序袁来说又有了新的选择。 Modbus简介 Modbus特点 1 &#…

高压继电器,未来几年市场将保持稳定增长

高压继电器是一种用于控制大功率电气设备的开关装置,广泛应用于电力系统、轨道交通、工业自动化等领域。随着各行业对电气控制需求的不断增加,高压继电器市场也在不断扩大。全球高压继电器市场分析: 在全球市场中,目前主要的高压继…

拒绝纸张浪费,Paperless-ngx开源文档管理系统将纸质版转换成可搜索的电子版档案

GitHub:GitHub - paperless-ngx/paperless-ngx: A community-supported supercharged version of paperless: scan, index and archive all your physical documents 在线演示:https://demo.paperless-ngx.com 官网:https://docs.paperless-n…

【力扣100】46.全排列

添加链接描述 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 思路是使用回溯if not nums:return []def dfs(path,depth,visited,res):# 出递归的条件是当当前的深度已经和nums的长度一样了,把path加入数组,然后出递归if …

手机流量卡推广分销网站php源码,多功能的号卡推广分销管理系统

源码简介 拥有多个接口,包括运营商接口,并支持无限三级代理。 最简单易用的PHP系统,它自带自动安装向导,可以让你轻松安装和部署。 该系统集成了多个第三方接口资源,能够满足你的不同需求。采用全系统双色主题&…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 2. True False 3. for 数值循环 in range() P69 4. for 遍历字符串,列表,元组,集合和字典 in obj P70 5. pass 空语句 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif …

机器学习中的监督学习基本算法-逻辑回归简单介绍

逻辑回归 逻辑回归(Logistic Regression)是一种用于解决二分类问题的统计学习方法,尽管名字中带有"回归"一词,但实际上它是一种分类算法。逻辑回归的主要目标是通过学习从输入特征到一个离散的输出(通常是0…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备,发现设备有时加密出来的数据,再解密时与明文对不上,怀疑是通信问题。因此,急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉,所以随便选了个log4cplus软件集成到现有工具…

以STM32为例,实现按键的短按和长按

以STM32为例,实现按键的短按和长按 目录 以STM32为例,实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态,并分别记录按键按下的持续时间,通过时间的长短…

百度百科词条创建多久可以通过?

一个优质的百度百科词条,能提升个人或企业的品牌形象。因此,越来越多的人希望创建自己的百度百科词条,那么,创建一个百度百科词条到底需要多久才能通过审核呢?接下来伯乐网络传媒就来给大家分享一下。 一、百度百科词条…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构,Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布,包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…

静态网页设计——海贼王

前言 使用前端经典三件套HTMLCSSJS实现的海贼王静态网页课程设计,适合我们的童年! 主要内容 首页 首页最上方有一个轮播图,可以自动切换图片,使用js实现。 轮播图往下,就是列出一些比较经典的海贼王影片&#xf…

2023年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏

原文章链接:年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏 - IT之家 更多消息:AI人工智能行业动态,aigc应用领域资讯 在 AI 工具激烈竞争的一年中,尽管ChatGPT在访问量上遥遥领先,但单次使用时长未…

Python之字符编码汇总

一、常见编码 ASCII:ASCII码即美国标准信息交换码(American Standard Code for Information Interchange)。由于计算机内部所有信息最终都是一个二进制值,而每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法:Print Printf Println Sprint Sprintf 1、例如: color.Yellow.Println(&q…

centos7 ping不通域名

如果ip能ping通,ping不通域名可以试试以下操作: 1.编辑resolv.conf文件 vi /etc/resolv.conf 添加 nameserver 8.8.8.8 2.编辑nsswitch.conf vi /etc/nsswitch.conf 改成下图所示: 3.编辑sysctl.conf vi /etc/sysctl.conf 加上两行内…

macOS跨进程通信: FIFO(有名管道) 创建实例

一: 简介 在类linux系统中管道分为有名管道和匿名管道。两者都能单方向的跨进程通信。 匿名管道(pipe): 必须是父子进程之间,而且子进程只能由父进程fork() 出来的,才能继承父进程的管道句柄,一般mac 开发…

1分钟生成爆款风景视频,Stable Video Diffusion最简教程

AI视频是2024年的重头戏,各大AI厂商都在跑视频技术,快速推出更牛的黑科技,SD其实在11月底就出了一款官方视频大模型-SVD,来跟runway、pika抢这块大蛋糕。 之前生成的视频效果还不是很理想,远没runway效果好&#xff0c…

【Mybatis】深入学习MyBatis:高级特性与Spring整合

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 高级特性 1 一级缓存和二级缓存 一级缓存 二级缓存 2 延迟加载 5 整合Spring 1 MyBatis-Spring模块 2 事务管理 结…

如何在Windows安装Wnmp服务并实现固定地址远程访问

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包,安装完成后即可得到一个Nginx MyS…