物理无人机的指令与控制模式
需要:uBotAerial 0.1.x(含依赖 uBotCore),并启用引擎插件 EnhancedInput
了解物理无人机(uBot Multirotor Dynamics)接收速度、姿态、角速度和单电机四种指令,控制模式怎样切换,以及指令中断时它怎样处理。
下面给无人机发一条姿态指令:横滚 10°,不给推力,高度由无人机自己保持:
连线:
- Find Multirotor Movement 的 Return Value,连到 Apply Attitude Command 的 Target
- Make Rotator 的 Return Value,连到 ToQuaternion (Rotator) 的 In Rot
- ToQuaternion (Rotator) 的 Return Value,连到 Make UBot Attitude Command 的 Orientation
- Make UBot Attitude Command 的 UBot Attitude Command,连到 Apply Attitude Command 的 Command
- 姿态是机体到世界的四元数。
Use Thrust为 false 时按Vertical Velocity Meters Per Second飞爬升率,0 表示保持高度。
Find Multirotor Movement
uBot Multirotor Library · UBotAerial
返回 Actor 上的多旋翼运动组件(第一个),没有则为空。
输入
- Actor
Actor对象引用
输出
- Return Value
uBot Multirotor Movement对象引用
查看参考UUBotMultirotorLibrary.FindMultirotorMovement
Make Rotator
UE 引擎 · 中文界面:创建旋转体
Makes a rotator {Roll, Pitch, Yaw} from rotation values supplied in degrees
输入
- X (Roll)
Float - Y (Pitch)
Float - Z (Yaw)
Float
输出
- Return Value
Rotator
查看参考UKismetMathLibrary.MakeRotator
ToQuaternion (Rotator)
UE 引擎 · 中文界面:ToQuaternion(旋转体)
Converts to Quaternion representation of this Rotator.
输入
- In Rot
Rotator
输出
- Return Value
Quat结构体
查看参考UKismetMathLibrary.Conv_RotatorToQuaternion
Make UBot Attitude Command
UBotCore
用姿态、推力、偏航角速度、时间戳和来源等字段构造一个 UBot Attitude Command。
输入
- Orientation
Quat结构体 - Use Yaw Rate
Boolean - Yaw Rate Radians Per Second
Float (double) - Use Thrust
Boolean - Normalized Thrust
Float (double) - Vertical Velocity Meters Per Second
Float (double) - Timestamp Seconds
Float (double) - Source
Name
输出
- UBot Attitude Command
UBot Attitude Command结构体
查看参考Make:FUBotAttitudeCommand
Apply Attitude Command
Target is UBot Attitude Commandable · UBotCore
应用一条姿态指令。指令被拒绝时(没有就绪、飞行器不接受、数值无效等)返回 false。
输入
- 执行
- Target
UBot Attitude Commandable接口 - Command
UBot Attitude Command结构体
输出
- 执行
- Return Value
Boolean
查看参考UUBotAttitudeCommandable.ApplyAttitudeCommand
-
选无人机
用
BP_UBotPhysicsDrone(四种指令都接受)或BP_UBotBareAirframeDrone(只接受角速度和单电机指令),见 示例无人机与试飞关卡。 -
取得
Movement用
Find Multirotor Movement取得Movement组件,对它调用接口函数,类别是uBot|Actuation。 -
发指令
四种指令各用一个函数;返回
false表示被拒绝,见下面的“注意事项”。 -
不再发送时释放
对姿态、角速度指令调用
Release Attitude Command,对电机指令调用Release Motor Command,无人机按Command Loss Action处理。
最近一次被接受的指令决定当前控制模式,Get Active Control Mode 读取它。开始时无人机在 Velocity 模式下悬停:
| 模式 | 指令 | 内容 |
|---|---|---|
Velocity |
UBot Velocity Command |
航向系线速度加偏航角速度,按 Velocity Limits 截断;悬停和 Land 也是这个模式的设定值 |
Attitude |
UBot Attitude Command |
目标姿态(机体到世界);Use Yaw Rate 时航向按偏航角速度转动 |
BodyRate |
UBot Body Rate Command |
机体系目标角速度(rad/s,UE 旋向:+Z 向右偏航),不截断 |
Motor |
UBot Motor Command |
每个电机一个值,不经过飞控 |
姿态和角速度指令的推力有两种给法:Use Thrust 为 true 时用 Normalized Thrust(0 到 1,最大总推力的比例),否则按 Vertical Velocity Meters Per Second 飞爬升率,0 保持高度。
电机指令的 Type 是 Normalized(0 到 1)或 AngularVelocity(rad/s)。Normalized 默认是推力比例:转速 = 最大转速 × √指令(Motor Command Mapping 为 Thrust 时)。值的个数必须等于电机数(Get Motor Count,默认机架 4 个),按机架的电机顺序:PX4 四旋翼 X 里 0 右前、1 左后、2 左前、3 右后。
常用属性在 Movement 组件上,选中它就能在「Details」面板的 Dynamics 和 Multirotor 下找到:
| 属性 | 默认值 | 作用 |
|---|---|---|
Accept Velocity Commands 等四个 |
开 | 单独关闭某种指令,关闭后接口返回 false |
Command Loss Action |
Hover |
指令丢失时怎么做 |
Command Timeout Seconds |
0 s | 最后一条指令距今超过这么多仿真秒算丢失;0 表示不超时 |
Landing Speed Meters Per Second |
0.7 m/s | Land 时的下降速度 |
Physics Rate Hz |
1000 Hz | 每秒物理步数,范围 100 到 4000 Hz |

Command Loss Action 有三个取值:
| 取值 | 效果 |
|---|---|
Hover(默认) |
刹停并锁定位置,与 Stop Motion 相同 |
Land |
原地下降,被地面挡住后停在那里 |
CutMotors |
所有电机指令置 0,无人机下落 |
默认机架是 1.5 kg、轴距 450 mm 的四旋翼 X,最大总推力约为重量的 1.92 倍;机架参数在 Airframe 上,改动在下一次 Reset Flight 生效;Airframe 在 BeginPlay 时检查一次。其余属性见 uBot Multirotor Dynamics。
Get Multirotor State返回真值状态(SI 单位、UE 世界轴),含转子转速和比力。Get Last Motor Commands返回最近一次实际送给电机的指令。Get Hover Motor Command按工程的重力返回悬停所需的归一化电机指令(推力比例),默认机架约 0.52。
用它给四个电机发悬停指令:
连线:
- Movement 的 Movement,连到 Get Hover Motor Command 的 Target
- Movement 的 Movement,连到 Apply Motor Command 的 Target
- Get Hover Motor Command 的 Return Value,连到 Make Array 的 [ 0]
- Make Array 的 Array,连到 Make UBot Motor Command 的 Values
- Make UBot Motor Command 的 UBot Motor Command,连到 Apply Motor Command 的 Command
- 在节点上点「Add pin」加到 4 个输入,4 个都接
Get Hover Motor Command的返回值。
Movement
组件或变量引用。在 Components 面板里把 Movement 拖进事件图即可得到它。
输出
- Movement
uBot Multirotor Dynamics对象引用
Get Hover Motor Command
Target is uBot Multirotor Dynamics · UBotAerial
在当前机架和世界重力下保持水平悬停的归一化电机指令。
输入
- Target
uBot Multirotor Dynamics对象引用
输出
- Return Value
Float (double)
查看参考UUBotMultirotorDynamicsComponent.GetHoverMotorCommand
Make Array
UE 引擎 · 中文界面:创建数组
Create an array from a series of items.
输入
- [ 0]
Wildcard
输出
- Array
Wildcard数组
查看参考K2Node_MakeArray
Make UBot Motor Command
UBotCore
用值的含义、各电机的值、时间戳和来源构造一个 UBot Motor Command。
输入
- Type
EUBot Motor Command Type枚举 - Values
Float (double)数组 - Timestamp Seconds
Float (double) - Source
Name
输出
- UBot Motor Command
UBot Motor Command结构体
查看参考Make:FUBotMotorCommand
Apply Motor Command
Target is UBot Motor Commandable · UBotCore
应用一条电机指令。指令被拒绝时(值的个数不对、没有就绪、数值无效等)返回 false。
输入
- 执行
- Target
UBot Motor Commandable接口 - Command
UBot Motor Command结构体
输出
- 执行
- Return Value
Boolean
查看参考UUBotMotorCommandable.ApplyMotorCommand
- 指令被拒绝(返回
false)有四种情况:这种指令被Accept … Commands关闭,指令含 NaN 或非有限值,姿态四元数的长度接近 0(平方长度小于 0.01),或电机值的个数与电机数不一致。裸机级不接受速度和姿态指令。 Stop Motion总是刹停并锁定位置,不看Command Loss Action:水平速度低于 0.05 m/s 后,锁定当前的水平位置和高度。- 发零速度的速度指令只跟踪零速度,不锁定位置,风造成的位移不会被拉回。
- 用 uBotROS 下发指令时,它的组件自带 0.5 s 超时,超时后的处理按组件区分:
uBot ROS Velocity Command调用Stop Motion,刹停并锁定位置,不看Command Loss Action。uBot ROS Attitude Command和uBot ROS Motor Command调用Release Attitude Command或Release Motor Command,由Command Loss Action处理。
- uBot Multirotor Dynamics:全部节点和属性。
- UBot Attitude Commandable 和 UBot Motor Commandable:指令接口。
- 自己写飞控:用自己的控制器替换内置飞控。
- 从 ROS 2 发飞行指令:用 uBotROS 从 ROS 2 下发姿态、角速度和电机指令。