1. PX4无人机键盘控制基础
键盘控制是PX4无人机开发中最基础的交互方式之一,特别适合在仿真环境中快速验证控制逻辑。我刚开始接触PX4时,第一个成功跑通的例子就是通过键盘控制Gazebo中的无人机起飞和悬停。这里分享几个关键要点:
核心通信机制是通过MAVROS的/mavros/setpoint_velocity/cmd_vel_unstamped话题发送Twist消息,控制XYZ三个方向的速度。实测发现,PX4对消息频率有严格要求——必须稳定在2Hz以上才能维持Offboard模式。我建议用20Hz的发布频率,这样既能满足要求又不会给系统带来太大负担。
键盘控制的典型代码结构包含三个关键部分:
- 终端设置(处理键盘输入的非阻塞读取)
- 键值映射(将按键转换为速度指令)
- MAVROS接口(模式切换/解锁/指令发布)
# 键值映射示例(部分) moveBindings = { 'i': (1, 0, 0), # 前进 ',': (-1, 0, 0), # 后退 'j': (0, 0, 1), # 左转 'l': (0, 0, -1) # 右转 }实际开发中容易踩的坑是模式切换顺序。正确的流程应该是:
- 先切换到Offboard模式(按键5)
- 再解锁(按键6)
- 最后起飞(按键7)
我第一次实验时顺序搞反了,导致无人机解锁后直接进入定高模式,Offboard指令完全失效。后来查文档才发现,PX4对模式切换有严格的状态机校验。
2. Offboard模式深度解析
Offboard模式是PX4最强大的功能之一,它允许外部系统通过MAVLink或ROS消息完全控制无人机。根据PX4官方文档,这个模式下可以发送六种类型的控制指令:
| 控制类型 | 对应消息 | 适用场景 |
|---|---|---|
| 位置 | TrajectorySetpoint | 精准定点 |
| 速度 | TrajectorySetpoint | 平滑移动 |
| 加速度 | TrajectorySetpoint | 动态避障 |
| 姿态 | VehicleAttitudeSetpoint | 特技飞行 |
| 角速率 | VehicleRatesSetpoint | 快速转向 |
| 推力/力矩 | VehicleThrustSetpoint | 底层控制 |
心跳机制是Offboard的核心安全设计。PX4要求必须持续收到2Hz以上的控制指令,否则会自动切换回Hold模式。我在实机测试时遇到过因为WiFi延迟导致指令中断,无人机突然悬停的情况。后来改用有线连接和心跳监测线程才解决这个问题。
通信协议方面,ROS 2使用的是px4_msgs/msg/OffboardControlMode消息,而ROS 1通过MAVROS的/mavros/setpoint_raw/local话题。实测发现ROS 2的吞吐量更高,但ROS 1的生态更成熟。新手建议从MAVROS开始,等熟悉后再迁移到ROS 2。
3. 从键盘控制到Offboard的进阶
将简单的键盘控制升级为完整的Offboard系统需要解决几个关键问题:
指令平滑处理直接关系到飞行稳定性。原始键盘控制是阶跃式指令,会导致无人机急停急启。我的改进方案是加入指数平滑滤波:
# 速度平滑处理示例 target_speed = speed * x # 目标速度 if target_speed > control_speed: control_speed = min(target_speed, control_speed + 0.1) elif target_speed < control_speed: control_speed = max(target_speed, control_speed - 0.1)坐标系转换是另一个易错点。键盘输入的指令通常是机体坐标系(BODY_FRAME),而Offboard模式默认使用局部坐标系(LOCAL_FRAME)。需要根据当前偏航角进行转换:
# 机体转局部坐标系 twist.linear.x = control_speed * math.cos(yaw_rad) twist.linear.y = control_speed * math.sin(yaw_rad)对于实机操作,我强烈建议加入安全校验逻辑:
- 检查GPS定位质量
- 设置最大速度限制
- 添加紧急停止开关
- 实现自动返航触发条件
4. 实机操作注意事项
当代码移植到Pixhawk 6C等真实飞控时,会遇到仿真中不存在的挑战。根据我的踩坑经验,这几个问题最值得关注:
硬件连接方面,必须确保:
- 使用带屏蔽的USB线或数传电台
- 避免将机载电脑与飞控共地
- 给机载电脑配置独立电源
- 所有连接器做好防松处理
参数配置需要特别调整这几个关键参数:
COM_RC_LOSS_T = 0 # 禁用遥控器失效保护 NAV_RCL_ACT = 0 # 禁用遥控器丢失动作 MIS_TAKEOFF_ALT = 3.0 # 设置默认起飞高度飞行前检查表应该包括:
- 校准所有传感器(加速度计、磁罗盘、陀螺仪)
- 测试失控保护触发逻辑
- 确认电池电量充足
- 检查螺旋桨安装方向
- 验证GPS锁定状态
遇到Offboard模式无法解锁时,建议按这个流程排查:
- 检查
mavros/state的connected字段 - 确认
mavros/setpoint_raw/local的发布频率 - 查看QGC的飞行模式提示
- 检查飞控状态灯颜色
- 分析
mavros/statustext的警告信息
记得第一次室外测试时,因为没注意到GPS信号弱,无人机刚起飞就进入失效保护模式。后来养成了在代码中加入current_state.gps_fix检查的习惯。