.NET6: 開發基於WPF的摩登三維工業軟體 (10) - 機器人
阿新 • • 發佈:2022-03-20
基於前文介紹的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/
希望本文可以對大家開發機器人應用有所啟發~