这里列出来的软件安装和配置,在初始镜像中都是配置好的,用户可以选择重新烧写镜像以获得完整功能,也可以自行进行安装和配置。
ROS系统安装 #
机载平台上是Ubuntu20, 需要安装ROS Noetic系统。安装方式参见网上教程: http://wiki.ros.org/ROS/Installation。
我们在标准ROS基础上,还安装了双目驱动模块(stereo_cam),mavlink和mavros模块,VINS-fusion模块,ego-planner模块等。这些模块装在/home/khadas/ros_ws/src目录下。
stereo_cam模块配置
stereo_cam模块控制USB3.0连接的双目硬件,同时接收双目的GPIO。Stereo_cam会根据配置生成双目图像、视差图、深度图和点云图。配置文件在launch/stereo_cam.launch, 参数说明如下:
- framerate:双目帧率,目前支持10,15,20,30,60。目前深度图最大输出频率是20fps。
- stereo_combined:双目合并成一帧或左右图输出。缺省是false,左右图输出。
depth_enabled:是否打开深度图计算和输出。
输出topic:
- 左右目灰度图: /stereo_cam/left/image_raw, /stereo_cam/right/image_raw
- 深度图: /stereo_cam/depth
双目参数配置文件,config/stereo_param.yaml。这里深度图计算用的双目相机参数。
mavros模块配置
mavros是基于1.5.0版本的https://github.com/mavlink/mavros.git,我们做了如下修改:
- 坐标系的修改和transform的发布。
- 修改了/mavros/local_position/odom的坐标系为“world”。
主要使用的topic:
- /mavros/imu/data_raw
- /mavros/local_position/odom
- /mavros/setpoint_local/raw
IMU模块配置
因为我们使用了飞控IMU,需要配置mavros, 使其输出200hz.
>rosservice call /mavros/set_stream_rate 0 10 1
>rosrun mavros mavcmd long 511 105 3000 0 0 0 0 0
PX4飞控系统配置
飞控系统需要配置成关闭GPS和Compass,打开融合Vision的模式EKF2。可查看飞控的配置参数。
QGC: 设置EKF2_AID_MASK为24
QGC: 设置EKF2_HGT_MODE为vision
QGC: 设置 EKF2_EV_DELAY为0ms.
QGC: 设置mavlink串口速率921600,onboard模式
QGC:设置对应的GYRO/ACC误差精度
VIO模块配置
我们使用VINS_Fusion(https://github.com/HKUST-Aerial-Robotics/VINS-Fusion)作为双目定位模块,主要修改如下:
- 接收stereo_cam模块发出的双目图像和mavros发出imu消息。消息定义可以在config/stereo中的yaml文件里修改。双目的内参,双目相机和IMU之间的外参也在这里修改。具体参数的标定方法可以参见kalibr工具说明和网上教程。
- 发布world坐标系下的/mavros/vision_pose/pose,和Transform。Mavros会转换到map坐标系,进而发送给飞控。
- VINS_Fusion的工作原理,可以参见其官方网站。
Planner模块配置
我们适配了ego-planner项目来作为避障导航模块,详情可以参见https://github.com/ZJU-FAST-Lab/ego-planner。并做了如下修改:
- 去除了模拟器,取而代之的是mavros_controller,来控制PX4。 删除了src/uav_simulator/Utils/rviz_plugins;增加了/reference/flatsetpoint消息,这个消息传递规划好的路径给mavros_controller, 后者在发送setpoint_local给飞控。
- 我们采用深度图,飞控的位姿(/mavros/local_position/odom)作为ego-planner的输入。
增加了mavros_controller(https://github.com/Jaeyoung-Lim/mavros_controllers)模块来控制飞控。主要修改如下:
- 针对遥控器,将飞控状态控制(GUIDED, POS_HOLD等)交给遥控器channel 5。
- 接收遥控器channel5的信号,来触发开始信号。mavros_controllers收到开始信号时候,会根据配置发送目标(goal)给ego-planner,并监听/reference/flatsetpoint消息,转换成setpoint_local消息发送给mavros,最终控制PX4。
运行脚本参见launch/vim3.launch,其中需要配置参数如下:
- Depth相机的参数width, height, cx, cy, fx, fy。这些在stereo_cam中的深度图像信息的消息中得到。
- 无人机前进最大速度和加速度 max_vel, max_acc。
- 测试中使用的目标参数goal_dist,是每次出发开始信号,mavros_controller会出发无人机前方多远的坐标作为假想目标。
控制模块配置 #
基于mavros_controller(https://github.com/Jaeyoung-Lim/mavros_controllers)代码,我们增加了一个控制模块来协调planner和mavros。主要修改如下:
- 针对遥控器,将飞控状态控制(GUIDED, POS_HOLD等)交给遥控器channel 5。
- 接收遥控器channel6的信号,来触发开始信号。mavros_controllers收到开始信号时候,会根据配置发送目标(goal)给ego-planner,并监听/reference/flatsetpoint消息,转换成setpoint_local消息发送给mavros,最终控制PX4。
运行脚本参见launch/vim3.launch,其中需要配置参数如下:
- Depth相机的参数width, height, cx, cy, fx, fy。这些在stereo_cam中的深度图像信息的消息中得到。
- 无人机前进最大速度和加速度 max_vel, max_acc。
- Use_planner参数决定是否将目标发送给ego_planner。如果是false, mavros_controller会触发自己的轨迹规划(没有避障功能),并发送setpoint_local来执行特定轨迹路线。
- Demo1测试中使用的目标参数goal_dist,是每次出发开始信号,mavros_controller会出发无人机前方多远的坐标作为假想目标。
- Demo2通过一系列目标点来依次触发轨迹。如果setpoint_num等于0,则触发demo1,如果大于0,则触发demo2。在Demo2 中,没收到一次遥控器channel6的开始信号,就会触发下一个目标点。