VisbotClient 是一个 Android 应用程序,用于控制 Visbot 机器人(Rosa 版本)的舵机和电机。该应用通过 IPC(进程间通信)与机器人的系统服务进行交互,实现了完整的机器人控制功能。
- ✅ 舵机控制 - 控制机器人头部舵机旋转
- ✅ 电机控制 - 控制机器人移动(前进、后退、左转、右转)
- ✅ IPC 通信 - 通过 Master 服务与系统服务通信
- ✅ 会话管理 - 使用 Robot.globalContext() 管理资源竞争
- ✅ 小屏幕适配 - 针对 320x240 分辨率优化的 UI
- 开发语言: Java
- 目标平台: Android 5.1 (API Level 22)
- 构建工具: Gradle 8.7
- SDK: Visbot Rosa SDK (rosa.jar)
- 签名: Android 系统签名 (platform.pk8/platform.x509.pem)
┌─────────────────────────────────────────────────────────────┐
│ VisbotClient App │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ ServoController │ │ MotorController │ │
│ │ Client │ │ Client │ │
│ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │
│ └──────────┬───────────────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ Robot.globalContext() │
│ │ (rosa.jar SDK) │ │
│ └──────────┬──────────┘ │
└──────────────────────┼──────────────────────────────────────┘
│ IPC (Binder)
┌──────────────────────▼──────────────────────────────────────┐
│ Master Service (系统服务) │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Servo Service │ │ Locomotion │ │
│ │ │ │ Service │ │
│ └────────┬─────────┘ └────────┬─────────┘ │
└───────────┼──────────────────────────────┼──────────────────┘
│ │
┌───────────▼──────────────────────────────▼──────────────────┐
│ 硬件层 │
│ 舵机硬件 电机硬件 │
└─────────────────────────────────────────────────────────────┘
- 功能: 控制舵机旋转
- 实现方式: 使用
Robot.globalContext().getSystemService("servo") - 主要方法:
rotate(int servoId, float angle)- 旋转到指定角度center()- 归中所有舵机
- 功能: 控制机器人移动
- 实现方式: 使用
Robot.globalContext().getSystemService("locomotion") - 主要方法:
moveForward(speed, duration)- 前进moveBackward(speed, duration)- 后退turnLeft(speed, angle)- 左转turnRight(speed, angle)- 右转stop()- 紧急停止
- 来源:
/system/framework/rosa.jar - 核心类:
Robot- SDK 入口,提供服务注册和初始化GlobalContext- 全局上下文,用于获取系统服务ServoController- 舵机控制接口LocomotionController- 电机控制接口
- JDK: 1.8 或更高
- Android SDK: API Level 22 (Android 5.1)
- Gradle: 8.7
- ADB: 用于安装和调试
# 进入项目目录
cd VisbotClient
# 清理并构建 Debug 版本
.\gradlew.bat clean assembleDebug
# 构建成功后,APK 位于:
# app/build/outputs/apk/debug/app-debug.apk# 安装 APK
adb install -r app/build/outputs/apk/debug/app-debug.apk
# 强制停止旧版本
adb shell am force-stop com.example.visbotclient
# 启动应用
adb shell am start -n com.example.visbotclient/.MainActivity# 清除旧日志
adb logcat -c
# 实时查看应用日志
adb logcat | Select-String -Pattern "VisbotClient|ServoController|MotorController|MainActivity"
# 或者使用 grep (Linux/Mac)
adb logcat | grep -E "VisbotClient|ServoController|MotorController|MainActivity"- 舵机 ID: 1-6(对应不同的舵机)
- 角度范围: -180° 到 +180°
- 速度: 0-100(百分比)
ServoControllerClient servoController = new ServoControllerClient(context);
// 旋转舵机 1 到 90 度
servoController.rotate(1, 90.0f);
// 所有舵机归中
servoController.center();ServoControllerClient: Rotating servo 1 to angle 90.00
MST|LoggingHandler: resultType='success', code=0
移动速度 (movingSpeed):
- 范围: 0.0 - 1.0
- 正值 = 前进,负值 = 后退
- 默认: 0.3
转向速度 (turningSpeed):
- 范围: 度/秒
- 正值 = 逆时针(左转),负值 = 顺时针(右转)
- 默认: 30.0 度/秒
持续时间 (duration):
- 单位: 毫秒
- 0 = 持续移动(直到下一个命令)
- 默认: 1000ms
MotorControllerClient motorController = new MotorControllerClient(context);
// 前进 1 秒
motorController.moveForward(0.3f, 1000);
// 后退 1 秒
motorController.moveBackward(0.3f, 1000);
// 左转 90 度
motorController.turnLeft(30.0f, 90.0f);
// 右转 90 度
motorController.turnRight(30.0f, 90.0f);
// 紧急停止
motorController.stop();前进/后退:
// 前进: movingSpeed > 0, movingAngle = 0
new LocomotionOption.Builder()
.setMovingSpeed(Math.abs(speed))
.setMovingAngle(0)
.build();
// 后退: movingSpeed < 0, movingAngle = 0
new LocomotionOption.Builder()
.setMovingSpeed(-Math.abs(speed))
.setMovingAngle(0)
.build();左转/右转:
// 左转: turningSpeed > 0 (逆时针)
new LocomotionOption.Builder()
.setTurningSpeed(Math.abs(speed))
.setTurningAngle(Math.abs(angle))
.build();
// 右转: turningSpeed < 0 (顺时针)
new LocomotionOption.Builder()
.setTurningSpeed(-Math.abs(speed))
.setTurningAngle(Math.abs(angle))
.build();MotorControllerClient: Moving forward: speed=0.30, duration=1000 ms
MotorControllerClient: locomote() promise created successfully
MST|LoggingHandler: resultType='success', code=0
详细的 IPC 通信实现请参考 IPC通信实现指南.md
-
初始化 Robot SDK
Robot.initialize(context.getApplicationContext());
-
获取系统服务
ServoController servoController = Robot.globalContext().getSystemService("servo"); LocomotionController locomotionController = Robot.globalContext().getSystemService("locomotion");
-
调用服务方法
// 舵机控制 ProgressivePromise<Void, ServoException, ServoProgress> promise = servoController.rotate(servoId, angle); // 电机控制 ProgressivePromise<Void, LocomotionException, LocomotionProgress> promise = locomotionController.locomote(option);
-
会话管理
- Robot.globalContext() 自动管理会话
- 自动处理资源竞争(navigation, recharging)
- 支持请求中断和优先级管理
VisbotClient/
├── app/
│ ├── src/main/
│ │ ├── java/com/example/visbotclient/
│ │ │ ├── MainActivity.java # 主界面
│ │ │ ├── servo/
│ │ │ │ └── ServoControllerClient.java # 舵机控制客户端
│ │ │ ├── motor/
│ │ │ │ └── MotorControllerClient.java # 电机控制客户端
│ │ │ └── master/
│ │ │ ├── MasterConnection.java # Master 服务连接(已废弃)
│ │ │ └── MasterServiceProxy.java # Master 服务代理(已废弃)
│ │ ├── res/
│ │ │ └── layout/
│ │ │ └── activity_main.xml # UI 布局(320x240 优化)
│ │ └── AndroidManifest.xml # 应用配置
│ ├── libs/
│ │ └── rosa.jar # Visbot SDK
│ └── build.gradle # 应用构建配置
├── keystore/
│ ├── platform.pk8 # 系统签名私钥
│ └── platform.x509.pem # 系统签名证书
├── gradle/ # Gradle 配置
├── build.gradle # 项目构建配置
├── settings.gradle # 项目设置
├── README.md # 本文档
└── IPC通信实现指南.md # IPC 通信详细文档
adb logcat | Select-String -Pattern "MST"adb logcat | Select-String -Pattern "MST\|LoggingHandler"adb logcat | Select-String -Pattern "MST\|CompetitionManager"adb logcat | Select-String -Pattern "AndroidRuntime"-
IPC 通信方案演进
- 初期:自定义 IPC 实现(失败)
- 最终:使用 Robot.globalContext() SDK(成功)
-
电机控制参数发现
- 前进/后退:通过
movingSpeed符号控制(正=前进,负=后退) - 左转/右转:通过
turningSpeed符号控制(正=逆时针,负=顺时针)
- 前进/后退:通过
-
UI 适配
- 针对 320x240 小屏幕优化
- 添加 ScrollView 支持滚动
- 减小字体和控件尺寸
本项目为内部开发项目,版权归属于项目所有者。
- 开发者:通过 AI 辅助完成
- 测试:在 Visbot Rosa 机器人上验证
如有问题或建议,请联系项目维护者。