以下内容针对px4 v1.11.3(2021.01)

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的程序FlightTaskOffborad.cpp、px4中的飞行模式管理器FlightModeMannager.cpp,px4接受mavlink指令的mavlink_receiver.cpp。px4中类似ros的话题发布方式,FlightModeMannager.cpp中通过选择飞行模式获取mavlink_receiver得到的setpoint通过_trajectory_setpoint_pub.publish(setpoint)发布,MulticopterPositionControl.cpp中通过_trajectory_setpoint_sub.update(&_setpoint)来接受setpint并给PositionControl.cpp中的控制环使用。

总结出了以下规律:

1、如果同时有位置、速度、加速度中至少两项指令给出,那么后者是前馈项。比如同时给出位置和加速度指令,那么加速度指令是前馈项。毕竟px4是位置-速度-加速度-角度-角速度-推力这样的串级控制。位置环是P控制,输出指令速度到速度环,速度环是PID控制,输出指令加速度,加速度再转化为四元数和推力给出角度指令到角度环,角度环是P控制,输出角速度指令到角速度环,角速度环又是PID控制来响应指令角速度。

2、要查看串级控制中每一级的px4响应值,可以在mavros的/mavros/setpoint_raw/target_local话题中查看。可以看到,如果只给位置指令,那么position就是给定的值,velocity和acc虽然没给,但是仍然有变化的值,这是因为他们是上级串级控制的输出。如果只给了速度指令,可以看到position就是NaN,表示没值,velocity是给定值,acc是上级的控制输出。

3、我阅读的是v1.11.3版本的代码但最近发现在2021.04最新代码v1.12.0beta3中对offboard模式进行了大修,删除了FlightTaskOffborad.cpp和flight_mode_managers/tasks中的offboard模式(改为如果是offboard模式,直接在mavlink_receiver.cpp中用_trajectory_setpoint_pub.publish(setpoint)发布setpoint,绕开了FlightModeManager,px4的github中的PR是#16869)。同时#16869还规范了mavlink_receiver.cpp中接受setpoint的掩码,谁被掩谁就是NaN,谁没被掩谁就被px4接受为setpoint。v1.12.03-beta3中mavlink_receiver.cpp代码如下:

用&按位与来读取type_mask掩码,然后如果是offboard模式,直接通过_trajectory_setpoint_pub发送setpoint给MulticopterPositionControl.cpp,绕过了FlightModeMannager.cpp。不再是mavlink_receiver先发给FlightTaskOffborad.cpp,再由FlightModeMannager.cpp通过_trajectory_setpoint_pub发布给MulticopterPositionControl.cpp。

但就v1.11.3来说,掩码的使用还并不规范,并不是掩了就一定不接收,不掩就一定被接收,整个offboard下的接收setpoint是比较混乱的。可行的组合如下:

  • 单独的p、v、acc是没问题的,但是要求x、y、z方向的同时给出。acc是转化为了四元数和归一化油门(读PositionControl.cpp,由悬停油门线性化估计)。给p、v时10-20Hz就行,给加速度或者角度时需要50-100Hz,否则不会按照期望的加速度来飞行的!
  • p全给+v全给、pz+v全给。全给指x、y、z同时给出。总之v必须全给,如果不想给,就给前馈0。这其实是v1.11.3中mavlink_receiver.cpp和FlightTaskOffborad.cpp中掩码判断不对导致的。
  • p全给+a全给、pz+a全给。总之a必须全给,如果不想给,就给前馈0。和v类似。反正高度环和yaw、yaw_rate是单独控制的,可以组合,但是x、y必须同时给出,有时也会影响到z。
  • p全给+v全给+a全给。

除了这些组合,其他组合的/mavros/setpoint_raw掩码在v1.11.3都是不行的!典型的错误:pz+vx+vy(少了vz)。话说这些组合完全够用了呀,不需要的前馈就给0就行。

yaw,yaw_rate都是单独给,可給可不给。都不给好像也没事,就是按照当前yaw来控制,但是yaw会变动,不能保证是定值。

在v1.11.3中都试过以上组合,都没问题的,v1.12.0中当然更没有问题。注意都是给的local坐标系下的值,body系下组合可能又不一样了,global系我也没研究。mavros可能也会把body系的值转化到local系下发送给px4,但px4其实本身也能接受body系下的值。

PX4 offboard模式能接收的mavros指令相关推荐

  1. PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https://docs.px4.io/main/zh/ros/mavros_offboard_cpp.html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 ...

  2. PX4位置控制offboard模式说明

    offboard模式的开发及应用 一.px4固件的模式 px4固件支持10几种飞行模式,从代码结构上分析,分为基本模式.自定义模式和自定义子模式. 1.基本模式 基本模式又分为,位置控制模式.自稳模式 ...

  3. 在PX4中如何使用offboard模式以及对c_uart_interface_example程序的分析

        c_uart_interface_example是mavlink团队提供的一个演示如何用c语言调用mavlink API对飞机做offboard控制的例子程序,这个程序写的挺漂亮的,但是,新的 ...

  4. PX4代码学习系列博客(6)——offboard模式位置控制代码分析(之前转载过,这是第二次转载了)

    我刚刚发现这篇文章去年八月份的时候转载过一次了 https://blog.csdn.net/sinat_16643223/article/details/107874349 转载自:https://b ...

  5. GAAS 无人机自动驾驶学习(01-使用机载电脑,通过OFFBOARD模式进行控制飞行)

    原文网址:https://gaas.gitbook.io/guide/wu-ren-ji-zi-dong-jia-shi-xi-lie-offboard-kong-zhi-yi-ji-gazebo-f ...

  6. PX4飞行模式-多旋翼

    手动模式 (1)ARCO:特技模式 遥控器输入被转换为横滚.俯仰和偏航速度,当摇杆回中时飞行器不会保持平衡,可以用于翻滚等特技飞行. (2)RATTITUDE:角速率模式 遥控器输入在极限区域被转换为 ...

  7. Jetson的mavros使用offboard模式,终端按键控制无人机飞行

    基于Promethues根据wiki配置好之后可以实现使用终端控制,起飞:降落:前后左右飞行:上升下降左转右转: 开始我基于仿真测试实机不成功,是因为某个运行节点没有打开,仔细看gazebo.laun ...

  8. PX4实战之旅(三):通过OFFBOARD模式控制无人机自主飞行

    文章目录 前言 一.添加自定义模块 二.测试 前言 固件:PX4 1.13.1 一.添加自定义模块 在PX4-Autopilot/src/modules目录下新建control_node文件夹 在co ...

  9. PX4学习(1)——PX4固件版本开发环境(ROS+mavros版本)

    参考px4官网流程: https://dev.px4.io/en/setup/dev_env_linux_ubuntu.html https://dev.px4.io/en/setup/buildin ...

最新文章

  1. 女生参加软件测试培训合适吗
  2. hdu 4983(欧拉函数)
  3. 由一个小库存软件想到的
  4. Boost::context模块callcc的无限循环测试程序
  5. HDFS/zookeeper/hbase初始化
  6. Qt 学习之路 :Qt 线程相关类
  7. JavaScript 详解:为什么写好的代码非常重要
  8. 7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句、事物处理语句和游标属性
  9. vscode-go 插件安装
  10. 印度成不了下一个世界工厂,越南才可能
  11. abb变频器580系列改中文,ACS580变频器参数设置.pdf
  12. 麦咖啡MACfEE服务器安全防护设置技巧!
  13. 回顾·神马搜索技术演进之路
  14. 排序算法lowb三人组-冒泡排序
  15. python编程长方形面积公式_求长方形面积-题解(Java代码)
  16. 吉首 - 傻鸡抓大闸蟹
  17. PHP独立ip统计,通过nginx日志统计独立ip的个数 新乡独立ip 独立ipvps 独立公网i
  18. 微信小程序云函数NodeJs如何等待两次异步操作后返回数据给前端
  19. EOS核心仲裁论坛 | 保障你财产安全的应急措施
  20. Python Selenium3.141+Win7(64位)+IEDriverServer(32位版本)+调用IE11卡死的解决

热门文章

  1. 参考文献格式(纸质及电子)
  2. PNP与NPN三极管
  3. Nginx的基本匹配规则与配置.m3u8视频源
  4. c语言中可以在函数内改变全局变量的值
  5. 未来一线城市哪个房价最高?
  6. 回顾iPhone十年:它是如何颠覆行业并改变世界的?
  7. 萨塞克斯大学计算机专业,萨塞克斯大学计算机与数字媒体硕士专业.pdf
  8. 改善电流不匹配的级联电流镜布局设计 2002
  9. PNAS:人类、非人灵长类动物和小鼠的大脑皮层折叠、分割和连通性
  10. U盘写入速度变慢的解决方法