# GPS used
# param set EKF2_AID_MASK 1
# Vision used and GPS denied
param set EKF2_AID_MASK 24
# Barometer used for hight measurement
# param set EKF2_HGT_MODE 0
# Barometer denied and vision used for hight measurement
param set EKF2_HGT_MODE 3
imu_topic:"/iris_0/imu_gazebo"image0_topic:"/iris_0/stereo_camera/left/image_raw"image1_topic:"/iris_0/stereo_camera/right/image_raw"output_path:"~/xtdrone_ws/vins_output"...pose_graph_save_path:"~/xtdrone_ws/vins_output/pose_graph/"# save and load path
importrospyfromgeometry_msgs.msgimportTwistimportsys,select,osimporttty,termiosfromstd_msgs.msgimportStringMAX_LINEAR=20MAX_ANG_VEL=3LINEAR_STEP_SIZE=0.01ANG_VEL_STEP_SIZE=0.01cmd_vel_mask=Falsectrl_leader=Falsemsg2all="""Control Your XTDrone!To all drones (press g to control the leader)---------------------------1 2 3 4 5 6 7 8 9 0 w r t y ia s d g j k l x v b n ,w/x : increase/decrease forward a/d : increase/decrease leftward i/, : increase/decrease yaw j/l : increase/decrease yawr : return homet/y : arm/disarmv/n : takeoff/landb : offboards/k : hover and remove the mask of keyboard control0 : mask the keyboard control (for single UAV)0~9 : extendable mission(eg.different formation configuration) this will mask the keyboard controlg : control the leaderCTRL-C to quit"""msg2leader="""Control Your XTDrone!To the leader (press g to control all drones)---------------------------1 2 3 4 5 6 7 8 9 0 w r t y ia s d g j k l x v b n ,w/x : increase/decrease forward a/d : increase/decrease leftward i/, : increase/decrease upward j/l : increase/decrease yawr : return homet/y : arm/disarmv/n : takeoff/landb : offboards/k : hover and remove the mask of keyboard controlg : control all dronesCTRL-C to quit"""e="""Communications Failed"""defgetKey():tty.setraw(sys.stdin.fileno())rlist,_,_=select.select([sys.stdin],[],[],0.1)ifrlist:key=sys.stdin.read(1)else:key=''termios.tcsetattr(sys.stdin,termios.TCSADRAIN,settings)returnkeydefprint_msg():ifctrl_leader:print(msg2leader)else:print(msg2all)if__name__=="__main__":settings=termios.tcgetattr(sys.stdin)multirotor_type=sys.argv[1]multirotor_num=int(sys.argv[2])control_type=sys.argv[3]ifmultirotor_num==18:formation_configs=['waiting','cuboid','sphere','diamond']elifmultirotor_num==9:formation_configs=['waiting','cube','pyramid','triangle']elifmultirotor_num==6:formation_configs=['waiting','T','diamond','triangle']elifmultirotor_num==1:formation_configs=['stop controlling']cmd=String()twist=Twist()rospy.init_node(multirotor_type+'_multirotor_keyboard_control')ifcontrol_type=='vel':multi_cmd_vel_flu_pub=[None]*multirotor_nummulti_cmd_pub=[None]*multirotor_numforiinrange(multirotor_num):multi_cmd_vel_flu_pub[i]=rospy.Publisher('/xtdrone/'+multirotor_type+'_'+str(i)+'/cmd_vel_flu',Twist,queue_size=1)multi_cmd_pub[i]=rospy.Publisher('/xtdrone/'+multirotor_type+'_'+str(i)+'/cmd',String,queue_size=3)leader_cmd_vel_flu_pub=rospy.Publisher("/xtdrone/leader/cmd_vel_flu",Twist,queue_size=1)leader_cmd_pub=rospy.Publisher("/xtdrone/leader/cmd",String,queue_size=1)else:multi_cmd_accel_flu_pub=[None]*multirotor_nummulti_cmd_pub=[None]*multirotor_numforiinrange(multirotor_num):multi_cmd_accel_flu_pub[i]=rospy.Publisher('/xtdrone/'+multirotor_type+'_'+str(i)+'/cmd_accel_flu',Twist,queue_size=1)multi_cmd_pub[i]=rospy.Publisher('/xtdrone/'+multirotor_type+'_'+str(i)+'/cmd',String,queue_size=1)leader_cmd_accel_flu_pub=rospy.Publisher("/xtdrone/leader/cmd_accel_flu",Twist,queue_size=1)leader_cmd_pub=rospy.Publisher("/xtdrone/leader/cmd",String,queue_size=3)forward=0.0leftward=0.0upward=0.0angular=0.0print_msg()while(1):key=getKey()ifkey=='w':forward=forward+LINEAR_STEP_SIZEprint_msg()ifcontrol_type=='vel':print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))else:print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='x':forward=forward-LINEAR_STEP_SIZEprint_msg()ifcontrol_type=='vel':print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))else:print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='a':leftward=leftward+LINEAR_STEP_SIZEprint_msg()ifcontrol_type=='vel':print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))else:print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='d':leftward=leftward-LINEAR_STEP_SIZEprint_msg()ifcontrol_type=='vel':print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))else:print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='i':upward=upward+LINEAR_STEP_SIZEprint_msg()ifcontrol_type=='vel':print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))else:print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey==',':upward=upward-LINEAR_STEP_SIZEprint_msg()ifcontrol_type=='vel':print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))else:print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='j':angular=angular+ANG_VEL_STEP_SIZEprint_msg()print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='l':angular=angular-ANG_VEL_STEP_SIZEprint_msg()print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))elifkey=='r':cmd='AUTO.RTL'print_msg()print('Returning home')elifkey=='t':cmd='ARM'print_msg()print('Arming')elifkey=='y':cmd='DISARM'print_msg()print('Disarming')elifkey=='v':cmd='AUTO.TAKEOFF'print_msg()#print('Takeoff mode is disenabled now')elifkey=='b':cmd='OFFBOARD'print_msg()print('Offboard')elifkey=='n':cmd='AUTO.LAND'print_msg()print('Landing')elifkey=='g':ctrl_leader=notctrl_leaderprint_msg()elifkeyin['k','s']:cmd_vel_mask=Falseforward=0.0leftward=0.0upward=0.0angular=0.0cmd='HOVER'print_msg()print("currently:\t forward vel %.2f\t leftward vel %.2f\t upward vel %.2f\t angular %.2f "%(forward,leftward,upward,angular))print('Hover')else:foriinrange(10):ifkey==str(i):cmd=formation_configs[i]print_msg()print(cmd)cmd_vel_mask=Trueif(key=='\x03'):breakifforward>MAX_LINEAR:forward=MAX_LINEARelifforward<-MAX_LINEAR:forward=-MAX_LINEARifleftward>MAX_LINEAR:leftward=MAX_LINEARelifleftward<-MAX_LINEAR:leftward=-MAX_LINEARifupward>MAX_LINEAR:upward=MAX_LINEARelifupward<-MAX_LINEAR:upward=-MAX_LINEARifangular>MAX_ANG_VEL:angular=MAX_ANG_VELelifangular<-MAX_ANG_VEL:angular=-MAX_ANG_VELtwist.linear.x=forward;twist.linear.y=leftward;twist.linear.z=upwardtwist.angular.x=0.0;twist.angular.y=0.0;twist.angular.z=angularforiinrange(multirotor_num):ifctrl_leader:ifcontrol_type=='vel':leader_cmd_vel_flu_pub.publish(twist)else:leader_cmd_accel_flu_pub.publish(twist)leader_cmd_pub.publish(cmd)else:ifnotcmd_vel_mask:ifcontrol_type=='vel':multi_cmd_vel_flu_pub[i].publish(twist)else:multi_cmd_accel_flu_pub[i].publish(twist)multi_cmd_pub[i].publish(cmd)cmd=''termios.tcsetattr(sys.stdin,termios.TCSADRAIN,settings)
VIO实现的是一种比较复杂而有效的非线性优化或着卡尔曼滤波,比如MSCKF(Multi-State-Constraint-Kalman-Filter),侧重的是快速的姿态跟踪,而不花精力来维护全局地图,也不做keyframe based SLAM里面的针对地图的全局优化(bundle adjustment)。
%YAML:1.0#common parameters#support: 1 imu 1 cam; 1 imu 2 cam:2 cam;imu:1num_of_cam:2imu_topic:"/iris_0/imu_gazebo"image0_topic:"/iris_0/stereo_camera/left/image_raw"image1_topic:"/iris_0/stereo_camera/right/image_raw"output_path:"~/xtdrone_ws/vins_output"cam0_calib:"cam0_pinhole_p1.yaml"cam1_calib:"cam1_pinhole_p1.yaml"image_width:752image_height:480# Extrinsic parameter between IMU and Camera.estimate_extrinsic:0# 0 Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.# 1 Have an initial guess about extrinsic parameters. We will optimize around your initial guess.body_T_cam0:!!opencv-matrixrows:4cols:4dt:ddata:[0,0,1,0,-1,0,0,0.12,0,-1,0,-0.3,0,0,0,1.]body_T_cam1:!!opencv-matrixrows:4cols:4dt:ddata:[0,0,1,0,-1,0,0,0,0,-1,0,-0.3,0,0,0,1.]#Multiple thread supportmultiple_thread:1#feature traker paprametersmax_cnt:150# max feature number in feature trackingmin_dist:30# min distance between two features freq:80# frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image F_threshold:1.0# ransac threshold (pixel)show_track:1# publish tracking image as topicflow_back:1# perform forward and backward optical flow to improve feature tracking accuracy#optimization parametersmax_solver_time:0.04# max solver itration time (ms), to guarantee real timemax_num_iterations:8# max solver itrations, to guarantee real timekeyframe_parallax:10.0# keyframe selection threshold (pixel)#imu parameters The more accurate parameters you provide, the better performanceacc_n:0.002# accelerometer measurement noise standard deviation. gyr_n:0.0006# gyroscope measurement noise standard deviation. acc_w:0.00002# accelerometer bias random work noise standard deviation. gyr_w:0.000003# gyroscope bias random work noise standard deviation. g_norm:9.81007# gravity magnitude#unsynchronization parametersestimate_td:0# online estimate time offset between camera and imutd:0.0# initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)#loop closure parametersload_previous_pose_graph:0# load and reuse previous pose graph; load from 'pose_graph_save_path'pose_graph_save_path:"~/xtdrone_ws/vins_output/pose_graph/"# save and load pathsave_image:1# save image in pose graph for visualization prupose; you can close this function by setting 0
<launch><!-- size of map, change the size inflate x, y, z according to your application --><argname="map_size_x"/><argname="map_size_y"/><argname="map_size_z"/><argname="target_x"/><argname="target_y"/><argname="target_z"/><argname="drone_id"/><!-- topic of your odometry such as VIO or LIO --><argname="odom_topic"/><!-- number of moving objects --><argname="obj_num"value="1"/><!-- main algorithm params --><includefile="$(find ego_planner)/launch/advanced_param_xtdrone.xml"><argname="drone_id"value="$(arg drone_id)"/><argname="map_size_x_"value="$(arg map_size_x)"/><argname="map_size_y_"value="$(arg map_size_y)"/><argname="map_size_z_"value="$(arg map_size_z)"/><argname="odometry_topic"value="$(arg odom_topic)"/><argname="obj_num_set"value="$(arg obj_num)"/><!-- camera pose: transform of camera frame in the world frame --><!-- depth topic: depth image, 640x480 by default --><!-- don't set cloud_topic if you already set these ones! --><argname="camera_pose_topic"value="camera_pose"/><argname="depth_topic"value="realsense/depth_camera/depth/image_raw"/><!-- topic of point cloud measurement, such as from LIDAR --><!-- don't set camera pose and depth, if you already set this one! --><argname="cloud_topic"value="pcl_render_node/points"/><!-- intrinsic params of the depth camera --><argname="cx"value="320.5"/><argname="cy"value="240.5"/><argname="fx"value="554.254691191187"/><argname="fy"value="554.254691191187"/><!-- maximum velocity and acceleration the drone will reach --><argname="max_vel"value="1"/><!-- <arg name="max_vel" value="0.5" /> --><argname="max_acc"value="2"/><!-- <arg name="max_acc" value="0.5" /> --><!--always set to 1.5 times grater than sensing horizen--><argname="planning_horizon"value="7.5"/><argname="use_distinctive_trajs"value="true"/><!-- 1: use 2D Nav Goal to select goal --><!-- 2: use global waypoints below --><argname="flight_type"value="1"/><!-- global waypoints --><!-- It generates a piecewise min-snap traj passing all waypoints --><argname="point_num"value="1"/><!-- <arg name="point0_x" value="$(arg target_x)" /> <arg name="point0_y" value="$(arg target_y)" /> <arg name="point0_z" value="$(arg target_z)" /> --><argname="point0_x"value="38"/><argname="point0_y"value="5"/><argname="point0_z"value="1.5"/></include><!-- trajectory server --><nodepkg="ego_planner"name="iris_$(arg drone_id)_traj_server"type="traj_server"output="screen"><remapfrom="position_cmd"to="/xtdrone/iris_$(arg drone_id)/planning/pos_cmd"/><remapfrom="pose_cmd"to="/xtdrone/iris_$(arg drone_id)/cmd_pose_enu"/><remapfrom="~planning/bspline"to="/xtdrone/iris_$(arg drone_id)/planning/bspline"/><paramname="traj_server/time_forward"value="1.0"type="double"/></node></launch>