PX4使用mid360通过fastlio算法实现无人机定点模式悬停
无人机为自主搭建,px4固件版本使用为1.15.4(pixhawk 6cmini),机载电脑为jetson orin nano,激光雷达为大疆的mid360,激光雷达通过开源算法fastlio获取当前位置信息,转换为ENU坐标系下的位置通过mavros话题发布给px4,实现无人机定位效果,使用过程中无光流无GPS。其中远程控制软件为nomachine,使用路由器为千兆(使用电脑热点或者较差路由器可能会导致远程连接巨卡并且是不是掉线,因此尽量选择一个好一点的路由器来进行远程控制),同时orin nano可能存在一些问题,当出现下图标志时,nomachine才可以进行远程操控,并非开机立刻启动。

首先搭建mid360实现fastlio所需环境,可以得到激光雷达获取到的当前定位信息,即可以通过打印激光雷达当前的odometry信息完成雷达的定位即无人机当前位置。
启动雷达:
roslaunch livox_ros_driver2 msg_MID360.launch启动fastlio算法:
roslaunch fast_lio mapping_mid360.launch此时可以得到当前无人机定位信息,此时启动无人机px4程序,通常先给px4串口权限,根据连线接口不同进行赋予权限或者一件赋予
给所有串口添加权限:
sudo chmod 777 /dev/tty*之后启动px4程序:
roslaunch mavros px4.launch将雷达位置信息转换为ENU坐标系后发送给px4无人机,具体代码可以参考链接:
PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停
创建工作空间和相应节点,运行对应节点程序
rosrun xxxxx xxxxx此时通过/mavros/vision_pose/pose话题发布给px4,px4获取到位置后可以在位置模式下进行解锁,如果未解锁先确认发布的话题中是否有信息存在,使用rostopic list进行数据查看,如果无误后位置模式下仍未解锁,也可能存在mavros包下载缺失问题,可以参考链接:
安装mavros_extras功能包:
sudo apt-get install ros-melodic-mavros-extras查看是否接收到位置信息,也可以直接在QGC中查看数据,观察无人机位置信息是否正确,同时在qgc中选择关闭罗盘信息来对应mavros发布的坐标系产生对应,具体链接可以参考:
PX4无人机|MID360使用FAST_LIO,实现自主飞行及定点——PX4无人机配置流程(六)
其中QGC的参数修改也如上链接所示,主要为EKF2_HGT_REF修改为Vision即从上述节点程序中获取当前的位置信息,确定无人机机头所指的方向为X的正方向,即飞机朝机头方向运动,发布的/mavros/vision_pose/pose程序中的x会增大,向上z数据会增大,如果不一致例如相反的情况,具体在无人机起飞后的可能为无人机起飞就开始向一个方向漂移画圈,仅可实现定高效果,无法矫正回正确位置。
节点起飞代码如下:
#! /usr/bin/env python3 import rospy from geometry_msgs.msg import PoseStamped from mavros_msgs.msg import State from mavros_msgs.srv import CommandBool, CommandBoolRequest, SetMode, SetModeRequest current_state = State() def state_cb(msg): global current_state current_state = msg if __name__ == "__main__": rospy.init_node("offb_node_py") state_sub = rospy.Subscriber("mavros/state", State, callback = state_cb) local_pos_pub = rospy.Publisher("mavros/setpoint_position/local", PoseStamped, queue_size=10) rospy.wait_for_service("/mavros/cmd/arming") arming_client = rospy.ServiceProxy("mavros/cmd/arming", CommandBool) rospy.wait_for_service("/mavros/set_mode") set_mode_client = rospy.ServiceProxy("mavros/set_mode", SetMode) # Setpoint publishing MUST be faster than 2Hz rate = rospy.Rate(20) # Wait for Flight Controller connection while(not rospy.is_shutdown() and not current_state.connected): rate.sleep() pose = PoseStamped() pose.pose.position.x = 0 pose.pose.position.y = 0 pose.pose.position.z = 0.5 # Send a few setpoints before starting for i in range(100): if(rospy.is_shutdown()): break local_pos_pub.publish(pose) rate.sleep() offb_set_mode = SetModeRequest() offb_set_mode.custom_mode = 'OFFBOARD' arm_cmd = CommandBoolRequest() arm_cmd.value = True last_req = rospy.Time.now() while(not rospy.is_shutdown()): if(current_state.mode != "OFFBOARD" and (rospy.Time.now() - last_req) > rospy.Duration(5.0)): if(set_mode_client.call(offb_set_mode).mode_sent == True): rospy.loginfo("OFFBOARD enabled") last_req = rospy.Time.now() else: if(not current_state.armed and (rospy.Time.now() - last_req) > rospy.Duration(5.0)): if(arming_client.call(arm_cmd).success == True): rospy.loginfo("Vehicle armed") last_req = rospy.Time.now() local_pos_pub.publish(pose) rate.sleep() 同样也是创建一个工作空间,建立功能包,最后运行起飞节点,飞机静止在(0,0,0.5)m处。同时在实物飞行中也遇到了一定的问题,在起飞时雷达定位出问题的情况,我这边不装桨叶的时候,改变飞机位置雷达定位正确,当换成桨叶起飞时,雷达可能是误检测导致漂移,当我把桨叶换小换成下安装时候这时候定位没问题可以正常飞,大桨叶旋转和小桨叶上安装影响到雷达定位的情况,暂不清楚是由于什么问题影响的雷达,可能是由fastlio检测距离等因素或者是气流因素的影响暂不清楚(后续解决了会进行更新),总之因为飞机桨叶较大,可能对定位算法存在一定的影响因素,最后换成了小桨叶同时进行下置解决了问题。
当飞行中出现了问题,也可以去QGC下载日志进行数据分析,数据解析网址为:
在实物验证中感谢ZEEKLOG上很多人提出的一些建议,无人机的演示效果如下:
PX4使用mid360通过fastlio算法实现无人机定点模式悬停