该博客主要记录PX4开发中遇到的一些问题以及解决方法,作为自己的笔记保留下来,每有新问题都会作记录,实时更新。
其实也不止这种错误,只要你发现仿真后,出现各种飞控初始化数据类型的报错(其他例子FCU: Preflight Fail: Baro Sensor #0 missing;takeoff altitude low …)。那我们都可以尝试输入下列命令,见电脑存储的仿真参数清空。然后我们再重新启动仿真,那么大概率问题就解决了。
rm ~/.ros/eeprom/parameters*
rm -rf ~/.ros/sitl*
在PX4与机载电脑通讯时,采用的是mavlink协议的数据,有时我们需要一些特定的数据,或者对其发布频率有要求。举个例子:在VINS使用飞控IMU数据时,我们需要ATTITUDE_QUATERNION
和HIGHRES_IMU
的数据达到200hz。得益于PX4架构的先进性,我们可以用如下方法简单的实现。
取出飞控SD卡,插入读卡器,使用电脑在该SD卡中创建etc文件夹。在该文件夹下,我们创建extras.txt文件,在里面输入如下内容(这一部是要提高飞控mavlink传输的频率,用于VINS,如果不更改其默认频率只有50hz,在VINS里是不够用的)
mavlink stream -d /dev/ttyACM0 -s ATTITUDE_QUATERNION -r 200
mavlink stream -d /dev/ttyACM0 -s HIGHRES_IMU -r 200
mavlink作为PX4中的一个顶层应用,它的具体用法,我们可以进入MAVLink console来查看:
当然需要注意的是上述设置输出的对应硬件设备是USB口。如果需要其他的设备输出那么我们需要注意设备名正确。
PX4中的usb和串口的设备名称,可以从硬件手册以及启动脚本中得到,如下图所示:
# start MAVLink on the USB port
mavlink start -d /dev/ttyACM0
所以如果我们想使用别的端口输出相应的数据,只要更改正确的device 名称即可,for example:
mavlink stream -d /dev/ttyS1 -s ATTITUDE_QUATERNION -r 50
这样以来TELEM1口就可以输出ATTITUDE_QUATERNION
的数据了,没有设置前是不会有的。不过需要的注意的一点是,TELEM1默认的baudrate为57600,传输速率为1200,这样的速度实际是不够的,其后果就是ATTITUDE_QUATERNION
和HIGHRES_IMU
的发布频率会远低于50hz,大概就只有15hz左右。
对此我们需要作如下参数修改,提高通信速度(注意!我这里的修改是针对TELEM1的,其串口的类似)
parameters | vulue | meaning |
---|---|---|
SER_TEL1_BAUD | 115200 | 波特率设置 |
MAV_0_RATE | 0 | 自动调整为当前baudrate理论最大传输速度的一半 |
最后需要说明的是,如果没有什么特别情况,飞控与机载电脑的连接还是最推荐用usb口连接,在PX4中usb对应的设备名称为/dev/tyyACM0,作为更高级的接口,它的传输速度和稳定性都高于一般的串口。而且对usb的虚拟串口进行连接时,其baudrate是可以自适应的,你随便给个baudrate都可以连接,不用去修改飞控参数。
最近再用两款硬件,一个是pixhawk4 mini,一个是cuav的nano。然后发现sbus信号不管插nano的sbus信号口,还是插入RC口都是可以识别信号的。结果在pixhawk4 mini下就只能在sbus口下插入可以识别,标注的那个ppm口就不行了。其实这看起来并没有什么,根据接口的标识这是理所应当的。不过,我还是很好奇为啥。于是我去看了看硬件的原理的图,pixhawk4 mini的原理图没有,但是nano的原理图很清楚:
可以看到,RC_IN的接口在连线上与PPM和SBUS的接在了一起,所以RC口就成为了一个多用的信号接口。想来pixhawk4 mini的硬件设计必然没有这个连接,所以就各司其职,没有啥关系了。不过顺便一提的是在ardupilot的代码中,是可以采用电平信号的捕捉,只用一个引脚就实现所有输入信号的识别。
老实说这里这样的设计其实对用户并不太重要,只要能识别输入就ok了,不过好奇心又让我费了一些时间。
eg:
/**
* Roll P gain
*
* Roll proportional gain, i.e. desired angular speed in rad/s for error 1 rad.
*
* @min 0.0
* @max 12
* @decimal 2
* @increment 0.1
* @group Multicopter Attitude Control
*/
PARAM_DEFINE_FLOAT(MC_ROLL_P, 6.5f); //so 6.5f? what does it mean? the default vuale? I guess so
定义的函数中,第一个为参数名称(地面显示出来的名称),第二个为默认参数(int类型参数值后面不用跟f,float类型的需要跟f)。
对于四旋翼而言,目前穿越机是非常流行的,相应的硬件也是非常的丰富和便宜。这对于我们搭建自己的四旋翼无人机来进行研究是非常方便的。不过对于4IN1电调来说,它的电机顺序定义一般是betaflight的顺序和PX4不太一样。如下图所示,左边是betaflight的默认顺序,右边是PX4的默认顺序。但是PX4中我们可以修改参数来很快的适配,装飞控的时候可以直接把4IN1的电调按照它的信号线序和飞控的main_out线序一一对应即可(即电调信号1对应飞控main输出1,电调信号2对应飞控main输出2…)而不用自己去看PX4机型输出的定义来手动完成整个对应关系了。
最近在学习和实践PX4代码中的混控器部分,找到了一些好帖子,兴致冲冲的跟着做,最后发现==“AUX"==没有按照我在sd卡里设置的混空器那样去执行。找了一晚上原因,终于!我在官方手册的nano的说明部分发现了下图。啊这!如果这几个引脚不是取名为A1,A2,A3的话,我想我可能早就察觉到了不对劲了,这实在太坑了,记录一下,避免以后再犯这样的错误!那么同样pixhawk4 mini 上面的4个cap口,PX4目前也是不能用的了。这样一看ardupilot果然是猛呀,支持的功能确实是多。
gazebo会出现不识别系统的提示,如下所示:
raise OsNotDetected("Could not detect OS, tried %s" % attempted)
rospkg.os_detect.OsNotDetected: Could not detect OS, tried ['zorin', 'windows', 'nixos', 'clearlinux', 'ubuntu', 'slackware', 'rocky', 'rhel', 'qnx', 'pop', 'osx', 'sailfishos', 'tizen', 'oracle', 'opensuse', 'opensuse', 'opensuse', 'opensuse', 'opensuse', 'openembedded', 'neon', 'mx', 'mint', 'linaro', 'gentoo', 'funtoo', 'freebsd', 'fedora', 'elementary', 'elementary', 'debian', 'cygwin', 'euleros', 'centos', 'manjaro', 'buildroot', 'arch', 'amazon', 'alpine', 'almalinux']
但是由于这部分报错的提示终端中并没有以红色打印出来,而是常规的字体颜色,这导致很容易让人忽略这个关键信息。一般发生这种情况还会伴随着下图所示的报错提示:
这次检查一下:/etc/lsb-release,你会惊讶地发现怎么变成了Kylin?我明明是ubuntu呀?那么很有可能是你最近安装的一些.deb是来自于kylin的,比如微信。
DISTRIB_ID=Kylin
DISTRIB_RELEASE=V10
DISTRIB_CODENAME=kylin
DISTRIB_DESCRIPTION="Kylin V10 SP1"
DISTRIB_KYLIN_RELEASE=V10
DISTRIB_VERSION_TYPE=enterprise
DISTRIB_VERSION_MODE=normal
那么我们将他们更改成如下内容并保存(我这里是18.04.6)
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"
然后重启电脑即可生效
在~/.gazebo/gui.ini文件中删除内容后,重新打开gazebo即可