我在做一个远程操作应用程序。我使用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的任何信息,因此机器人只是静止不动,而且,不能通过单击”断开“按钮来终止连接。
这是我的密码
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')
),
],
),
],
),
),
);
},
);
}
}发布于 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');
这就是解决办法。造成我的问题的主要原因是,我在虚拟机上做了所有的事情,并且不知道错误在哪里,即使虚拟机本身造成了一个错误。
https://stackoverflow.com/questions/72784075
复制相似问题