px4_firmware编译老报错,记录一下遇到的问题
环境:ubuntu20.04+ros-noetic+gazebo11
依赖安装
1 | sudo apt install ninja-build exiftool ninja-build protobuf-compiler libeigen3-dev genromfs xmlstarlet libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gawk |
ros安装
1 | # 设置软件库 |
mavros的安装
1 | # 安装mavros包 |
python
1 | pip install rospkg |
1.装了conda的话直接运行即可
2.
pip -V
和python -V
正常显示版本则代表已安装好3.
pip -V
或python -V
显示command not found可以用
sodu apt install python3 python3-pip
安装一下python3
或者使用conda或者源码编译python又或者使用ubuntu的工具进行管理,自行搜索一下
图方便使用第三步的指令即可
PX4配置
1 | # 克隆px4仓库 |
123网盘(推荐,不限速)
SHA1校验值ea08780db25e277fc287147445360a15458392ae
编译完成会有如下文字
[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文件,但也是可以用的)
1 | source ~/PX4-Autopilot/Tools/setup_gazebo.bash ~/PX4-Autopilot/ ~/PX4-Autopilot/build/px4_sitl_default |
重新打开一个终端会出现几个路径,则设置代表成功
如果不想每次都看见那几行路径,则去
~/PX4-Autopilot/Tools/setup_gazebo.bash
中把echo的几句话全部注释掉即可tips:若你选择下载最新版本的px4,这setup_gazebo.bash和sitl_gazebo文件夹的路径会发生变化,注意更换
如果需要gazebo-classic_iris这个东西请安装>1.14.0的版本
若你后续增加了新的工作空间,一定要把这三行放在最后在souce,之前的工作空间按创建时间顺序souce
新开一个终端,运行下面的launch(一定要新开一个终端!!)
1 | roslaunch px4 mavros_posix_sitl.launch |
运行rostopic echo /mavros/state
其中connected
为true则成功
1 | $ rostopic echo /mavros/state |
实物飞机调整飞控时会用到QGroundControl
此外给一份官方示例代码运行起来之后飞机就能起飞啦
报错
想要重新编译?
1
2
3
4# 先清除之前编译产生的文件 在PX4-Autopilot文件夹目录下运行
make clean
# 再次编译
make px4_sitl_default gazebo运行示例代码,飞机无法起飞
报错Preflight Fail: Accel #0 uncalibrated等
1
2
3# 清空仿真参数再次启动即可
rm ~/.ros/eeprom/parameters*
rm -rf ~/.ros/sitl*若一直无法进入offboard模式,则打开QGC
左上角->vehicle setup—>parameters—>搜索COM_RCL_EXCEPT—>勾选takeoff
有关gazebo_ros
1
2ERROR: 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功能包在哪参考链接
报错
1
2
3[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].在这个红色报错里其实什么都找不到,但是再往上翻你可以看到白字
1
2
3
4
5
6
7
8
9
10
11
12Traceback (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
1
2
3
4
5
6
7
8
9
10
11
12
13
14std_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 wmavros/state
当前状态话题,包括是否连接、解锁以及当前的飞行模式
mavros/global_position/global
GPS定位信息
mavros/imu/data
imu数据
提供的控制接口:
/mavros/setpoint_velocity/cmd_vel_unstamped
控制无人机的速度话题数据类型名称:
geometry_msgs/Twist
1
2
3
4
5
6
7
8geometry_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
1
2
3
4
5
6
7
8
9
10
11
12
13std_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,也建议自行看看官网
简言之,你给这个功能包想要的输入,他给你你想要的输出
输入:
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
1
2[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