自己拼一架无人机
需要:uBotAerial 0.1.x(含依赖 uBotCore),并启用引擎插件 EnhancedInput
用插件的组件把任意 Pawn 拼成一架无人机,并用转子布局核对桨叶的位置和机架一致。
最简单的办法是复制一个示例蓝图再改,见 示例无人机与试飞关卡。从零拼时,转子布局告诉你每个电机在哪、往哪个方向转:
连线:
- Event BeginPlay 的 执行,连到 For Each Loop 的 Exec
- Movement 的 Movement,连到 Get Rotor Layout 的 Target
- Get Rotor Layout 的 Positions Meters,连到 For Each Loop 的 Array
- For Each Loop 的 Loop Body,连到 Print String 的 执行
- For Each Loop 的 Array Element,连到 To String (Vector) 的 In Vec
- To String (Vector) 的 Return Value,连到 Print String 的 In String
Event BeginPlay
UE 引擎 · 中文界面:事件开始运行
Event when play begins for this actor.
输出
- 执行
查看参考AActor.ReceiveBeginPlay
Movement
组件或变量引用。在 Components 面板里把 Movement 拖进事件图即可得到它。
输出
- Movement
uBot Multirotor Movement对象引用
Get Rotor Layout
Target is uBot Multirotor Movement · UBotAerial
按电机顺序返回转子的位置(机体坐标系,单位 m,UE 轴)和旋转方向。默认是臂长 0.225 m 的四旋翼 X 型,按 PX4 顺序:右前、左后、左前、右后。把每个 uBot Rotor 放在对应 Rotor Index 的位置上;开始游玩时转子从这里取旋转方向。
输入
- Target
uBot Multirotor Movement对象引用
输出
- Positions Meters
Vector数组 - Spin Directions
EUBot Rotor Spin Direction枚举数组
查看参考UUBotMultirotorMovementComponent.GetRotorLayout
For Each Loop
UE 引擎
ForEachLoop instance
输入
- Exec
- Array
Wildcard数组
输出
- Loop Body
- Array Element
Wildcard - Array Index
Integer - Completed
查看参考Macro:ForEachLoop
To String (Vector)
UE 引擎 · 中文界面:到字符串(向量)
Converts a vector value to a string, in the form 'X= Y= Z='
输入
- In Vec
Vector
输出
- Return Value
String
查看参考UKismetStringLibrary.Conv_VectorToString
Print String
UE 引擎 · 中文界面:打印字符串
Prints a string to the log, and optionally, to the screen If Print To Log is true, it will be visible in the Output Log window. Otherwise it will be logged only as 'Verbose', so it generally won't show up.
输入
- 执行
- In String
String - Print to Screen
Boolean - Print to Log
Boolean - Text Color
Linear Color结构体 - Duration
Float - Key
Name
输出
- 执行
查看参考UKismetSystemLibrary.PrintString
-
新建 Pawn
新建一个 Pawn 蓝图。根组件用一个碰撞形状(Box、Sphere 或 Capsule):飞行模型每步扫掠的就是根组件的形状。用键盘或手柄飞时必须是 Pawn,见第 4 步。
示例的根组件是
CollisionBox,在「Details」面板的Box Extent里设半尺寸:
-
加飞行模型
添加
uBot Simple Flight(导航)或uBot Multirotor Dynamics(物理),重命名为Movement。它以根组件为Updated Component,不用另外指定。Visual Component只有uBot Simple Flight有:要让外观倾斜,把它指向要倾斜的 Scene 组件。uBot Multirotor Dynamics没有这个属性,物理无人机是根组件自己倾斜。 -
加桨叶(可选)
添加
uBot Rotor组件,Rotor Index设为电机序号,放在Get Rotor Layout返回的位置乘 100 cm 处,相对根组件。旋向在BeginPlay时按机架自动设置,「Details」里只读。
编辑器里
Spin Direction显示的是默认值Clockwise,不是最终的旋向。开始运行时,飞行模型按机架给它设置旋向,例如Rotor0实际是逆时针。 -
加手动输入、身份和相机(可选)
添加
uBot Multirotor Manual Input用键盘和手柄飞,它只在 Pawn 上起作用:Owner 不是 Pawn 时,BeginPlay直接返回,也不打警告。添加uBot Identity设置机器人 ID 和 ROS 命名空间,添加弹簧臂相机。相机的弹簧臂要关掉Inherit Pitch和Inherit Roll,视角才不会随机体倾斜。
| 属性或节点 | 说明 |
|---|---|
Rotor Index(uBot Rotor) |
这个桨叶跟随的电机序号,按机架转子的顺序 |
Visual Spin Scale(uBot Rotor) |
显示转速相对真实转速的比例,默认 0.04,避免在帧率下混叠 |
Airframe(uBot Multirotor Dynamics) |
机架:质量、转动惯量、阻力系数和每个转子的位置、旋向、推力系数 |
Make Quad X Airframe |
按臂长(m)和质量(kg)生成四旋翼 X 机架,转动惯量按(质量 / 1.5)×(臂长 / 0.225)² 缩放,其余参数保持默认 |
Get Rotor Layout |
返回按电机序号排列的转子位置(m,机体系,UE 轴)和旋向 |
默认机架的臂长是 0.225 m,转子位于 (±D, ±D),D = 0.225 / √2 ≈ 0.159 m。机体受到与转子旋向相反的反扭矩。
Get Rotor Speed 返回一个 uBot Rotor 当前的转速(rad/s)。物理无人机的转子转速也在 Get Multirotor State 的 Rotor Speeds Radians Per Second 里。
- 物理级机架里转子的位置要和模型的电机位置一致。示例用的是模型实测的位置,相对根组件为 (±14.53, ±17.08, 4.75) cm,换成别的模型时要重新量。
- 机架无效(质量或转动惯量不为正、没有转子、转子不产生推力)时,日志报错,并改用默认机架。
- 改
Airframe后,在下一次Reset Flight生效。但机架有效性检查和uBot Rotor的旋向只在BeginPlay时设置,Reset Flight之后不会重新检查或设置。
- uBot Rotor:桨叶组件的属性。
- uBot Multirotor Library:
Make Quad X Airframe。 - uBot Multirotor Movement:
Get Rotor Layout和共有属性。