You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成roslib开发安卓ROS遥操作应用连接Status.CLOSED异常

Flutter + roslib 安卓端ROS连接异常修复方案

核心问题排查与修复

  • 安卓权限与明文流量限制(首要原因)
    桌面端默认开放本地网络权限,安卓端默认拦截非加密WS连接、且需要单独声明网络权限,会直接导致websocket握手失败,状态一直返回Status.CLOSED。
    修复操作:
  1. 打开项目路径下android/app/src/main/AndroidManifest.xml文件
  2. 在<manifest>根节点下、<application>标签前添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  1. 在<application>标签上添加明文流量放行属性,否则ws://开头的连接会被系统直接丢弃:
<application
  android:usesCleartextTraffic="true"
  <!-- 保留原有其他配置项 -->
>
  • 连接IP配置错误
    你当前填写的10.0.2.15是安卓模拟器自身的虚拟网卡IP,不是宿主机地址。安卓模拟器访问运行在电脑上的rosbridge服务,固定要使用10.0.2.2这个特殊地址,也就是连接地址要改成ws://10.0.2.2:9090。如果是真机调试,确保手机和ROS主机在同一局域网,填写ROS主机的实际局域网IP即可,不能用127.0.0.1/localhost。
  • 连接时序逻辑错误
    现有代码调用ros.connect()后没有等待连接建立完成,就直接执行话题订阅、发布声明操作,此时websocket握手还没完成,后续操作全部会失效,就会出现按钮状态看似切换成功、但消息发不出去、断连无响应的问题。
    修复后的连接/断连方法:
void initConnection() async {
  await ros.connect();
  ros.statusStream.listen((status) async {
    if (status == Status.CONNECTED) {
      await cmd_vel.advertise();
      await image_raw.subscribe();
      if (mounted) setState(() {});
    }
  });
}

void destroyConnection() async {
  await cmd_vel.unadvertise();
  await image_raw.unsubscribe();
  await ros.close();
  if (mounted) setState(() {});
}
  • UI状态判断bug
    现有代码直接用snapshot.data判断连接状态,没有处理流初始加载的null状态,会出现连接状态误判。在ros.statusStream对应的StreamBuilder中先校验流数据有效性:
builder: (context, AsyncSnapshot<dynamic> snapshot) {
  if (!snapshot.hasData) {
    return const Center(child: CircularProgressIndicator());
  }
  final isConnected = snapshot.data == Status.CONNECTED;
  // 后续UI逻辑统一用isConnected变量判断连接状态即可
}

无关问题说明

日志抛出的E/BpSurfaceComposerClient(15711): Failed to transact (-1)是安卓模拟器GPU渲染层的通用警告,和ROS连接逻辑没有关联,不需要额外处理。

其他逻辑bug修复

你当前右转按钮的角速度参数符号写反了,左、右转都传了正的0.1角速度,机器人无法右转,修改对应代码:

ElevatedButton.icon(
  style: ElevatedButton.styleFrom(
    minimumSize: Size(130.0, 40.0),
  ),
  onPressed: () {
    angularCounter--;
    move(0.0, -0.1); // 原代码此处为0.1,改为负值
  },
  icon: Icon(Icons.arrow_forward),
  label: Text('Right')
),

内容的提问来源于stack exchange,提问作者Michael Sk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:21:25