这篇文章上次修改于 512 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

px4_firmware编译老报错,记录一下遇到的问题

环境:ubuntu20.04+ros-noetic+gazebo11

依赖安装

sudo apt install ninja-build exiftool ninja-build protobuf-compiler libeigen3-dev genromfs xmlstarlet libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gawk

ros安装

# 设置软件库
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 设置KEY
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
# 更新软件列表
sudo apt update
# 安装完整ROS包
sudo apt install ros-noetic-desktop-full

mavros的安装

# 安装mavros包
sudo apt install ros-noetic-mavros ros-noetic-mavros-extras
# 下载脚本
wget https://gitee.com/robin_shaun/XTDrone/raw/master/sitl_config/mavros/install_geographiclib_datasets.sh
# 添加权限
sudo chmod a+x ./install_geographiclib_datasets.sh
# 执行脚本 安装依赖
# 容易因为网络问题下载不下来 多次执行知道全部succeed
sudo ./install_geographiclib_datasets.sh

python

pip install rospkg
  • 1.装了conda的话直接运行即可

  • 2.pip -Vpython -V正常显示版本则代表已安装好

  • 3.pip -Vpython -V显示command not found

    可以用sodu apt install python3 python3-pip安装一下python3

或者使用conda或者源码编译python又或者使用ubuntu的工具进行管理,自行搜索一下

图方便使用第三步的指令即可

PX4配置

# 克隆px4仓库
git clone https://github.com/PX4/PX4-Autopilot.git
# 进入目录
cd PX4-Autopilot
# 新建名为1.11.3的分支,切换到v1.11.3的版本(tag)
git checkout -b 1.11.3 v1.11.3
# 子模块更新(因为px4仓库里面放了很多其他的仓库,这步在代理不稳定时极容易失败,最好能一次全部通过,也可以使用下面的压缩包)
git submodule update --init --recursive
# 编译(极容易报错)
make px4_sitl_default gazebo

网盘链接

编译完成会有如下文字

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ h ttp://127.0.0.1:11345
[Msg] Publicized address: 192.168.1.113

出现gazebo,里面会有一架飞机,则说明编译成功,按ctrl+c关闭进程等待gazebo自动关闭

然后将下面的内容写入.bashrc文件中

使用的zsh就写入.zshrc中(虽然有个source的是bash文件,但也是可以用的)

source ~/PX4-Autopilot/Tools/setup_gazebo.bash ~/PX4-Autopilot/ ~/PX4-Autopilot/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/PX4-Autopilot
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/PX4-Autopilot/Tools/sitl_gazebo

重新打开一个终端会出现几个路径,则设置代表成功

如果不想每次都看见那几行路径,则去~/PX4-Autopilot/Tools/setup_gazebo.bash中把echo的几句话全部注释掉即可

tips:若你选择下载最新版本的px4,这setup_gazebo.bash和sitl_gazebo文件夹的路径会发生变化,注意更换

新开一个终端,运行下面的launch(一定要新开一个终端!!)

roslaunch px4 mavros_posix_sitl.launch

运行rostopic echo /mavros/state 其中connected为true则成功

$ rostopic echo /mavros/state
header: 
  seq: 29
  stamp: 
    secs: 29
    nsecs: 532000000
  frame_id: ''
connected: True
armed: False
guided: True
manual_input: False
mode: "AUTO.LOITER"
system_status: 3

实物飞机调整飞控时会用到QGroundControl

此外给一份官方示例代码运行起来之后飞机就能起飞啦

报错

  • 想要重新编译

    # 先清除之前编译产生的文件  在PX4-Autopilot文件夹目录下运行
    make clean
    # 再次编译
    make px4_sitl_default gazebo
    
  • 运行示例代码,飞机无法起飞

    • 报错Preflight Fail: Accel #0 uncalibrated

      2022-12-11 15-22-30 的屏幕截图.png

      # 清空仿真参数再次启动即可
      rm ~/.ros/eeprom/parameters*
      rm -rf ~/.ros/sitl*
      
    • 若一直无法进入offboard模式,则打开QGC

      左上角->vehicle setup—>parameters—>搜索COM_RCL_EXCEPT—>勾选takeoff

  • 有关gazebo_ros

    ERROR: cannot launch node of type [gazebo_ros/gzserver]: Cannot locate node of type [gzserver] in package [gazebo_ros]. Make sure file exists in package path and permission is set to executable (chmod +x)
    ERROR: cannot launch node of type [gazebo_ros/gzclient]: Cannot locate node of type [gzclient] in package [gazebo_ros]. Make sure file exists in package path and permission is set to executable (chmod +x)
    

    可能是工作空间放了一个一模一样名字的功能包,把它删掉再次编译即可

    使用roscd gazebo_ros即可找到当前的gazebo_ros功能包在哪

    参考链接

  • 报错

    [vehicle_spawn_magic_5853_2732546998413423669-5] process has died [pid 5940, exit code 1, cmd /opt/ros/noetic/lib/gazebo_ros/spawn_model -sdf -file 
    /home/magic/PX4-Autopilot/Tools/sitl_gazebo/models/iris_rplidar/iris_rplidar.sdf -model iris_rplidar -x 0 -y 0 -z 0 -R 0 -P 0 -Y 0 
    __name:=vehicle_spawn_magic_5853_2732546998413423669 __log:=/home/magic/.ros/log/60dcd1ea-78a8-11ed-8477-4396ccb8ddd5/vehicle_spawn_magic_5853_2732546998413423669-5.log].
    

    在这个红色报错里其实什么都找不到,但是再往上翻你可以看到白字

    Traceback (most recent call last):
      File "/opt/ros/noetic/lib/gazebo_ros/spawn_model", line 20, in <module>
        import rospy
      File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 49, in <module>
        from .client import spin, myargv, init_node, \
      File "/opt/ros/noetic/lib/python3/dist-packages/rospy/client.py", line 52, in <module>
        import roslib
      File "/opt/ros/noetic/lib/python3/dist-packages/roslib/__init__.py", line 50, in <module>
        from roslib.launcher import load_manifest  # noqa: F401
      File "/opt/ros/noetic/lib/python3/dist-packages/roslib/launcher.py", line 42, in <module>
        import rospkg
    ModuleNotFoundError: No module named 'rospkg'
    

    No module named 'rospkg'这个就很熟悉了,python没有rospkg这个包

    pip install rospkg安装一下就行了

mavros简介

提供的数据:

  • mavros/local_position/pose本地位置信息

    数据类型名称:geometry_msgs::PoseStamped

    std_msgs/Header header
      uint32 seq
      time stamp
      string frame_id
    geometry_msgs/Pose pose
      geometry_msgs/Point position
        float64 x
        float64 y
        float64 z
      geometry_msgs/Quaternion orientation
        float64 x
        float64 y
        float64 z
        float64 w
    
  • mavros/state

    当前状态话题,包括是否连接、解锁以及当前的飞行模式

  • mavros/global_position/global

    GPS定位信息

  • mavros/imu/data

    imu数据

提供的控制接口:

  • /mavros/setpoint_velocity/cmd_vel_unstamped控制无人机的速度话题

    数据类型名称:geometry_msgs/Twist

    geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z
    
  • /mavros/setpoint_velocity/cmd_vel控制无人机的速度话题

    数据类型名称:geometry_msgs/TwistStamped

    std_msgs/Header header
      uint32 seq
      time stamp
      string frame_id
    geometry_msgs/Twist twist
      geometry_msgs/Vector3 linear
        float64 x
        float64 y
        float64 z
      geometry_msgs/Vector3 angular
        float64 x
        float64 y
        float64 z
    

    关于这两个速度话题,有一个点需要关注

    前一个话题没有frame_id,默认就是map

    frame_id有什么用?比如frame_id是map,然后速度是x=1,y=0,那么飞机就会一直往map的x正方向飞(无论此时飞机头朝哪边)

    如果是base_link,速度x=1,y=0的话,就是一直往前(飞机头的方向)飞,这时候就跟着飞机头朝向一起走了

  • /mavros/setpoint_position/local

    位置控制话题

    不是很建议使用,因为这个只是单纯的使用内置pid走直线去到指定位置(或许飞控的内置pid会比我们的好?

    听说有队伍也在使用这个打比赛,配合上在飞控的参数里面限制飞行速度最大值

  • /mavros/setpoint_raw/local

    融合了速度位置加速度控制三者与一体的话题

  • /mavros/manual_control/send

    遥控器数值的发送

  • /mavros/manual_control/control

    遥控器数值的订阅

  • /mavros/actuator_control

    控制飞控 IO 输出(混控器)

任务列表

下面给出几个任务让你入门无人机代码控制

1、飞机飞正方形

任务目标:控制飞机在仿真环境中完成起飞定高飞行一个正方形降落的任务。

为降低任务难度,以下给出推荐学习步骤

  • 了解ros&mavros基础知识

    • 掌握ros话题订阅和话题发布的方法
    • 按以上过程配置好px4仿真环境并学习mavros相关话题
  • px4官网 查看飞机使用文档

    • 尝试用mavros控制飞机起飞,飞机起飞时应为offboard模式 官方示例代码
    • Development和Robotics部分阅读一下
  • 控制飞机飞正方形

    • 飞行至两米的高度,然后以该点为起点飞一个正方形(飞机飞行轨迹为正方形,边长建议为5-10m),回到起始点时降落
    • 请勿搜索相关代码,自行书写就好

注意

  • 全程以控制飞行速度的方式进行,可以进行多个话题的尝试(但是不能只发目标位姿)
  • 注意飞机飞行的模式,灵活运用话题、服务、回调等ros基础知识
  • 注意速度控制方法
  • 注意代码书写规范,语言不限
  • 对仿真环境中的机型和环境不作要求
  • 以上任务采用跑定点的方式即算通过,有余力的同学可以尝试开源导航的嵌入

2、move_base在无人机中使用

任务目标:给无人机安装二维激光雷达,以此使用move_base进行避障,最终效果是在rviz中点哪,飞机去哪且不会撞

为降低任务难度,在此简介move_base,也建议自行看看官网

overview_tf.png

简言之,你给这个功能包想要的输入,他给你你想要的输出

输入:

  • tf官方tf教程 tf树mavros可代为链接,但是我忘了指令,同时也十分建议自行学习一下tf知识然后自己连接一下tf树,仿真中飞机定位信息已在mavros/local_position/pose中给出
  • odom:里程计
  • sensor topics:点云激光二选一,我们选激光,记得要把话题传给move_base(学习一下launch文件的一些写法即可 如remap)

输出:

  • cmd_vel:速度

你要做的就是启动move_base,把他需要的话题给他,正常起飞,然后把cmd_vel的数据转发给mavros

如果做了一段时间还是感觉很困难,可以求助学长/学姐

3、ego-planner使用

官方仓库:https://github.com/ZJU-FAST-Lab/ego-planner

基地仓库:https://git.npu5v5.cn/v5/ego_planner_swarm_but_single_uav

学习话题直接的关系已经helo_ego功能包,然后使用ego完成任务一

4、学习学长/学姐代码框架

了解实物,打打比赛,探索新算法

定位、导航、控制

题外话

但很重要

在无人机实物中上位机(nuc/nx/nano/tx 就是一台小电脑 安装Ubuntu系统)需要与飞控进行连接,但是经常链接不上(mavros/state的connect是false)下面列一下一些原因,也方便日后排查

  • usb端口号

    启动连接的文件是 mavros px4.launch,里面有这样一个参数<arg name="fcu_url" value="/dev/ttyACM0:57600"/>

    /dev/ttyACM0是usb端口号,使用ls /dev/tty*可查看所有ubs端口,如果你是使用usb-micro_ubs或者ubs-type_c连接的,则端口号应该是ACM0,如果使用的是ubs-tele1,则应该是UBS0/USB1/UBS2需要通过抽插ubs并使用ls /dev/tty*确定是哪一个

  • 波特率

    上面的57600就是波特率,需要和飞控使用的波特率一致才能正常连接。飞控的波特率在参数中设置,搜SYS_COMPANION或者BAUD什么

  • 线的问题

    如果使用usb-micro_ubs或者ubs-type_c,这个问题可能不太会出现,如果能识别到usb串口,基本能链接上

    如果使用的是ubs-tele1,那建议好好检查线和那个模块是不是有问题,这个问题最难排除,有一次线松了我排查了半天结果学长定睛一看,用笔把线往里戳了戳就好了

  • mavros未更新

    使用px6c可能会有这个问题,电脑上安装的mavros太旧了,更新一下即可sudo apt install ros-$ROS_DISTRO-mavros ros-$ROS_DISTRO-mavros-extras

  • 端口占用 busy

    [FATAL] [1705922606.620863352]: FCU: DeviceError:serial:open: Device or resource busy
    ================================================================================REQUIRED process [mavros-2] has died!
    

    把QGC地面站关闭即可

  • rostopic echo /mavros/local_position/pose没有消息或者xy为0,z有值的时候检查一下飞控参数中EKF2_AID_MASK是否设置为了24,EKF2_HGT_MODE是否设置为VISON