精华内容
下载资源
问答
  • 无人机集群控制代码推荐,matlab平台无人机集群控制Gábor Vásárhelyi模型无人机集群控制matlab代码链接 无人机集群控制Gábor Vásárhelyi模型 [1] V. Gábor, V. Csaba, S. Gerg, N. Tamás, A. E. Eiben, and...

    无人机集群控制Gábor Vásárhelyi模型

    [1] V. Gábor, V. Csaba, S. Gerg, N. Tamás, A. E. Eiben, and V. Tamás, “Optimized flocking of autonomous drones in confined environments,” Science Robotics, vol. 3, no. 20, pp. eaat3536-, 2018.

    Gábor Vásárhelyi团队对于四旋翼无人机集群控制做的比较深入,今年在实物平台上进行了很多的实验,从14年的10架到18年30架、20年的50架,不断取得进步。具体细节可以去看他的相关文章。
    这个团队做的实验数据以及代码是公开的,很好找到。但是本人是个小白,自己编写不来,原作者C++写的东西研究不来,找matlab版本的找了很久,终于找到一个比较好用的,推荐给和我一样懒的人,关于代码也有原作者相关的文章详解。第二个引用是代码的文章,其中也有代码的链接。
    当然这个无人机集群控制的matlab代码中并不止一种集群控制模型,对于分散的单个无人机路径规划也有一些代码,可以进行多种对比实验。

    [2] E. Soria, F. Schiano, and D. Floreano, SwarmLab: a Matlab Drone Swarm Simulator. 2020, accepted to the 2020 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), arXiv:2005.02769v2.

    无人机集群控制matlab代码链接

    链接: Swarmlab.

    展开全文
  • 介绍了基本的旋翼无人机控制代码以及相关注释
  • 无人机代码

    2013-10-14 09:27:38
    想做无人机的可以下载。 免费开源固件,支持飞机("ArduPlane"),多旋翼 (四旋翼, 六旋翼, 八旋翼等), 直升机("ArduCopter")和地面车辆("ArduRover")!
  • python代码实现无人机控制学习笔记

    万次阅读 2018-08-13 17:06:19
    quad_sim.py 1.signal模块 通信模块 linux系统的通信基础  linux简单通信基础  linux系统中内核通过信号(signal)对进程进行作出指令,信号发出-等待-执行 ...源代码        

    quad_sim.py

    1.signal模块 通信模块

    linux系统的通信基础 linux简单通信基础 linux系统中内核通过信号(signal)对进程进行作出指令,信号发出-等待-执行

    python中的signal模块用来处理python进程中的信号 signal模块

    signal.signal(signal.SIGINT, signal_handler) 使用signal.signal()函数来预设(register)信号处理函数

    例如 singnal.signal(signalnum, handler)

    signalnum为某个信号,handler为该信号的处理函数。我们在信号基础里提到,进程可以无视信号,可以采取默认操作,还可以自定义操作。当handler为signal.SIG_IGN时,信号被无视(ignore)。当handler为singal.SIG_DFL,进程采取默认操作(default)。当handler为一个函数名时,进程采取函数中定义的操作。

    signal包的核心是设置信号处理函数handler.

    2.sys模块 python自带模块 sys模块 包含很多函数

    sys.exit([arg])  程序中间的退出, arg=0为正常退出 
    一般情况下执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)当然也可以用字符串参数,表示错误不成功的报错信息。

    sys.stdout 表示标准输出流   

    sys.stdout.flush表示刷新输出  参考

    3.argparse模块  python用于解析命令行参数和选项的标准模块 参考1 参考2

    quadcopter.py

    4.scipy.integrate python中的积分工具,分为对函数公式积分和对采样数值积分。 参考

    5.time模块  参考  注重时间

    time() 模块继承自 Object 类,datetime() 模块继承自 Object 下面的 Date() 模块。

    time 提供的功能更加接近于操作系统层面,其所能表述的日期范围被限定在 1970 - 2038 之间,如果要处理更广的日期,那需要使用 datetime 模块。

    6.datetime模块 参考 注重日期

    7.threading模块  参考

    threading提供了一个比thread模块更高层的API(应用程序接口)来提供线程的并发性。这些线程并发运行并共享内存。

    threading.Thread(target=self.thread_run,args=(dt,time_scaling))

    Thread 是threading模块中最重要的类之一,可以使用它来创建线程。

    gui.py

    8.matplotlib.pyplot模块

    是一个绘图命令,与MATLAB中的plot类似 参考

    9.mpl_toolkits.mplot3d.axes3d模块 

    3D绘图模块,并对图像的属性进行处理  参考

    源代码

     

     

     

     

    展开全文
  • 无人机中的PID控制代码略解 PID的控制规律: 参考:Amov实验室-PX4中级课程-PID基础 频域函数: u(s)err(s)=kp+kis+kds \frac{u(s)}{err(s)}=k_p+\frac{k_i}{s}+k_ds err(s)u(s)​=kp​+ski​​+kd​s 写成时域...

    无人机中的PID控制代码略解

    • PID的控制规律:

    参考:Amov实验室-PX4中级课程-PID基础

    频域函数:
    u(s)err(s)=kp+kis+kds \frac{u(s)}{err(s)}=k_p+\frac{k_i}{s}+k_ds
    写成时域的函数:
    u(t)=kp(err(t)+1Tierr(t)dt+Tdderr(t)dt)(1) u(t)=k_p(err(t)+\frac{1}{T_i} \int err(t)dt+T_d\frac {derr(t)}{dt}) \tag 1

    假设采样间隔为T,则在第K个T时刻,有:
    err(K)=Rin(K)Cout(K) err(K) = R_{in}(K)-C_{out}(K)

    对于积分环节,按照定义则有:
    I(K)=T(err(0)+err(1)++err(K))=Ti=0Kerr(i)(2) I(K)=T*(err(0)+err(1)+\cdots + err(K))=T\sum_{i=0}^{K}err(i) \tag 2
    对于微分环节,按照定义则有:
    D(K)=err(K)err(K1)T(3) D(K) = \frac{err(K)-err(K-1)}{T} \tag3
    (2),(3)(2),(3)代入回(1)(1)则有:
    u(K)=kp[err(K)+TTii=0Kerr(i)+Tderr(K)err(K1)T] u(K)=k_p[err(K)+\frac{T}{T_i}\sum_{i=0}^{K}err(i)+T_d\frac{err(K)-err(K-1)}{T}]
    化简一下则有:
    u(K)=kperr(K)+kii=0Kerr(i)+kd[err(K)err(K1)](4) u(K)=k_perr(K)+k_i\sum_{i=0}^{K}err(i)+k_d[err(K)-err(K-1)] \tag4
    为了减小存储空间,还有增量式PID,可写为:
    Δu(K)=kp[err(K)err(K1)]+kierr(K)+kd[err(K)2err(K1)+err(K2)] \Delta u(K)=k_p[err(K)-err(K-1)]+k_i \cdot err(K)+k_d[err(K)-2err(K-1)+err(K-2)]
    u(K)u(K)还可以写为:
    u(K)=u(K1)+Δu(K) u(K)=u(K-1)+\Delta u(K)

    • PID的C语言代码初步实现:

    //定义pid结构体,定义主要参数
    struct _pid{
        float SetSpeed;
        float ActualSpeed;
        float err;
        float err_last;	//err(K-1)
        float Kp,Ki,Kd;
        float voltage;//Object Signal
        float integral;
    
        float err_llast;//err(K-2)
    }pid;
    
    //初始化pid模块
    void PID_init(){
        pid.SetSpeed = 0;
        pid.ActualSpeed=0.0;
        pid.err = 0;
        pid.err_last = 0;
        pid.voltage = 0;
        pid.integral = 0;
        //Set Each PID Gain
        pid.Kp = 0.4;
        pid.Ki = 0.3;
        pid.Kd = 0.2;
    
        pid.err_llast = 0;
    }
    
    //pid实现,包括增量形式的pid,输入为目标速度,输出为当前的速度
    float PID_realize(float speed){
        pid.SetSpeed = speed;
        pid.err = pid.SetSpeed - pid.ActualSpeed;
        
        //PID Calculate
        pid.voltage = pid.Kp*pid.err + \
                    pid.Ki*pid.integral + \
                    pid.Kd*(pid.err-pid.err_last);
        
        //Increment Type
    /*  
    	float incrementVoltage;
        incrementVoltage = pid.Kp*(pid.err-pid.err_last)+\
                        pid.Ki*pid.err+\
                        pid.Kd*(pid.err-2*pid.err_last+pid.err_llast);
    
        pid.voltage += incrementVoltage;
        pid.err_llast = pid.err_last;
    */    
        //Update Parameters
        pid.err_last = pid.err;
        pid.ActualSpeed = pid.voltage*1.0;
        return pid.ActualSpeed;
    }
    
    
    • PX4中姿态控制介绍:

    PX4中的控制主要分为***姿态控制*** 和***位置控制***,这两者都采用***串级PIDPID*** 控制,这样的好处是可以增加系统的稳定性,抗干扰,因为参数更多了,直观上自然能够适应的情况就相对来说多一点。位置控制中外环是位置,内环是速度,由内环得到的速度积分就是位置的改变量。而姿态控制中,外环是角度差,内环是角速度差,这是因为角度的变化同时也是由角速度过渡来的。参考:Pixhawk-串级pid介绍

    因为时间关系,我下面介绍一下内环角速度PID控制的实现:

    1. 首先是角速度PID环控制器的类,成员函数主要由:设置初始PID增益,设置积分器的最大绝对值,设置前馈增益,饱和状态(和Mixer有关),重设积分项,获取状态信息,积分项特别调控以及PID最终的计算结果实现。不要看其这么复杂,其实主要的函数就是最后两个,而这两个函数也只是在我之前介绍的简易PID实现的基础上加了一点点工业上的限制。
    class RateControl
    {
    public:
    	RateControl() = default;
    	~RateControl() = default;
    
    	/**
    	 * Set the rate control gains
    	 * @param P 3D vector of proportional gains for body x,y,z axis
    	 * @param I 3D vector of integral gains
    	 * @param D 3D vector of derivative gains
    	 */
    	void setGains(const matrix::Vector3f &P, const matrix::Vector3f &I, const matrix::Vector3f &D);
    
    	/**
    	 * Set the mximum absolute value of the integrator for all axes
    	 * @param integrator_limit limit value for all axes x, y, z
    	 */
    	void setIntegratorLimit(const matrix::Vector3f &integrator_limit) { _lim_int = integrator_limit; };
    
    	/**
    	 * Set direct rate to torque feed forward gain
    	 * @see _gain_ff
    	 * @param FF 3D vector of feed forward gains for body x,y,z axis
    	 */
    	void setFeedForwardGain(const matrix::Vector3f &FF) { _gain_ff = FF; };
    
    	/**
    	 * Set saturation status
    	 * @param status message from mixer reporting about saturation
    	 */
    	void setSaturationStatus(const MultirotorMixer::saturation_status &status);
    
    	/**
    	 * Run one control loop cycle calculation
    	 * @param rate estimation of the current vehicle angular rate
    	 * @param rate_sp desired vehicle angular rate setpoint
    	 * @param dt desired vehicle angular rate setpoint
    	 * @return [-1,1] normalized torque vector to apply to the vehicle
    	 */
    	matrix::Vector3f update(const matrix::Vector3f &rate, const matrix::Vector3f &rate_sp,
    				const matrix::Vector3f &angular_accel, const float dt, const bool landed);
    
    	/**
    	 * Set the integral term to 0 to prevent windup
    	 * @see _rate_int
    	 */
    	void resetIntegral() { _rate_int.zero(); }
    
    	/**
    	 * Get status message of controller for logging/debugging
    	 * @param rate_ctrl_status status message to fill with internal states
    	 */
    	void getRateControlStatus(rate_ctrl_status_s &rate_ctrl_status);
    
    private:
    	void updateIntegral(matrix::Vector3f &rate_error, const float dt);
    
    	// Gains
    	matrix::Vector3f _gain_p; ///< rate control proportional gain for all axes x, y, z
    	matrix::Vector3f _gain_i; ///< rate control integral gain
    	matrix::Vector3f _gain_d; ///< rate control derivative gain
    	matrix::Vector3f _lim_int; ///< integrator term maximum absolute value
    	matrix::Vector3f _gain_ff; ///< direct rate to torque feed forward gain only useful for helicopters
    
    	// States
    	matrix::Vector3f _rate_int; ///< integral term of the rate controller
    
    	bool _mixer_saturation_positive[3] {};
    	bool _mixer_saturation_negative[3] {};
    };
    
    1. 说一下积分项特别调控和PID的计算输出两个模块:

    积分项特别调控:

    void RateControl::updateIntegral(Vector3f &rate_error, const float dt)
    {
    	for (int i = 0; i < 3; i++) {
    		// prevent further positive control saturation
    		if (_mixer_saturation_positive[i]) {
    			rate_error(i) = math::min(rate_error(i), 0.f);
    		}
    
    		// prevent further negative control saturation
    		if (_mixer_saturation_negative[i]) {
    			rate_error(i) = math::max(rate_error(i), 0.f);
    		}
    
    		// I term factor: reduce the I gain with increasing rate error.
    		// This counteracts a non-linear effect where the integral builds up quickly upon a large setpoint
    		// change (noticeable in a bounce-back effect after a flip).
    		// The formula leads to a gradual decrease w/o steps, while only affecting the cases where it should:
    		// with the parameter set to 400 degrees, up to 100 deg rate error, i_factor is almost 1 (having no effect),
    		// and up to 200 deg error leads to <25% reduction of I.
    		float i_factor = rate_error(i) / math::radians(400.f);
    		i_factor = math::max(0.0f, 1.f - i_factor * i_factor);
    
    		// Perform the integration using a first order method
    		float rate_i = _rate_int(i) + i_factor * _gain_i(i) * rate_error(i) * dt;
    
    		// do not propagate the result if out of range or invalid
    		if (PX4_ISFINITE(rate_i)) {
    			_rate_int(i) = math::constrain(rate_i, -_lim_int(i), _lim_int(i));
    		}
    	}
    }
    

    首先是积分饱和的限制:

    		// prevent further positive control saturation	
    		if (_mixer_saturation_positive[i]) {
    			rate_error(i) = math::min(rate_error(i), 0.f);
    		}
    
    		// prevent further negative control saturation
    		if (_mixer_saturation_negative[i]) {
    			rate_error(i) = math::max(rate_error(i), 0.f);
    		}
    

    在实际过程中,如果系统一直存在一个方向的偏差,PID的输出因为积分项的存在可能会变得非常大,但是执行器的输入是有限的。当执行器的输入达到上限,PID的输出持续增大,此时就进入了饱和区,这主要是由于积分项饱和造成的。一旦系统出现了反向的偏差,此时积分项就要逐渐减小,但是由于进入了饱和区,不可能一下从饱和区中退出来,使得执行机构的输入一直在极限状态,无法立刻减小,进入饱和区时间越长,越难退出来,这就导致了像是失控一样现象。所以为了抑制这种现象,必须让积分项在PID的输出达到执行器饱和的时候停止让PID输出的绝对值继续增加,包括正向和负向,这就有了上面这两句函数。

    其次注意这个函数中以下两句函数:

    		float i_factor = rate_error(i) / math::radians(400.f);
    		i_factor = math::max(0.0f, 1.f - i_factor * i_factor);
    		float rate_i = _rate_int(i) + i_factor * _gain_i(i) * rate_error(i) * dt;
    

    这个对于积分项的计算可以看成如下的公式:
    RateIntegral(K)=i=0K1err(i)+ifactorkierr(K)dt RateIntegral(K)=\sum_{i=0}^{K-1}err(i)+i_{factor}*k_i*err(K)*dt
    其中,ifactori_{factor}的计算如下:
    ifactor=1(err400)2 i_{factor} = 1-(\frac{err}{400^\circ})^2
    整个函数限制了积分增益不能太大,当期望的角速度误差在200200^\circ的时候,就可以看到积分增益减少到25%了,而当角速度误差超过400400^\circ的时候,此时积分的增益就会完全为0。这样做是为了防止积分项导致PID的输出非常巨大,产生超调,甚至引起积分饱和。

    PID最终的计算:

    Vector3f RateControl::update(const Vector3f &rate, const Vector3f &rate_sp, const Vector3f &angular_accel,
    			     const float dt, const bool landed)
    {
    	// angular rates error
    	Vector3f rate_error = rate_sp - rate;
    
    	// PID control with feed forward
    	// 带有前馈的PID控制
        // torque=p*rate_error(比例项)+_rate_int(积分项)-d*angular_accel(微分项)+ff*rate_sp(前馈)
    	const Vector3f torque = _gain_p.emult(rate_error) + _rate_int - _gain_d.emult(angular_accel) + _gain_ff.emult(rate_sp);
    
    	// update integral only if we are not landed
    	if (!landed) {
    		updateIntegral(rate_error, dt);
    	}
    
    	return torque;
    }
    

    这里大家可能会有疑惑,为什么要加一个前馈的控制呢?实际上这和积分项的滞后有关,加入前馈调节可以使得系统的控制速度更快,提高系统的响应速度:参考:多旋翼姿态控制中前馈的作用

    加入前馈矫正的串级PID系统框图

    可以看到,其中在外环已经产生一个角速度期望控制了,可是由于内环积分器的滞后(分析积分环节的频域响应可知,中高频段的相角滞后严重),前馈的作用是跳过积分器,直接从输入到输出,以提高系统的响应速度

    设PID控制环节的传递函数Gc(s)=Kp+Kis+KdsG_c(s) = K_p+\frac{K_i}{s}+K_ds

    则有不加前馈的开环传递函数(从θd\theta_dθ\theta):
    G1(s)=PGcJs2+Gcs G_1(s)=\frac{PG_c}{Js^2+G_cs}
    加了前馈的开环传递函数为:
    G1(s)=PK+PGcJs2+Gcs G_1(s)=\frac{PK+PG_c}{Js^2+G_cs}
    假如我们简略一点,把GcG_c看成常数,也就是说只有比例增益,至少很容易看出此时这个二阶系统的增益变大了,这样的话系统的响应速度变快,稳态误差减小;同时系统的自然频率变大,阻尼比不变,相应的系统的闭环带宽增加,系统能够响应更多的高频分量使得控制系统的快速性提高。GcG_c为一般的情况下,也有类似的分析,主要就是提高了截止频率,使得带宽增加,相角裕度减小,超调量增加,系统快速性增强。

    展开全文
  • 无人机控制器-源码

    2021-02-14 11:45:15
    无人机控制
  • Python代码控制Tello无人机 人脸追踪 使用haarcascade_frontalface_default.xml机器学习对象检测算法和以下python模块... •OpenCV-Python•numpy•djitellopy•时间•操作系统•平台•getpass 我们能够控制Tello...
  • 无人机开源代码整理

    千次阅读 2019-08-22 22:31:53
    Paparazzi Autopilot Team https://github.com/paparazzi ArduPilot https://github.com/ArduPilot PX4 Drone Autopilot https://github.com/PX4 BetaFlight https://github.com/betaflight ...ht...
    展开全文
  • 匿名无人机飞控代码整理

    千次阅读 2019-07-31 09:53:48
    总结一下的话,后面的流程都是固定的,想要控制飞机,重点在于最开始,也就是外环的期望角度,它决定了飞机的运动状态,由定位环输出,另一方面,只要有了这个期望速度,通过两个角度环,加上观测量,最终就可以 ...
  • 记录零基础调试深度强化学习做无人机导航代码的过程(公开的代码) 这是别人网上公开的代码,我只是下载下来去把它在我电脑上面调通而已。可能对大神来说是个很简单的东西,但是对于python零基础的小白来说真是个...
  • 搞了半天还没看到有用的东西,接下来开始看角速度环、电机控制、姿态角获取、角度环这部分,一起看是因为联系比较紧密。 下午看高度和位置部分。。。。 首先看姿态角速度环控制: Att_1level_Ctrl(2*1e-3f); 进入...
  • 匿名无人机飞控代码整理1

    千次阅读 2019-07-28 16:43:04
    不知道这个干啥的,关于它的操作,全部在一个叫flyctrl的文件夹中,超级长的代码,估计下一个就分析它了。。。)再加上pc_user.vel_cmps_set_z(这个也没看懂呢,user定义的速度是啥玩意,遥控器?),这部分看不懂...
  • 多旋翼无人机控制器设计入门

    千次阅读 2019-09-02 21:45:48
    对于一架具备自动飞行能力的无人机来说,控制器设计是其中最为重要的工作之一。在开始控制器设计之前,我们要搞清楚控制器设计的目标是什么?控制器的输入输出是什么?控制器的结构应该怎么设计?接下来的几篇内容将...
  • 最后来看定高。。。 1、高度数据融合任务, WCZ_Fus_Task(11); GPS_Data_Processing_Task(11);...如果起飞标志为1,那么...嗯,感觉代码好像看的差不多了,下午开始把工程的控制过程整合一下,争取半天完成。。。
  • 最后一个是gps、光流、uwb都没有,那就直接利用期望速度得出期望姿态角,这里比较好理解,但恐怕实际上的情况是有光流无gps、uwb,所以应该是第三段代码,但有光流实际上就是在定位。。。 所以说在实际中,我们想...
  • 姿态角度环控制: Att_2level_Ctrl(6e-3f,CH_N); exp_rol_tmp = - loc_ctrl_1.out[Y]; exp_pit_tmp = - loc_ctrl_1.out[X]; 把location环的输出,赋给期望滚转和俯仰的暂存值。 if(flag.flight_mode == ATT_...
  • 2、第二个是色块跟踪控制任务: void ANO_CBTracking_Ctrl_Task(u8 dT_ms) { if(switchs.of_flow_on && switchs.opmv_on) { ano_opmv_cbt_ctrl.exp_velocity_h_cmps[0]\ = CBT_KF *ano_opmv_cbt_ctrl....
  • dronecode无人机开源项目无人机无疑是时下最火爆的硬件创业项目之一,除了亚马逊、Google这样的资深玩家,数以万计的独立开发者...本周无人机开发者们迎来一个好消息,Linux基金会联合十家公司推出无人机代码计划(...
  • 使用无人机型号:经纬M600pro -OSDK版本:大疆官方开源原生DEMO——OSDK3.9代码。 OSDK开发平台:STM32F4 目录问题:解决方案: 问题: 3.9版本代码下载到板子里,串口显示如下错误: 蓝色画线 部分显示串口初始化...
  • 四旋翼无人机控制

    千次阅读 2017-02-21 09:13:24
    那么四旋翼无人机是怎样进行平衡控制和姿态控制的呢?我们来看一下。 开始这部分描述前,大家必须不要混淆加速度传感器和角速度传感器。 角速度传感器也有人叫角加速度传感器,不过不要小看这个“角”字,一字之差...
  • 多旋翼无人机控制之遥控器指令

    千次阅读 2019-05-14 21:10:21
    本片博文简单讲讲遥控器指令的作用,即遥控器具体控制了多旋翼无人机的哪些状态量,以及这些指令在控制器的哪些环节起作用。 遥控器具有以下四个主通道: 油门通道 偏航通道 俯仰通道 滚转通道 油门通道 ...
  • 第1章-无人机协同控制技术概述1.1 多无人机协同控制的背景与意义1.2 多无人机协同控制的关键技术1.2.1 多无人机协同控制体系结构1.2.2 单无人机控制方法1.2.3 多无人机巡航编队飞行控制方法1.2.4 多无人机目标跟踪...
  • DJI Tello无人机控制器python软件包 这是一个可控制DJI玩具无人机“ Tello”的python软件包。 源代码的大部分是从GOBOT项目的驱动程序移植的。 有关原始golang版本和协议的详细信息,请参阅其博客文章,为 如何安装 ...
  • Dronekit代码学习(三)控制无人机前后左右升降俯仰 控制无人机前后左右升降俯仰 代码如下: 起飞5m后,右5m,前方5m,升2m,返航,关闭连接 升降是反的 # -*- coding: utf-8 -*- ''' ----------------------------...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,396
精华内容 2,158
关键字:

无人机控制代码