修改版 px4ctrl 的 Github 地址:A-ppIes/px4ctrl 和 aphasiayc/px4ctrl: Fork from ZJU-FAST-LAB/Fast-Drone-250 (github.com)
B 站修改版的控制效果,可能是参数不对。
该文档中给出了一个简易实现版的无人机控制器 px4ctrl,用于无人机的轨迹跟踪控制。
该控制器通过订阅轨迹规划器的规划出的期望轨迹(位置),经过计算将得到期望的姿态,并将期望的姿态发送给飞控执行。
为了使用 Gazebo 仿真器对该项目进行仿真,需要对几个文件进行修改,主要是将几个话题的名称修改为自己的。原本的项目中使用 Vins 作为里程计的来源,其 odom 话题和当前不符。
- 修改 odom_topic 话题
<arg name="odom_topic" value="/vins_fusion/imu_propagate"/>
# 修改为
<arg name="odom_topic" value="/mavros/local_position/odom"/>
- 修改 depth_topic,真实实验时的相机话题为
image_rect_raw
,但是 gazebo 中的相机话题为image_raw
<arg name="depth_topic" value="/camera/depth/image_rect_raw"/>
# 修改为
<arg name="depth_topic" value="/camera/depth/image_raw"/>
- 添加 odom_visualization 用于轨迹和无人机模型在 rviz 的可视化
<node pkg="odom_visualization" name="drone_$(arg drone_id)_odom_visualization" type="odom_visualization" output="screen">
<!-- <remap from="~odom" to="drone_$(arg drone_id)_visual_slam/odom"/> -->
<remap from="~odom" to="$(arg odom_topic)"/>
<param name="color/a" value="1.0"/>
<param name="color/r" value="0.0"/>
<param name="color/g" value="0.0"/>
<param name="color/b" value="0.0"/>
<param name="covariance_scale" value="100.0"/>
<param name="robot_scale" value="1.0"/>
<param name="tf45" value="false"/>
<param name="drone_id" value="drone_id"/>
</node>
- 参数 grid_map/pose_type 说明。其值为 1 时,建图采用 depthPoseCallback 回调函数,一般在 rviz 仿真中使用;其值为 2 时,建图采用 depthOdomCallback 回调函数,一般在实机或 Gazebo 仿真中使用;
<param name="grid_map/pose_type" value="2"/>
(1)采用其值为 1 时,建图采用 depthPoseCallback 回调函数,一般在 rviz 仿真中使用。此时其建图采用的两个话题为 camera_pose_topic 和 depth_topic
<arg name="camera_pose_topic" value="pcl_render_node/camera_pose"/>
<arg name="depth_topic" value="pcl_render_node/depth"/>
(2)其值为 2 时,建图采用 depthOdomCallback 回调函数,一般在实机或 Gazebo 仿真中使用。此时其建图采用的两个话题为 odometry_topic 和 depth_topic
<arg name="odometry_topic" value="$(arg odom_topic)"/>
<!-- depth topic: depth image, 640x480 by default -->
<!-- don't set cloud_topic if you already set these ones! -->
<arg name="camera_pose_topic" value="nouse1"/>
<arg name="depth_topic" value="/camera/depth/image_rect_raw"/>
- 将 use_bodyrate_ctrl 设为 false
- 修改 rc_reverse
rc_reverse:
roll: false
pitch: false
yaw: false
throttle: true
- 修改 auto_takeoff_land 中 no_RC
auto_takeoff_land:
enable: true
enable_auto_arm: true
no_RC: true # set true when sim, set false in exp
takeoff_height: 1.0 # m
takeoff_land_speed: 0.3 # m/s
- 修改 odom,订阅的里程计消息
<remap from="~odom" to="/vicon_imu_ekf_odom" />
# 修改为
<remap from="odom" to="/mavros/local_position/odom" />
- 修改 cmd,订阅的规划出的位置轨迹。该消息为traj_server节点发布的期望位置消息。除了在该文件中修改cmd话题这种方法外,也可以在启动traj_server节点的launch文件中,通过remap,将
/positon_cmd
映射到/planning/pos_cmd
。
<remap from="cmd" to="/planning/pos_cmd" />
# 修改为
<remap from="cmd" to="/position_cmd" />
- 删掉 group 标签,里面的内容保留
<group ns ="iris_0">
XXXXX
</group>
这里不删的话,控制器的话题前面都会有一个前缀,导致和其他节点的话题无法匹配。可能会初始该控制器中,Unable to connnect PX4!!!
的错误提示。
使用 Gazebo 完成仿真,一共需要开启 5 个终端。
- 终端 1:启动 px4 仿真环境,包括 mavros 及 Gazebo,需要在 px4 环境变量生效空间下,或将 px4 环境变量写入 .bashrc 文件中
roslaunch px4 mavros_obs_sitl.launch
说明:mavros_obs_sitl.launch 不是 px4 自带的,是在文件 mavros_posix_sitl.launch 基础上,稍微添加了一些内容得到,修改如下:
<arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/$(arg vehicle)/$(arg vehicle).sdf"/>
替换为
<arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/iris_depth_camera/iris_depth_camera.sdf"/>
- 终端 2:启动规划、建图程序,需要在当前程序的工作空间下
source devel/setup.bash
roslaunch ego_planner single_run_in_exp.launch
- 终端 3:启动 rviz 可视化界面
source devel/setup.bash
roslaunch ego_planner rviz.launch
- 终端 4:启动 px4ctrl 控制模块,用于接收轨迹规划器的规划的位置路径,并将计算的期望姿态发给飞控
source devel/setup.bash
roslaunch px4ctrl run_ctrl.launch
说明:在修改版的 px4ctrl 或 B 站版的文件中,启动的程序是 run_node.launch
控制器需要 imu 的频率在 100hz 以上,需通过在终端中输入命令提高 mavros 传输的飞控信息频率。新开一个终端,在其中输入
# 10000是时间间隔,单位微秒,即10000us=0.1s
# 10000是将频率提高到100hz,若改成5000则提高到200hz
rosrun mavros mavcmd long 511 31 10000 0 0 0 0 0
rosrun mavros mavcmd long 511 32 10000 0 0 0 0 0
可以把这 2 条命令写入 launch 文件中,减少输入工作量。但是注意,需要再开启 mavros 以后,再输入这 2 个命令。
- 终端 5:打开动态调参界面。原版程序更适合于实机飞行,在仿真中建议使用修改版的程序,更适宜操作。修改版程序使用时,需要打开动态调参工具的界面,实现 offboard 模式的切换。
使用说明:
(1)先用 QGC 手动控制无人机起飞到一定高度后悬停;
(2)点击 mode_bool
,可以注意到 px4ctrl 的终端中输出状态,切换到 Auto Hover;同时,QGC 界面上,切换到 offboard 状态;
(3)点击 cmd_bool
;
(4)在 rviz 上指定目标点,然后无人机应该开始正常跟踪轨迹;
在 rviz 中可能会观察到,在无人机在起飞点的原点处存在一坨障碍物,这可能是某些参数没有设置好。通过将单独的 ego planner
项目中的代码,替换本项目中的代码,该问题即可得到解决。
通过阅读控制器的状态机代码,可以看出只有从 manual_ctrl 状态能够切换到 takoff 状态。在启动 px4ctrl 节点前将遥控器摇杆拨到预定状态,此时能够保证控制器仍处于 manual_ctrl 状态;但是若是启动 px4ctrl 节点后再将遥控器摇杆拨到预定状态,则会导致状态机跑到了 cmd_ctrl 状态或 auto_hover 状态,而此时是无法使用 takeoff 脚本的。
在启动 px4ctrl 且遥控器拨杆已经到位的情况下,飞控此时处于 offboard 状态,所以遥控器无法正常解锁。若是将 5 通道,拨回去,则会退出 offboard,遥控器此时就能正常使用了。
5通道: 切换px4ctrl控制(Offboard模式)或飞控的原飞行模式
6通道: 是否允许px4ctrl接收你的代码发给px4ctrl的控制指令
任何模式下将5通道拨出定点模式,飞机将立刻退回到手控模式,指令控制模式下将6通道拨离该模式,飞机会退到定点模式。各个消息还有超时机制,odom、imu、rc等超时会退出到手动控制模式,command超时会退出到定点模式。
- 若定位没有漂移,只是规划程序出问题,优先将
6 通道
拨出,此时无人机将处于定点模式下的悬停状态; - 若定位已经漂移,立刻将
5通道
拨出,此时需要在姿态模式下,控制无人机安全降落,需要提前联系穿越进的操控; - 若是出现紧急情况,直接
7通道
拨出,直接紧急刹车,但此时飞机极有可能坠毁,出现较大经济损失,但比撞人好;
这套程序确实存在 yaw 角变化过快的问题。可以在轨迹发送 traj_server.cpp 文件中限制 yaw 角变化速度。
在文件 traj_server.cpp
文件中可以通过参数 max_yaw_change
来限制无人机运动过程中转角速度过快。若实际中转角速度过快,则可以通过将修改该参数,乘上一个缩放系数,形如
该角度变化过快会导致 vins 定位失效。一般不建议,直接发送一个反方向的目标点,避免直接出现 180°的掉头操作。