• Pixhawk之调试方法


    对于 PX4 Firmware 的调试,有别于传统的单片机单步调试,没有办法仿真,因为是多线程程序,也没有好的集成编译环境。主要还是靠串口打印来调试数据。在 Pixhawk 飞控上有一个 USB 的接口,如果想要进入串口打印调试终端 nsh ,就必须拔掉 SD 卡,然后用 USB 口连接电脑,否则不能进入 nsh 终端。

    注意: 对于 Firmware 1.5.4 版本,其更改了 rcS 启动文件,导致 nsh 始终乱码,修改方式如下:

    新固件 (line649)

    # Start MAVLink
      mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
    end{lstlisting} 
    按老固件方法加一个判断
    egin{lstlisting} 
     # Start USB shell if no microSD present, MAVLink else
      if [ $LOG_FILE == /dev/null ]
      then
    	# Try to get an USB console
      	nshterm /dev/ttyACM0 &
      else
      	mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
      fi
    

    进而 make 并 upload 即可。

    新手玩家第一次进行 USB 或者串口连接系统命令行终端,请先按照要求进行系统控制台安装。

    Windows

    NuttShell(nsh) 和 Unix 终端命令类似。 NSH 通过串口或者 USB 转串口来与 PX4FMU 交互,因此可以使用类似超级终端的串口软件来与 FMU 交互,在 Pixhawk 开发中,建立好了开发环境后 (第 ef{compile}节) , PX4 Toolchain 已经附带了一个串口工具: TeraTerm 。当然,也可以选择使用任何一种串口调试工具。

    Linux

    在 Ubuntu 上通常使用 screen 工具进行调试,可按如下方法安装:

      sudo apt-get install screen
    

    使用 screen 工具连接串口

      screen /dev/ttyXXX BAUDRATE 8N1
    

    其中, ttyXXX 为串口名称,通过 ls /dev/tty* 命令查看设备名称。
    通常为: /dev/ttyUSB0 或者 /dev/ttyACM0 。

    调试方法

    在 Windows 和 Linux 操作系统下的调试方法是相同的,这里以 Windows 为例进行说明。

    ( 1 ) 拔掉 SD 卡,

    ( 2 ) 把飞控用 USB 线和电脑连接,

    ( 3 ) 然后打开 Tera Term 串口调试助手,输入 Pixhawk 的飞控 COM 端口号码,和正确的波特率。要等待飞控蜂鸣器两声长响,飞控系统启动完全了。

    tera

    quad $circ$ 57600 baud

    quad $circ$ 8 data bits

    quad $circ$ 1 stop bit

    点击回车后即可进入 nsh :

    teraterm

    microSD 注意事项:

    因为 microSD 卡需要时间去写文件 ,所以在飞控板正记录日志的时候 断电有可能会损坏系统。日志记录在 上锁的时候会自动被停止,因此系统 断电前需要上锁。

    ( 4 ) 输入测试命令

    $ullet$ ls

      nsh> ls -l      # 列出当前文件夹内容
      /:
       dr--r--r--       0 dev/   # 飞控板上的设备、传感器等
       dr--r--r--       0 etc/  # 脚本、混控配置和 Bootloader
       dr--r--r--       0 fs/     # 参数、航点
       dr--r--r--       0 obj/   # 文件句柄
    

    $ullet$ ls /etc

     nsh> ls /etc
     /etc:
      .
      extras/
      mixers/
      init.d/
    

    $ullet$ free

      nsh> free  //查看 RAM 大小;
                   total       used       free    largest
      Mem:        235888     168624      67264      61888
    

    $ullet$ test

    固件中 有名为“ test ”的测试命令 ,它可以用来帮助列出所有测试项目 ,并且很有利于隔离问题。比如 sensor test 用来测试传感器。单独的测试传感器。单独的驱动也有测试,大多数情况下是一个状态指令 (status command) ,比如 : l3gd20 test

    nsh> l3gd20 test
    WARN  [l3gd20] gyro x:    0.02675       rad/s
    WARN  [l3gd20] gyro y:   -0.03811       rad/s
    WARN  [l3gd20] gyro z:   -0.00076       rad/s
    WARN  [l3gd20] temp:    33      C
    WARN  [l3gd20] gyro x:  25      raw
    WARN  [l3gd20] gyro y:  -47     raw
    WARN  [l3gd20] gyro z:  -5      raw
    WARN  [l3gd20] temp:    7       raw
    WARN  [l3gd20] gyro range:  34.9066 rad/s (2000 deg/s)
    ERROR [l3gd20] PASS
    

    对于传感器的命令有 start testresetinfotesterror 或者 regdump

    $ullet$ ? / help

    在串口调试助手输入 ? 或者 help 指令,可以发现飞控系统支持的指令列表。 PX4 所有的内建应用程序 (Builtin Apps) 都在指令列表里面。详细的调试指令说明请待后续发布。

    nsh

    apps

    这些指令,比如 commander 指令(该指令是切换飞控状态的可以切换 takeoff,stab,land 模式状态)。我们在终端输入 commander stop 就是停止这个进程运行。如果我们想启动某个进程,比如我们要启动 commander start 就启动了这个进程。其他也是 XXX start 就启动这个进程,有些进程还要输入参数。$phi$

    例如

      nsh> commander stop
      WARN  [commander] .
      WARN  [commander] terminated.
      nsh> commander start
      ...
      nsh> ekf2 stop
      nsh> ekf2 start
      nsh> INFO  [lib__ecl] EKF using pressure height - commencing alignment
      INFO  [lib__ecl] EKF alignment complete
    

    如果我们要打印某个进程的某个变量,我们只要在这个变量处添加 warnx("XX",XX ) ;这个打印语句即可。具体用法可以在源码搜索到,复制修改即可。

    例如

      warnx("nav state: %d", status.nav_state);
    

    我们想观察这个变量的话,进入调试终端,先把这个进程 stop 掉,然后再 start 一下,就可以看到打印输出。一定要先 stop 再 start ,否则看不到打印数据。这就是最有效的代码调试手段。

    注意:输入 help 命令时,会出现很多系统指令列表,这些指令在 Firmware/msg 文件夹下都可以找到对应的话题,每一个指令都会订阅和发布一些数据,我们自己定义的 topic 也可以出现在这个命令列表中,前提是我们要在 cmake 里面添加。

    Cmake 编辑脚本文件夹,其中 Cmake/Configs 是存放的不同硬件的编译脚本, nuttx_mindpx-v2_default 是 Pixhawk 这个硬件的编辑脚本,如果要添加驱动,添加系统功能的模块函数,要修改里面的编译选项,保证添加的模块文件,才能够被编译到。

    Do what you say,say what you do.
  • 相关阅读:
    StandardWrapper ...$$EnhancerByCGLIB$$b9
    Exception in thread "main" java.lang.ClassCastException: $Proxy13
    Mybatis 源码阅读 (一)
    Thread 中yield(), join()
    java 中类型后面三个点的用法
    JAVA 中汉字在不同编码下的字节不同
    Spring FIlterType
    MyBaties学习记录
    MyBaties学习记录Settings参数详解
    JavaScript学习笔记
  • 原文地址:https://www.cnblogs.com/teslas/p/6396817.html
Copyright © 2020-2023  润新知