前言

在经历实习转正、完成学校大四上的一波课程后终于到了做毕设的阶段。我的毕设想法很简单,做一个机械臂,然后让LLM决策去控制它完成一些动作。

我把这个项目分成四个部分组成,上位机客户端软件,机械臂操作服务器,MCP服务器(供LLM执行调用工具的服务器),机械臂本体。

我决定先完成上位机软件和机械臂硬件,并且把操作和上位机软件的内容先耦合起来,确保make it work。等基础功能完成后再对软件部分进行解耦重构。

上位机技术选型

使用flutter这个跨平台开发框架,方便我后续能够直接编译到其它系统中使用。

需求(后续可能会添加)

设置界面

  • 可以切换软件的语言
  • 可以切换主题

设备管理界面

  • 搜索附近的设备(蓝牙,后续我希望能直接联网)并且可以选择连接
  • 断开当前设备
  • 显示设备信息

基础调试界面

  • 向连接的设备发送或接收数据
  • 可以简单的管理设备的断开连接

机械臂操控界面

  • 通过自定义的协议操控机械臂
  • 用预设好的按钮调整机械臂每个关节
  • 显示各个关节的数据
  • 3D显示,可以通过拖动来直观操控机械臂(感觉挺难的,估计做不出来,但还是先立个flag在这了)

项目初始化

Flutter 环境

不赘述,我使用vscode进行flutter开发,相关文档https://docs.flutter.cn/install/with-vs-code
可以使用命令面板的flutter doctor 来检查环境是否正常。

VSCode创建新的Flutter项目

打开VSCode的工作区后,按shift+ctrl+P 打开正上方的命令面板,输入Flutter选择New Project
在这里插入图片描述
类型我选择Application 自带了一个计数器的示例程序
在这里插入图片描述
选择好文件夹和取好项目名字,这个项目我取名为robot_arm_host,等到项目初始化完成后可以看到以下内容
在这里插入图片描述
点击右下角的设备栏,选择一个运行的设备。
在这里插入图片描述
点击后会在正上方的命令面板显示设备,这里我依然使用windows
在这里插入图片描述
在左侧的管理树打开lib/main.dart。
在这里插入图片描述

然后点击右上角的三角符号右侧的下拉栏,选择Start Debugging 来运行这个例程
在这里插入图片描述
最后成功运行这个计数器例程。确定windows下的开发环境是正常的。
在这里插入图片描述

规划项目结构

我在lib这个文件夹下存储我的代码,我暂时根据当前的需要创建了如下结构
lib/
├── app.dart //app类的代码
├── component //存放通用组件类的文件夹
├── main.dart //入口主函数
├── model //存放模型类的文件夹(模型类负责存储数据和执行一些数据修改的业务)
└── route //存储路由的文件夹
│ ├── console_page.dart //控制台界面路由
│ ├── dev_manager_page.dart //设备管理界面路由
│ ├── homepage.dart //主页面界面路由
│ ├── index.dart //用于导出本文件夹的代码文件(里面的export语句可以让其它文件通过包含这个文件来导入这个文件夹里面所有类)
│ └── setting_page.dart //设置界面路由

把测试代码重构

把生成的计数器代码按照我的项目结构来重构

main.dart

import 'package:flutter/material.dart';
import './app.dart';
void main() => runApp(const App());//相当于void main(){ runApp(const App()); }

app.dart

import 'package:flutter/material.dart';
import 'route/index.dart';  //这里通过import index.dart 文件来import 所有route界面
class App extends StatelessWidget {
  const App({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const HomePage(title: 'Flutter Demo Home Page'), 
    );
  }
}

index.dart

//使用export导出想要的别的代码import的dart文件
export 'homepage.dart'; 
export 'dev_manager_page.dart';
export 'console_page.dart';
export 'setting_page.dart';

homepage.dart

//把原来生成的主页部分代码移动到homepage.dart
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
  const HomePage({super.key, required this.title});

  final String title;

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }
  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('You have pushed the button this many times:'),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), 
    );
  }
}

切回main.dart 按照前文的步骤正常运行,完成重构。
使用git初始化仓库方便后续进行版本管理,在vscode中可以以图形化界面呈现前提是已经安装了git。
git的安装:https://blog.csdn.net/mukes/article/details/115693833
在侧边栏找到git,点击初始化仓库。
在这里插入图片描述
输入init 作为提交信息,然后点击提交。
在这里插入图片描述
至于更多git的用法我就不多赘述,我推荐一个自学的网站,不会的同学请自取:https://learngitbranching.js.org
软件部分的下一章我会完成设置界面的内容:软件的语言、主题切换。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐