首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序的ROS//桌面版本运行良好,但在android上运行时,StatusStream总是返回Status.CLOSED。

应用程序的ROS//桌面版本运行良好,但在android上运行时,StatusStream总是返回Status.CLOSED。
EN

Stack Overflow用户
提问于 2022-06-28 09:37:15
回答 1查看 152关注 0票数 0

我在做一个远程操作应用程序。我使用roslib来实现ros功能,但Android上的连接存在问题。Snapshot.connectionState总是在等待,流状态在乞讨中从null变为Status.CLOSED。此外,Android会产生以下错误:

E/BpSurfaceComposerClient(15711):处理失败(-1)

UPD:当我尝试使用ros = Ros(url: 'ws://10.0.2.15:9090');连接时," connect“按钮改为”断开“,这意味着正确的连接,但是cmd_vel主题没有收到来自app的任何信息,因此机器人只是静止不动,而且,不能通过单击”断开“按钮来终止连接。

这是我的密码

代码语言:javascript
复制
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:roslib/roslib.dart';
import 'dart:convert';

class mainPage extends StatefulWidget {
  const mainPage({Key? key}) : super(key: key);

  @override
  State<mainPage> createState() => _mainPageState();
}

class _mainPageState extends State<mainPage> {
  int linearCounter = 0;
  int angularCounter = 0;
  late Ros ros;
  late Topic cmd_vel;
  late Topic image_raw;

  @override
  void initState() {
    ros = Ros(url: 'ws://10.0.2.15:9090');
    image_raw = Topic(
      ros: ros,
      name: '/camera/rgb/image_raw/compressed',
      type: "sensor_msgs/CompressedImage",
      reconnectOnClose: true,
      queueLength: 10,
      queueSize: 10,
    );
    cmd_vel = Topic(
      ros: ros,
      name: '/cmd_vel',
      type: "geometry_msgs/Twist",
      reconnectOnClose: true,
      queueLength: 10,
      queueSize: 10
    );
    super.initState();
  }

  void move(double coordinate, double angle) {
    double linearSpeed = 0.0;
    double angularSpeed = 0.0;
    linearSpeed = linearCounter * coordinate;
    angularSpeed = angularCounter * angle;
    publishCmd(linearSpeed, angularSpeed);
  }

  void initConnection() async {
    ros.connect();
    await image_raw.subscribe();
    await cmd_vel.advertise();
    setState(() {});
  }

  void destroyConnection() async {
    await image_raw.unsubscribe();
    await ros.close();
    setState(() {});
  }

  void publishCmd(double coord, double ang) async {
    var linear = {'x': coord, 'y': 0.0, 'z': 0.0};
    var angular = {'x': 0.0, 'y': 0.0, 'z': ang};
    var geomTwist = {'linear': linear, 'angular': angular};
    await cmd_vel.publish(geomTwist);
    if (kDebugMode) {
      print('cmd published');
    }
  }

  Widget getImage(String vid_snapshot) {
    const Base64Codec base64 = Base64Codec();
      return Flexible(
        flex: 1,
        child: Image.memory(
          base64.decode(vid_snapshot),
          gaplessPlayback: true,
          height: 400,
          fit: BoxFit.fill,
        ),
      );
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<Object>(
      stream: ros.statusStream,
      builder: (context, AsyncSnapshot<dynamic> snapshot) {
        return Scaffold(
          backgroundColor: Colors.grey[700],
          appBar: AppBar(
            title: const Text('Teleoperation app'),
            centerTitle: true
          ),
          body: SafeArea(
            minimum: const EdgeInsets.only(bottom: 30.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.end,
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    StreamBuilder(
                      stream: image_raw.subscription,
                      builder: (vidContext, AsyncSnapshot<dynamic> vidSnapshot) {
                        if (vidSnapshot.data == null) {
                          return const Text('No signal');
                        }
                        Map<String, dynamic> value = Map<String, dynamic>.from(vidSnapshot.data);
                        return getImage(value['msg']['data']);
                      },
                    ),
                  ],
                ),
                Padding(padding: EdgeInsets.only(bottom: 30.0)),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ActionChip(
                      label: Text(snapshot.data == Status.CONNECTED
                        ? 'DISCONNECT'
                        : 'CONNECT'),
                      backgroundColor: snapshot.data == Status.CONNECTED
                        ? Colors.green[300]
                        : Colors.grey[300],
                      onPressed: () {
                        print(snapshot.data);
                        if (snapshot.data != Status.CONNECTED) {
                          initConnection();
                        } else {
                          destroyConnection();
                        }
                      },
                    ),
                  ],
                ),
                Padding(padding: EdgeInsets.only(bottom: 15.0)),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ElevatedButton.icon(
                        style: ElevatedButton.styleFrom(
                          minimumSize: Size(130.0, 40.0),
                        ),
                        onPressed: () {
                          linearCounter++;
                          move(0.1, 0.0);
                        },
                        icon: Icon(Icons.arrow_upward),
                        label: Text('Forward')
                    ),
                  ],
                ),
                Padding(padding: EdgeInsets.only(bottom: 30.0)),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: [
                    ElevatedButton.icon(
                      style: ElevatedButton.styleFrom(
                        minimumSize: Size(130.0, 40.0),
                      ),
                      onPressed: () {
                        angularCounter++;
                        move(0.0, 0.1);
                      },
                      icon: Icon(Icons.arrow_back),
                      label: Text('Left')
                    ),
                    ElevatedButton.icon(
                      style: ElevatedButton.styleFrom(
                        minimumSize: Size(130.0, 40.0),
                      ),
                      onPressed: () {
                        angularCounter = 0;
                        linearCounter = 0;
                        move(0.0, 0.0);
                      },
                      icon: Icon(Icons.stop_circle_outlined),
                      label: Text('Stop')
                    ),
                    ElevatedButton.icon(
                      style: ElevatedButton.styleFrom(
                        minimumSize: Size(130.0, 40.0),
                      ),
                      onPressed: () {
                        angularCounter--;
                        move(0.0, 0.1);
                      },
                      icon: Icon(Icons.arrow_forward),
                      label: Text('Right')
                    ),
                  ],
                ),
                Padding(padding: EdgeInsets.only(bottom: 30.0)),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ElevatedButton.icon(
                      style: ElevatedButton.styleFrom(
                        minimumSize: Size(130.0, 40.0),
                      ),
                      onPressed: () {
                        linearCounter--;
                        move(0.1, 0.0);
                      },
                      icon: Icon(Icons.arrow_downward),
                      label: Text('Backward')
                    ),
                  ],
                ),
              ],
            ),
          ),
        );
      },
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-05 08:40:08

我设法解决了这个问题。您的电话和计算机应该连接到同一个Wi网络。在您的~/.bashrc文件中,应该添加两行:

export ROS_MASTER_URI=http://192.168.1.110:11311

export ROS_IP=192.168.1.110

192.168.1.110是网络中计算机的IP地址。

在您的应用程序中,将行ros = Ros(url: 'ws://10.0.2.15:9090');改为ros = Ros(url: 'ws://192.168.1.110:9090');

这就是解决办法。造成我的问题的主要原因是,我在虚拟机上做了所有的事情,并且不知道错误在哪里,即使虚拟机本身造成了一个错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72784075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档