天天看點

.NET6: 開發基于WPF的摩登三維工業軟體 (10) - 機器人

.NET6: 開發基于WPF的摩登三維工業軟體 (10) - 機器人

基于前文介紹的Ribbon界面、插件化、MVVM模式等内容,我們搭建了一個軟體雛形。本文将綜合之前的内容在RapidCAX架構中內建Robot元件,實作一個簡單的機器人正向模拟子產品。

基于前文介紹的Ribbon界面、插件化、MVVM模式等内容,我們搭建了一個軟體雛形。本文将綜合之前的内容在RapidCAX架構中內建Robot元件,實作一個簡單的機器人正向模拟子產品。

1 目标

基于MVVM模式在RapidCAX中增加以下的機器人互動界面:

.NET6: 開發基于WPF的摩登三維工業軟體 (10) - 機器人
  • 加載機器人模型後,在左側的目錄樹裡面顯示機器人模型的名稱
  • 在目錄樹中選中機器人節點後,在右側的屬性面闆中顯示機器人的配置參數
  • 修改機器人的關節參數,更新機器人模型,實作正向模拟

2 整體設計

.NET6: 開發基于WPF的摩登三維工業軟體 (10) - 機器人

總體上采用插件機制,即機器人子產品Rapid.Robot.Plugin依賴主程式Rapid.CAX.exe,主程式動态加載機器人子產品。

子產品内采用MVVM架構,以分離界面和邏輯實作。

命名約定:

  • ProjectBrowser:項目目錄樹
  • PropertyView: 屬性面闆

互動過程

  • 點選加載機器人指令由RobotViewModel處理,加載模型并顯示
  • RobotViewModel監聽ProjectBrowerViewModel的選擇修改,并建立PropertyView和PropertyViewModel
  • 修改屬性後,RobotPropertyView通知RobotModel更改機器人關節參數,并更新視圖

3 具體實作

Rapid.Robot.Plugin項目建立,Ribbon界面建立過程這裡不再贅述,可以參考之前的内容建立。

3.1 機器人描述

單模型多機械臂的結構設計,詳細參照 ​​樣例模型​​

3.2 模型加載

由​​MachineTemplate​​​類實作,具體參考代碼實作。

加載後建立​​​RobotModel​​對象。

//RobotViewModel.cs

    var template = AnyCAD.Robot.MachineTemplate.Load(dlg.FileName, (int progress) =>
        {
            //TODO:
        });

    if (template == null)
    {
        MessageBox.Show("打開配置檔案失敗");
        return;
    }

    var robot = template.CreateInstance();
    viewer3d.ShowSceneNode(robot);


    mRobotControl = new RobotModel(robot);
    viewer3d.ShowSceneNode(mRobotControl.TrackingPath);

    
    var treeNode = new BrowserTreeNode { DisplayName = mRobotControl.Name, Tag = mRobotControl };
    MainWindow.Instance()?.ProjectBrowser.TreeNodes.Add(treeNode);      

3.3 動态建立屬性

RobotViewModel收到選擇了機器人後,動态建立RobotPropertyView并挂接到屬性面闆上。

//RobotViewModel.cs
        void OnSelectionChagned(object? sender, PropertyChangedEventArgs e)
        {
            var pbCtrl = MainWindow.Instance()?.ProjectBrowserCtrl;
            if (pbCtrl == null)
                return;

            var node = (BrowserTreeNode)pbCtrl.SelectedItem;
            if(node == null)
                return ;
               
            if(node.Tag == mRobotControl && mRobotControl!=null)
            {
                var panel = MainWindow.Instance()?.PropertyPanel;
                if(panel != null)
                    panel.Content = new RobotPropertyView(mRobotControl);
            }
        }      

3.4 機器人關節修改

機器人控制和模拟在《​​一種機器人運動模拟裝置​​》一文中做了比較詳細的介紹,這裡不再贅述。

以更改參數A屬性為例,ViewModel部分代碼如下:

//RobotPropertyViewModel.cs
     private uint mBaseOffset = 1; //用來調整軸的起始位置偏移

     public double A { get => mRobot.GetVariable(mArmIndex, 0+ mBaseOffset); set=> SetProperty(0 + mBaseOffset, value, nameof(A)); }

    Vector3 mFinalPosition = new Vector3(0);
    void SetProperty(uint idx, double val, string name)
    {
        var old = mRobot.GetVariable(mArmIndex, idx);
        var delta = val - old;
        if(SetProperty(ref old, val, name))
        {
            // 更新關節參數
            mRobot.AddVariable(mArmIndex, idx, delta);

            var viewer3D = MainWindow.Instance()?.Viewer3D;
            viewer3D?.RequestDraw(EnumUpdateFlags.Scene);

            // 計算末端點的位置
            var trf = mRobot.GetFinalPosition(mArmIndex);
            mFinalPosition.x = mFinalPosition.y = mFinalPosition.z = 0;
            mFinalPosition.applyMatrix4(trf);

            // 增加路徑點
            mRobot.AddTrackingPoint(mFinalPosition);

            // 更新界面
            OnPropertyChanged(nameof(FinalPositionX));
            OnPropertyChanged(nameof(FinalPositionY));
            OnPropertyChanged(nameof(FinalPositionZ));
        }
    }      

4 總結

本文涉及的内容主要是前文幾部分的綜合應用,這裡主要列舉了關鍵的代碼實作,詳細的代碼實作可以從gitee上​​Rapid.CAX項目​​上下載下傳。

最終效果如下:

​​https://www.bilibili.com/video/BV1Pu411q7JK/​​