px4 offboard模式下可以接收上位机发送来的setpoint值,可以利用ROS包mavros来发送这些setpoint(期望值)。
ps: 如果只是要用上位机发送消息来切换px4模式、解锁等,不需要切换到offboard模式,因为上位机也是利用mavlink给px4发送这些指令,和地面站发送指令是一样的。
本文暂时只讨论mavros中的/mavros/setpoint_raw/local话题,这个话题可以同时发送位置、速度、“加速度”指令,如果要发送姿态角和油门指令还是要用/mavros/setpoint_raw/attitude之类的话题。
那么困扰我很久的问题是:setpoint_raw话题到底能同时发送哪些指令?位置速度能同时发送吗?所谓的加速度指令又是什么呢?
为了解决这些问题,我深入阅读了px4源码中位置环控制程序PositionControl.cpp和offboard模式接收setpoint的程序,总结出了以下规律:
1、如果同时有位置、速度、加速度中至少两项指令给出,那么后者是前馈项。比如同时给出位置和加速度指令,那么加速度指令是前馈项。毕竟px4是位置-速度-加速度-角度-角速度-推力这样的串级控制。位置环是P控制,输出指令速度到速度环,速度环是PID控制,输出指令加速度,加速度再转化为四元数和推力给出角度指令到角度环,角度环是P控制,输出角速度指令到角速度环,角速度环又是PID控制来响应指令角速度。
2、要查看串级控制中每一级的px4响应值,可以在mavros的/mavros/setpoint_raw/target_local话题中查看。可以看到,如果只给位置指令,那么position就是给定的值,velocity和acc虽然没给,但是仍然有变化的值,这是因为他们是上级串级控制的输出。如果只给了速度指令,可以看到position就是NaN,表示没值,velocity是给定值,acc是上级的控制输出。
3、