查看: 658|回复: 1

Ubuntu读取PixHawk硬件的IMU&GPS数据

[复制链接]

39

主题

805

帖子

1674

积分

金牌飞友

Rank: 6Rank: 6

积分
1674
飞币
800
注册时间
2017-9-11
发表于 2022-10-25 21:58:09 | 显示全部楼层 |阅读模式
简述

     上周做的工作一半都是摸索如何使用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这里,如下图。

Ubuntu读取PixHawk硬件的IMU&GPS数据-1.jpg
​       最终成功获取到IMU数据的解决方案:引出飞控上的TELEM2端口,并通过USB转TTL模块连接电脑。我最开始一直是使用飞控的micro-USB端口连接电脑,但是穷尽各种方法也都未能成功获取IMU以及其他数据(探索出来一个奇怪的方式,后文叙述)。

Ubuntu读取PixHawk硬件的IMU&GPS数据-2.jpg
​       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往下的两根线不用接,更加详细的线序可以去参考官网的。

Ubuntu读取PixHawk硬件的IMU&GPS数据-3.jpg
2 QGC设置参数

​       我们不但需要连接好硬件,还需要通过micro-USB连接QGC并设置一下对应的参数。我这里使用TELEM2连接我的笔记本电脑,需要设置的参数如下(使用TELEM1需要的设置不同)。可以在Parameters界面搜索需要设置的参数,参数设置完成后,需要重启才能生效。点击Parameters界面右上角的Tools,然后选择最下面的"Reboot Vehicle"。对于一个新购买的飞控,我们需要先对其进行Sensors的校准之后,才能够搜索到下面的参数。此外,需要设置完参数MAV_1_CONFIG并reboot之后,才可以搜索到另外两个参数

Ubuntu读取PixHawk硬件的IMU&GPS数据-4.jpg

  • MAV_1_CONFIG:配置可以运行mavlink的端口,需要将其配置为TELEM2。reboot后,可见后面两个参数。

Ubuntu读取PixHawk硬件的IMU&GPS数据-5.jpg

  • SER_TEL2_BAUD:telem2的波特率,数值越大通信速率越快。默认为921600,但是如果你使用的USB转TTL的芯片为CH340,那么最大只能设置为115200,我上图中使用的便为CH340的串口芯片。其他的串口芯片或许可以支持921600,比如cp2102,试试就知道。

Ubuntu读取PixHawk硬件的IMU&GPS数据-6.jpg

Ubuntu读取PixHawk硬件的IMU&GPS数据-7.jpg

  • MAV_1_MODE:设置为Onboard即可,默认也为Onboard。

Ubuntu读取PixHawk硬件的IMU&GPS数据-8.jpg
MAV_1_RATE参数不需要修改,让他默认为0即可。
3 运行mavros

首先将USB转TTL连接到自己的笔记本USB端口,然后我们需要确认一下设备的名称。使用micro-USB连接笔记本的USB端口,对应的设备名称和这里不一样,一般为ttyACMO。可以通过如下方式确认设备名:
# 将USB转TTL连接USB端口
ls /dev/
# 将USB转TTL拔掉
ls /dev/然后我们找不同就行了,如下图就可以发现我们这个设备名称为ttyUSB0。

Ubuntu读取PixHawk硬件的IMU&GPS数据-9.jpg
​       当然,其实我们是可以直接通过下面这个命令更方便的找到设备名的。如果检测不到类似名称的USB设备就会报错,如下图所示。
ls /dev/ttyUSB*
Ubuntu读取PixHawk硬件的IMU&GPS数据-10.jpg
得知我们的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飞控。

Ubuntu读取PixHawk硬件的IMU&GPS数据-11.jpg
此时,可以看看是否能够获取到IMU的数据。如果mavros卡在MAVROS started那里,是无法获取到IMU的数据的,经过rostopic list可以看见对应的话题。
rostopic echo /mavros/imu/data
Ubuntu读取PixHawk硬件的IMU&GPS数据-12.jpg
这里拓展一个小知识点。我们可以把前面运行的px4.launch放到launch文件中,如下:
<include file="$(find mavros)/launch/px4.launch">
    </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:="/dev/ttyACM0:[波特率]"一个奇奇怪怪的,可以成功连接的方案为:先打开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's -->

    <arg name="fcu_url" default="/dev/ttyACM0:57600" />
    <arg name="gcs_url" default="" />
    <arg name="tgt_system" default="1" />
    <arg name="tgt_component" default="1" />
    <arg name="log_output" default="screen" />
    <arg name="fcu_protocol" default="v2.0" />
    <arg name="respawn_mavros" default="false" />
    <arg name="config_yaml" default="$(find mavros)/launch/px4_config.yaml" />

    <include file="$(find mavros)/launch/node.launch">
        <arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" />
        <arg name="config_yaml" value="$(arg config_yaml)" />

        <arg name="fcu_url" value="$(arg fcu_url)" />
        <arg name="gcs_url" value="$(arg gcs_url)" />
        <arg name="tgt_system" value="$(arg tgt_system)" />
        <arg name="tgt_component" value="$(arg tgt_component)" />
        <arg name="log_output" value="$(arg log_output)" />
        <arg name="fcu_protocol" value="$(arg fcu_protocol)" />
        <arg name="respawn_mavros" default="$(arg respawn_mavros)" />
    </include>
</launch>按照网上的一些教程,新增了关于 hearbeat的参数设置,无效:
<launch>
    <!-- vim: set ft=xml noet : -->
    <!-- example launch script for PX4 based FCU's -->

    <arg name="fcu_url" default="/dev/ttyACM0:57600" />
    <arg name="gcs_url" default="" />
    <arg name="tgt_system" default="1" />
    <arg name="tgt_component" default="1" />
    <arg name="log_output" default="screen" />
    <arg name="fcu_protocol" default="v2.0" />
    <arg name="respawn_mavros" default="false" />
    <arg name="config_yaml" default="$(find mavros)/launch/px4_config.yaml" />

    <include file="$(find mavros)/launch/node.launch">
        <arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" />
        <arg name="config_yaml" value="$(arg config_yaml)" />

        <arg name="fcu_url" value="$(arg fcu_url)" />
        <arg name="gcs_url" value="$(arg gcs_url)" />
        <arg name="tgt_system" value="$(arg tgt_system)" />
        <arg name="tgt_component" value="$(arg tgt_component)" />
        <arg name="log_output" value="$(arg log_output)" />
        <arg name="fcu_protocol" value="$(arg fcu_protocol)" />
        <arg name="respawn_mavros" default="$(arg respawn_mavros)" />

        <!-- enable heartbeat send and reduce timeout -->
        <param name="conn_heartbeat" value="5.0" />
        <param name="conn_timeout" value="5.0" />
        <!-- automatically start mavlink on USB -->
        <param name="startup_px4_usb_quirk" value="true" />
        <param name="mocap/use_tf" value="true"/>
        <param name="mocap/use_pose" value="false"/>
    </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_raw  100hz
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
Ubuntu读取PixHawk硬件的IMU&GPS数据-13.jpg
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。要点就一个,到空旷的室外等!

Ubuntu读取PixHawk硬件的IMU&GPS数据-14.jpg
​       一般情况下,就算卫星数目大于6他也不一定能获取到gps数据,需要多等一会。我这几天每次获取到GPS数据,都等了一二十分钟以上。如果开着QGC,运行px4.launch会直接报错的。但是同时,千万不能让pixhawk飞控和PX4断电,不然他又得重新搜索卫星。为此,建议将micro-USB和telem2引出的USBtoTTL都连接到电脑的USB,或者采用电池一直给飞控供电。或者直接买一个USB拓展,实现USB端口自由!像下面这种分线器,都是免驱的。不太建议买那种USB+网口的,那种Ubuntu不一定能用,当时问了好多家都说不能用或者让我自己试试。
​       此外,还有两个参数可以看一下是否设置正确(默认应该都是一样的):

  • EKF2_AID_MASK:勾选使用GPS,"use GPS"
  • EKF2_GPS_CHECK:如下图勾选。

Ubuntu读取PixHawk硬件的IMU&GPS数据-15.png
​       如果等来等去还是没有获取到rostopic echo /mavros/local_position/pose的数据,怎么办?换一个飞控试试。我之前便是使用新买的飞控,虽然读取到了imu数据,但是死活获取不到GPS数据,无奈之下换了一个飞控就可以了。当时那个飞控每次连接上QGC、刷完固件都会有个报错,不知道是不是这个原因导致不能获取到GPS数据。这个报错如下,网上搜来搜去都没有找到相关的解决方案。
最近又测试了一下,发现下面这个报错的原因是由飞控上插的TF卡导致的只需要取下TF卡或者将TF卡格式化,之后再烧录一下固件就没有这个报错了。

Ubuntu读取PixHawk硬件的IMU&GPS数据-16.jpg

31

主题

831

帖子

1655

积分

金牌飞友

Rank: 6Rank: 6

积分
1655
飞币
818
注册时间
2017-8-8
发表于 2022-10-25 22:04:09 | 显示全部楼层
赞一个,都是干货[机智][机智][机智]
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表