1. 程式人生 > 其它 >.NET6: 開發基於WPF的摩登三維工業軟體 (10) - 機器人

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

基於前文介紹的Ribbon介面、外掛化、MVVM模式等內容,我們搭建了一個軟體雛形。本文將綜合之前的內容在RapidCAX框架中整合Robot元件,實現一個簡單的機器人正向模擬模組。

1 目標

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

  • 載入機器人模型後,在左側的目錄樹裡面顯示機器人模型的名稱
  • 在目錄樹中選中機器人節點後,在右側的屬性面板中顯示機器人的配置引數
  • 修改機器人的關節引數,更新機器人模型,實現正向模擬

2 整體設計

總體上採用外掛機制,即機器人模組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/

希望本文可以對大家開發機器人應用有所啟發~