#星计划#梅科尔工作室HOS-断指康复评估应用 原创
1 前言
1.1 主要使用功能
我们基于OpenHarmony开发一个专门的应用端来帮助断指患者更好地管理康复过程。将传感器与手指义肢相结合,通过传感器可以感知手指的移动和受力情况,并将这些信息传递给手指义肢控制系统,从而实现更加精准的控制和响应,患者可以在开发的应用端上实时观测到手势的识别结果,我们旨在为断指患者提供全面的康复辅助和健康管理。
1.2 运行环境
开发环境准备:
DevEco Studio版本:DevEco Studio 3.1.1 Release及以上版本。
OpenHarmony SDK版本:API 9,OpenHarmony3.2 Release
1.3 前期准备
DAYU200硬件了解,固件下载更新烧录。
可以参考:https://bbs.huaweicloud.com/blogs/381452
图1 烧录固件
在DevEco Studio上改为OpenHarmony开发模式并完成签名,这样我们就可以开始开发啦。
图2 更改模式
注意:需要下载一下OpenHarmony的SDK:
图3 下载SDK
不要忘了签名:
图4 应用签名
2 UI设计
2.1 修改昵称
在前端应用中创建一个弹窗元素,包括一个文本输入框、一段文字、以及两个按钮,用于实现修改昵称的功能。
图5 修改昵称
// 设置文本 '更换昵称' 的字体大小为 20,上下边距分别为 10
Text('更换昵称').fontSize(20).margin({ top: 10, bottom: 10 })
// 创建一个文本输入框,设置占位符为空,文本为 this.textValue,高度为 60,宽度为 '90%'
TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
// 当文本输入框的值发生变化时,触发 onChange 事件,将新值赋给 this.textValue
.onChange((value: string) => {
this.textValue = value
})
// 设置文本 '是否更换?' 的字体大小为 16,上下边距分别为 10
Text('是否更换?').fontSize(16).margin({ top:10, bottom: 10 })
// 创建一个 Flex 容器,设置主轴对齐方式为 SpaceAround
Flex({ justifyContent: FlexAlign.SpaceAround }) {
// 创建一个按钮 '更换',点击按钮时执行以下操作:
Button('更换')
.onClick(() => {
// 将文本输入框的值赋给 this.inputValue
this.inputValue = this.textValue
// 关闭控制器
this.controller.close()
// 执行确认操作
this.confirm()
})
// 设置按钮背景颜色为白色,字体颜色为红色
.backgroundColor(0xffffff).fontColor(Color.Red)
}
然后设置修改,这段代码片段整体上是在组件中声明了一些状态和回调函数,然后使用这些状态和回调函数创建了一个自定义对话框控制器,以实现对话框的定制和交互。
// 声明状态变量 textValue,初始化为空字符串
@State textValue: string = ''
// 声明状态变量 inputValue,初始化为 '昵称'
@State inputValue: string = '昵称'
// 创建一个自定义对话框控制器,使用 CustomDialogController 类,传入配置参数
dialogController: CustomDialogController = new CustomDialogController({
// 使用 CustomDialogExample 作为对话框的构建器,配置取消和确认的回调函数,以及关联状态变量
builder: CustomDialogExample({
cancel: this.onCancel,
confirm: this.onAccept,
textValue: $textValue,
inputValue: $inputValue
}),
// 配置取消对话框时的回调函数
cancel: this.existApp,
// 设置自动取消为 true
autoCancel: true,
// 配置对话框的对齐方式为默认
alignment: DialogAlignment.Default,
// 设置偏移量为 { dx: 0, dy: -20 }
offset: { dx: 0, dy: -20 },
// 配置网格数量为 4
gridCount: 4,
// 禁用自定义样式
customStyle: false
})
// 定义 aboutToDisappear 方法
aboutToDisappear() {
// 删除当前对话框控制器
delete this.dialogController,
// 将对话框控制器设置为 undefined
this.dialogController = undefined
}
2.2 信息选择
创建一个按钮,当点击按钮时,弹出一个文本选择对话框,用户可以从中选择伤残类型。选择的结果会通过回调函数进行处理。
图6 信息选择
// 创建一个按钮 "伤残类型",设置外边距为 20,点击按钮时执行以下操作
Button("伤残类型")
.margin(20)
.onClick(() => {
// 显示文本选择对话框,配置范围为 this.shangcanage
TextPickerDialog.show({
range: this.shangcanage,
// 确认选择时执行的回调函数,将选择的索引赋给 this.select1
onAccept: (value: TextPickerResult) => {
this.select1 = value.index
console.info("TextPickerDialog:onAccept()" + JSON.stringify(value))
},
// 取消选择时执行的回调函数
onCancel: () => {
console.info("TextPickerDialog:onCancel()")
},
// 选择变化时执行的回调函数
onChange: (value: TextPickerResult) => {
console.info("TextPickerDialog:onChange()" + JSON.stringify(value))
}
})
})
2.3 康复评估
创建一个HTTP请求对象,定义了请求的URL,使用request方法发起HTTP请求,指定了请求方法为POST,设置请求头为JSON格式。
在请求的extraData中包含了一些参数,需要根据实际情况传递有效的数据。在请求回调函数中,处理请求成功和失败的情况。如果返回的结果是'测试成功',则显示提示信息;否则,显示账户密码错误的提示信息。最后,根据请求的结果进行相应的处理,包括日志输出和提示信息。
图7 康复评估
// 定义 S_login 方法
S_login() {
// 创建一个 HTTP 请求对象
let httpRequest = http.createHttp();
// 设置请求的 URL
let url = "https://aip.baidubce.com/rpc/2.0/ai_custom_bml/v1/table_infer/emg_finger?access_token=24.a96f9a18bc0298ca1f07dbd8b5b63945.2592000.1694417034.282335-37576462"
// 发起 HTTP 请求,这里使用云端训练好的模型进行识别
httpRequest.request(
url,
{
method: http.RequestMethod.POST,
// 设置请求头信息,指定 Content-Type 为 application/json
header: {
'Content-Type': 'application/json'
},
// 设置请求的额外数据,包括 include_req 和 data 字段
extraData: {
"include_req": false,
"data": [{
// 数据的具体字段,这里只展示了一个示例字段,实际数据可能包含更多字段
"col0": 0.046904,
"col1": 0.03827,
"col2": 0.027714,
// ... 其他字段
"col79": 1
}]
},
// 设置连接超时时间为 6000 毫秒
connectTimeout: 6000,
// 设置读取超时时间为 6000 毫秒
readTimeout: 6000,
}
);
}
手势识别界面,包括显示手势识别标题、提示信息,以及一个包含图像动画和控制按钮的界面。用户可以通过按钮控制动画的播放、暂停、结束,并设置撤销、播放次数等参数。图像动画通过ImageAnimator组件实现,根据按钮的点击事件改变动画状态和参数。
// 显示文本 "手势识别"
Text("手势识别")
// 显示文本 "请根据下面顺序依次做动作"
Text("请根据下面顺序依次做动作")
// 创建一个垂直列,设置子元素间的垂直间隔为 20
Column({ space: 20 }) {
// 显示一个图像动画,设置动画帧的图片来源
ImageAnimator()
.images([
{
src: $r('app.media.shoushi7')
},
{
src: $r('app.media.shoushi6')
}
])
// 创建一个水平行
Row() {
// 创建一个按钮 '开始',设置宽度为 100,内边距为 5,点击按钮时执行状态切换为 Running
Button('开始').width(100).padding(5).onClick(() => {
this.state = AnimationStatus.Running
}).margin(5)
// 创建一个按钮 '暂停',设置宽度为 100,内边距为 5,点击按钮时执行状态切换为 Paused
Button('暂停').width(100).padding(5).onClick(() => {
this.state = AnimationStatus.Paused
}).margin(5)
// 创建一个按钮 '结束',设置宽度为 100,内边距为 5,点击按钮时执行状态切换为 Stopped
Button('结束').width(100).padding(5).onClick(() => {
this.state = AnimationStatus.Stopped
}).margin(5)
}
// 创建一个按钮 '开始测试',点击按钮时执行 S_login 方法
Button('开始测试')
.onClick(() => {
this.S_login();
})
}
3 展望
我们将继续依托鸿蒙技术,挑战更高的技术难题,完善社区交流服务,并致力于创造更有影响力的解决方案。同时,我们也会把在克服技术障碍中所积累的经验和智慧传承下去,让它成为我们持续成长和创新的动力。通过展示我们的技术成果和应用路径,希望与更多开发者交流,为更多断指患者带来实质性的改善。