Ubuntu读取PixHawk硬件的IMU&GPS数据
简述上周做的工作一半都是摸索如何使用mavros话题读取到Pixhawk飞控的IMU和GPS数据,分别体现于mavros发布的两个话题/mavros/imu/data和/mavros/local_position/pose。我们跑仿真想要读取这两个数据确定挺简单的,直接订阅这两个话题即可;但是真到了硬件读取数据,总会遇到各种各样的问题。此文前半部分介绍IMU数据的读取,后半部分介绍GPS数据的读取(差别其实不大,分开叙述更有条理)。
几天的摸索浓缩为一篇文章,希望能够有更多的靓仔分享自己的经验,走过路过点个赞~
IMU数据 /imu/data
Tips:mavros发布的Imu数据主要有两个话题,/mavros/imu/data_raw和/mavros/imu/data。二者的区别在于,后者的数据中有px4自行生成的四元数数据,通过解算四元数数据我们可以获取到姿态角。只不过我的测试结果显示,imu解算得到的姿态角漂移很大。
万事开头难,最近需要读取PixHawk2.4.8飞控的imu数据,用于cartographer的3D建图(把飞控当做IMU使用),结果连接上电脑一直没数据。也就是运行roslaunch mavros px4.launch之后,一直卡在 MAVROS started这里,如下图。
最终成功获取到IMU数据的解决方案:引出飞控上的TELEM2端口,并通过USB转TTL模块连接电脑。我最开始一直是使用飞控的micro-USB端口连接电脑,但是穷尽各种方法也都未能成功获取IMU以及其他数据(探索出来一个奇怪的方式,后文叙述)。
Pixhawk飞控上面有5个串口,分别为TELEM1、TELEM2、SERIAL4/5和micro-USB。其中TELEM1和TELEM2处的接线线序是相同的。一般而言,TELEM1连接数传模块,TELEM2连接外部计算机,而SERIAL 4/5则连接外部传感器。搭好飞机后,一般都通过micro-USB端口连接QGC进行传感器、遥控器校准、参数设置等操作(新版本的Pixhawk飞控是type-C端口)。所以,我选择TELEM2连接我的笔记本,并由此获取飞控的数据。当然,使用TELEM1和SERIAL4/5都是可以的。
1 硬件接线
我们需要将TELEM2端口通过USB转TTL连接到电脑,其接线如下图所示。TELEM2从上到下的线序为:GND、TXD、RXD、5V。GND往下的两根线不用接,更加详细的线序可以去参考官网的。
2 QGC设置参数
我们不但需要连接好硬件,还需要通过micro-USB连接QGC并设置一下对应的参数。我这里使用TELEM2连接我的笔记本电脑,需要设置的参数如下(使用TELEM1需要的设置不同)。可以在Parameters界面搜索需要设置的参数,参数设置完成后,需要重启才能生效。点击Parameters界面右上角的Tools,然后选择最下面的"Reboot Vehicle"。对于一个新购买的飞控,我们需要先对其进行Sensors的校准之后,才能够搜索到下面的参数。此外,需要设置完参数MAV_1_CONFIG并reboot之后,才可以搜索到另外两个参数。
[*]MAV_1_CONFIG:配置可以运行mavlink的端口,需要将其配置为TELEM2。reboot后,可见后面两个参数。
[*]SER_TEL2_BAUD:telem2的波特率,数值越大通信速率越快。默认为921600,但是如果你使用的USB转TTL的芯片为CH340,那么最大只能设置为115200,我上图中使用的便为CH340的串口芯片。其他的串口芯片或许可以支持921600,比如cp2102,试试就知道。
[*]MAV_1_MODE:设置为Onboard即可,默认也为Onboard。
MAV_1_RATE参数不需要修改,让他默认为0即可。
3 运行mavros
首先将USB转TTL连接到自己的笔记本USB端口,然后我们需要确认一下设备的名称。使用micro-USB连接笔记本的USB端口,对应的设备名称和这里不一样,一般为ttyACMO。可以通过如下方式确认设备名:
# 将USB转TTL连接USB端口
ls /dev/
# 将USB转TTL拔掉
ls /dev/然后我们找不同就行了,如下图就可以发现我们这个设备名称为ttyUSB0。
当然,其实我们是可以直接通过下面这个命令更方便的找到设备名的。如果检测不到类似名称的USB设备就会报错,如下图所示。
ls /dev/ttyUSB*
得知我们的USB设备名称/dev/ttyUSB0之后,便可以运行mavros了。
# 给端口加权限(可以不加)
sudo chmod 777 /dev/ttyUSB0
# 启动launch文件 后面的fcu_url很重要!
# fcu_url:="[设备名]:[波特率]" 需要对应修改
# 使用ch340芯片的 USB转TTL 设置波特率 115200
roslaunch mavros px4.launch fcu_url:="/dev/ttyUSB0:115200"
# 使用cp2102芯片的 UBS转TTL 设置波特率 921600
roslaunch mavros px4.launch fcu_url:="/dev/ttyUSB0:921600"
# 如果不想每次都加一个 fcu_url 可以编辑一下 px4.launch文件
cd /opt/ros/melodic/share/mavros/launch
sudo gedit px4.launch
# 对应修改之后,就可以不用加 fcu_url了
roslaunch mavros px4.launch之后,如果你前面设置的参数和启动launch文件时加的参数一致,那就能够成功连接pixhawk飞控。
此时,可以看看是否能够获取到IMU的数据。如果mavros卡在MAVROS started那里,是无法获取到IMU的数据的,经过rostopic list可以看见对应的话题。
rostopic echo /mavros/imu/data
这里拓展一个小知识点。我们可以把前面运行的px4.launch放到launch文件中,如下:
<include file=&#34;$(find mavros)/launch/px4.launch&#34;>
</include>4 Micro-USB连接Ubuntu
尽管尝试了很多的方法,最终还是未能直接通过micro-USB读取pixhawk飞控的IMU数据。不过依旧有一些内容值得记录一下。也方便后面对pixhawk飞控更加了解之后,得出相应的解决方案。如果通过micro-USB将飞控连接到Ubuntu,其设备名称默认为/dev/ttyACM0,可以使用前面提到的ls /dev/或者ls /dev/ttyACM*命令查询。QGC中暂未发现用于设置micro-USB的波特率等内容的参数,所以我尝试的内容主要就是围绕着运行mavros的那条指令。
# 围绕着这个
roslaunch mavros px4.launch fcu_url:=&#34;/dev/ttyACM0:[波特率]&#34;一个奇奇怪怪的,可以成功连接的方案为:先打开QGC连接上飞控,然后关闭QGC并运行roslaunch。之后基本上只要不动飞控连接到笔记本的USB端口,运行roslaunch都可以连接成功,并读取到IMU的数据。并且,波特率随便取,不管是设置为115200、921600还是57600都不影响连接。下面则是其他的一些尝试方案,最后都未成功(不借助QGC)。
1)修改fcu_url后面的波特率,115200、921600、57600都无效。
2)尝试修改启动的这个px4.launch文件:
cd /opt/ros/melodic/share/mavros/launch
sudo gedit px4.launch这个文件默认为下面的内容:
<launch>
<!-- vim: set ft=xml noet : -->
<!-- example launch script for PX4 based FCU&#39;s -->
<arg name=&#34;fcu_url&#34; default=&#34;/dev/ttyACM0:57600&#34; />
<arg name=&#34;gcs_url&#34; default=&#34;&#34; />
<arg name=&#34;tgt_system&#34; default=&#34;1&#34; />
<arg name=&#34;tgt_component&#34; default=&#34;1&#34; />
<arg name=&#34;log_output&#34; default=&#34;screen&#34; />
<arg name=&#34;fcu_protocol&#34; default=&#34;v2.0&#34; />
<arg name=&#34;respawn_mavros&#34; default=&#34;false&#34; />
<arg name=&#34;config_yaml&#34; default=&#34;$(find mavros)/launch/px4_config.yaml&#34; />
<include file=&#34;$(find mavros)/launch/node.launch&#34;>
<arg name=&#34;pluginlists_yaml&#34; value=&#34;$(find mavros)/launch/px4_pluginlists.yaml&#34; />
<arg name=&#34;config_yaml&#34; value=&#34;$(arg config_yaml)&#34; />
<arg name=&#34;fcu_url&#34; value=&#34;$(arg fcu_url)&#34; />
<arg name=&#34;gcs_url&#34; value=&#34;$(arg gcs_url)&#34; />
<arg name=&#34;tgt_system&#34; value=&#34;$(arg tgt_system)&#34; />
<arg name=&#34;tgt_component&#34; value=&#34;$(arg tgt_component)&#34; />
<arg name=&#34;log_output&#34; value=&#34;$(arg log_output)&#34; />
<arg name=&#34;fcu_protocol&#34; value=&#34;$(arg fcu_protocol)&#34; />
<arg name=&#34;respawn_mavros&#34; default=&#34;$(arg respawn_mavros)&#34; />
</include>
</launch>按照网上的一些教程,新增了关于 hearbeat的参数设置,无效:
<launch>
<!-- vim: set ft=xml noet : -->
<!-- example launch script for PX4 based FCU&#39;s -->
<arg name=&#34;fcu_url&#34; default=&#34;/dev/ttyACM0:57600&#34; />
<arg name=&#34;gcs_url&#34; default=&#34;&#34; />
<arg name=&#34;tgt_system&#34; default=&#34;1&#34; />
<arg name=&#34;tgt_component&#34; default=&#34;1&#34; />
<arg name=&#34;log_output&#34; default=&#34;screen&#34; />
<arg name=&#34;fcu_protocol&#34; default=&#34;v2.0&#34; />
<arg name=&#34;respawn_mavros&#34; default=&#34;false&#34; />
<arg name=&#34;config_yaml&#34; default=&#34;$(find mavros)/launch/px4_config.yaml&#34; />
<include file=&#34;$(find mavros)/launch/node.launch&#34;>
<arg name=&#34;pluginlists_yaml&#34; value=&#34;$(find mavros)/launch/px4_pluginlists.yaml&#34; />
<arg name=&#34;config_yaml&#34; value=&#34;$(arg config_yaml)&#34; />
<arg name=&#34;fcu_url&#34; value=&#34;$(arg fcu_url)&#34; />
<arg name=&#34;gcs_url&#34; value=&#34;$(arg gcs_url)&#34; />
<arg name=&#34;tgt_system&#34; value=&#34;$(arg tgt_system)&#34; />
<arg name=&#34;tgt_component&#34; value=&#34;$(arg tgt_component)&#34; />
<arg name=&#34;log_output&#34; value=&#34;$(arg log_output)&#34; />
<arg name=&#34;fcu_protocol&#34; value=&#34;$(arg fcu_protocol)&#34; />
<arg name=&#34;respawn_mavros&#34; default=&#34;$(arg respawn_mavros)&#34; />
<!-- enable heartbeat send and reduce timeout -->
<param name=&#34;conn_heartbeat&#34; value=&#34;5.0&#34; />
<param name=&#34;conn_timeout&#34; value=&#34;5.0&#34; />
<!-- automatically start mavlink on USB -->
<param name=&#34;startup_px4_usb_quirk&#34; value=&#34;true&#34; />
<param name=&#34;mocap/use_tf&#34; value=&#34;true&#34;/>
<param name=&#34;mocap/use_pose&#34; value=&#34;false&#34;/>
</include>
</launch>3)更改相同路径下的px4_config.yaml,将其中的heartbeat_rate修改为10,也还是无效。
5 提高IMU数据发布频率
参考:https://blog.csdn.net/sinat_16643223/article/details/114698028
有两个imu数据,/mavros/imu/data_raw和/mavros/imu/data,前者没有orientation数据,后者有。
# 查看话题的发布频率
rostopic hz /mavros/imu/data_raw
# 调整发布频率 /mavros/imu/data_raw100hz
rosrun mavros mavcmd long 511 105 10000 0 0 0 0 0
# 调整发布频率 /mavros/imu/data 100hz
rosrun mavros mavcmd long 511 31 10000 0 0 0 0 0
GPS数据 /local_position/pose
Tips:mavro中发布的global_postion和local_positon等相关的话题的数据,都是通过融合GPS数据获取得到的,所以获取到GPS数据是很重要的一步,最好去空旷的室外。其中的/mavros/local_position/pose发布的数据为以GPS上电时刻为原点而建立的NED坐标系的位置数据和四元数数据。(这里不对NED坐标系进行介绍)
只要能够成功建立与PX4飞控的连接,我们就可以获取到mavros发布的关于imu的数据,但是却不一定能够获取到/mavros/local_position/pose以及其他相关话题的数据。正如前面所说的,我们需要获取到GPS信号才可以,为此我们需要带着飞控和GPS到比较空旷的室外。然后,我们通过micro-USB将飞控连接QGC,多等一会。等到左上角搜索到的卫星数目大于等于6之后,便可以关闭QGC,然后尝试运行px4.launch文件,看看能否获取到数据,即rostopic echo /mavros/local_position/pose。要点就一个,到空旷的室外等!
一般情况下,就算卫星数目大于6他也不一定能获取到gps数据,需要多等一会。我这几天每次获取到GPS数据,都等了一二十分钟以上。如果开着QGC,运行px4.launch会直接报错的。但是同时,千万不能让pixhawk飞控和PX4断电,不然他又得重新搜索卫星。为此,建议将micro-USB和telem2引出的USBtoTTL都连接到电脑的USB,或者采用电池一直给飞控供电。或者直接买一个USB拓展,实现USB端口自由!像下面这种分线器,都是免驱的。不太建议买那种USB+网口的,那种Ubuntu不一定能用,当时问了好多家都说不能用或者让我自己试试。
此外,还有两个参数可以看一下是否设置正确(默认应该都是一样的):
[*]EKF2_AID_MASK:勾选使用GPS,&#34;use GPS&#34;
[*]EKF2_GPS_CHECK:如下图勾选。
如果等来等去还是没有获取到rostopic echo /mavros/local_position/pose的数据,怎么办?换一个飞控试试。我之前便是使用新买的飞控,虽然读取到了imu数据,但是死活获取不到GPS数据,无奈之下换了一个飞控就可以了。当时那个飞控每次连接上QGC、刷完固件都会有个报错,不知道是不是这个原因导致不能获取到GPS数据。这个报错如下,网上搜来搜去都没有找到相关的解决方案。
最近又测试了一下,发现下面这个报错的原因是由飞控上插的TF卡导致的,只需要取下TF卡或者将TF卡格式化,之后再烧录一下固件就没有这个报错了。
赞一个,都是干货[机智][机智][机智]
页:
[1]