Flutter机器人控制插件dartros的使用

简介

dartros 是一个在 Dart 中实现的 ROS(Robot Operating System)客户端库。它深受 C++ 和 JavaScript 实现的启发,特别是 rosnodejs 的实现。当前,该包正在被转移到 ros2dart 组织中,以确保更好的维护和支持。

你可以通过查看 examples 文件夹中的示例代码来了解如何使用它,直到作者有时间完善文档为止。

消息生成

dartros 支持消息生成,但你需要克隆 gendart 这个 ROS 包到你的 Catkin 工作区中,然后运行 catkin_make 来生成消息。

克隆并生成消息

  1. 克隆 gendart 到你的工作区:
    git clone https://github.com/TimWhiting/gendart.git
    
  2. 在工作区中运行 catkin_make
    catkin_make
    

生成的消息会位于工作区的 devel 文件夹下,具体路径为:

devel/share/gendart/ros/{msg_package_name}

使用生成的消息

在你的 Dart 节点中,可以通过路径依赖的方式使用这些生成的消息。例如:

# pubspec.yaml
dependencies:
  sensor_msgs:
    path: ../../devel/share/gendart/ros/sensor_msgs

以下是一个发布图像消息的示例代码:

import 'package:dartros/dartros.dart';
import 'package:dartx/dartx.dart';
import 'package:sensor_msgs/msgs.dart';

Future<void> main(List<String> args) async {
  // 初始化节点
  final node = await initNode('test_node', args);

  // 创建图像消息
  final img_msg = Image(
      header: null,
      height: 600,
      width: 1024,
      encoding: 'rgba8',
      is_bigendian: 0,
      step: 1024 * 4,
      data: List.generate(600 * 1024 * 4, (_) => 255));

  // 广播器
  final pub = node.advertise('/robot/head_display', Image.$prototype);

  // 延迟 2 秒后开始发布
  await Future.delayed(2.seconds);

  // 不断发布图像消息
  while (true) {
    pub.publish(img_msg, 1);
    await Future.delayed(2.seconds);
  }
}

发布的标准消息包

为了更好地支持库的开发,以下消息包已经发布到 pub.dev

  • std_msgs
  • sensor_msgs
  • rosgraph_msgs
  • geometry_msgs
  • actionlib_msgs

你可以在 pubspec.yaml 中通过常规的 pub 依赖方式引用它们,以避免版本冲突。

dependencies:
  std_msgs:
    version: ^1.0.0
  sensor_msgs:
    version: ^1.0.0

功能状态

已测试的功能

  • 发布和订阅(TCP)
  • 服务调用
  • 消息和服务的消息生成
  • 连接到非本地的 ROS Master

未测试的功能

  • 发布和订阅(UDP)

注意事项

  • 本项目受 C++ 和 JavaScript 实现的启发,尤其是 rosnodejs
  • 尽管我没有直接使用他们的源码,但由于语言和库的不同,代码结构相似。如果你发现任何问题,请参考其许可证。

示例代码

以下是一个简单的示例代码,展示了如何初始化节点并设置参数:

import 'package:dartros/dartros.dart' as dartros;

Future<void> main(List<String> args) async {
  // 初始化节点
  final nh = await dartros.initNode('ros_node_1', args);

  // 获取主 URI
  await nh.getMasterUri();

  // 设置参数
  await nh.setParam('/foo', 'value');

  // 获取参数
  var value = await nh.getParam('/foo');
  assert(value == 'value');
  print(value);

  // 修改参数
  print(await nh.setParam('/foo', 'new value'));

  // 再次获取参数
  value = await nh.getParam('/foo');
  assert(value == 'new value');
  print(value);
}

更多关于Flutter机器人控制插件dartros的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter机器人控制插件dartros的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dartros 是一个用于在 Flutter 应用中与 ROS (Robot Operating System) 进行通信的 Dart 包。它允许你在 Flutter 应用中订阅和发布 ROS 主题,从而实现与机器人系统的交互。以下是如何在 Flutter 项目中使用 dartros 的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 dartros 依赖:

dependencies:
  flutter:
    sdk: flutter
  dartros: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化 ROS 节点

在你的 Flutter 应用中,首先需要初始化一个 ROS 节点。通常,你可以在 main.dart 文件中进行初始化。

import 'package:dartros/dartros.dart';

void main() async {
  // 初始化 ROS 节点
  final node = await initNode('flutter_robot_control', '127.0.0.1');

  runApp(MyApp(node: node));
}

3. 创建 Flutter 应用

接下来,你可以创建一个简单的 Flutter 应用来与 ROS 进行交互。例如,你可以创建一个按钮来发布消息到 ROS 主题。

import 'package:flutter/material.dart';
import 'package:dartros/dartros.dart';
import 'package:dartros/std_msgs/String.dart';

class MyApp extends StatelessWidget {
  final NodeHandle node;

  MyApp({required this.node});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter ROS Control'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 发布消息到 ROS 主题
              final publisher = node.advertise<StringMessage>('/chatter');
              final msg = StringMessage(data: 'Hello from Flutter!');
              publisher.publish(msg);
            },
            child: Text('Publish to ROS'),
          ),
        ),
      ),
    );
  }
}

4. 订阅 ROS 主题

你也可以订阅 ROS 主题来接收来自机器人系统的消息。

import 'package:flutter/material.dart';
import 'package:dartros/dartros.dart';
import 'package:dartros/std_msgs/String.dart';

class MyApp extends StatefulWidget {
  final NodeHandle node;

  MyApp({required this.node});

  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String receivedMessage = 'No message received yet';

  [@override](/user/override)
  void initState() {
    super.initState();

    // 订阅 ROS 主题
    widget.node.subscribe<StringMessage>('/chatter', (msg) {
      setState(() {
        receivedMessage = msg.data;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter ROS Control'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  // 发布消息到 ROS 主题
                  final publisher = widget.node.advertise<StringMessage>('/chatter');
                  final msg = StringMessage(data: 'Hello from Flutter!');
                  publisher.publish(msg);
                },
                child: Text('Publish to ROS'),
              ),
              SizedBox(height: 20),
              Text('Received Message: $receivedMessage'),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部