目录

创建飞行控制器界面

1.新建Activiity

2.MainActivity

activity_main.xml

MainActivity.java

3.FlightActivity

activity_flight.xml

FlightActivity.java

4.AndroidManifest

DJI Mobile SDK的回调方法

起飞、降落与返航的实现

获取控制器

API Reference:FlightController()

起飞与取消起飞

API Reference:startTaskoff()、cancelTaskoff()

降落与取消降落

API Reference:startLanding()、cancelLanding()

返航与取消返航

API Reference: startGoHome()、cancelGoHome()

返航高度的设置与获取

API Reference: setGoHomeHeightInMeters()、getGoHomeHeightInMeters()

自定义提示


创建飞行控制器界面

1.新建Activiity

“com.dji.importSDKDemo” 包上单击右键,新建一个名称为 FlightActivity、布局名为 activity_flight 的活动。

2.MainActivity

activity_main.xml

MainActivity 布局文件 activity_main.xml 中添加一个名为 “飞行控制器” 的按钮

    <Buttonandroid:id="@+id/fight_controller"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:layout_marginTop="15dp"android:text="飞行控制器"android:textSize="25sp"/>

MainActivity.java

要在 MainActivity 中实现单击 “飞行控制器” 按钮跳转到 FlightActivity 页面的代码,即在 MainActivity.java 文件中的 initUI() 函数的最后加入如下代码

    private void initUI() {…………Button fight_controller = (Button) findViewById(R.id.fight_controller);fight_controller.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (checkDroneConnection() == false) {return;}//弹出FlightActivityIntent i = new Intent(MainActivity.this, FlightActivity.class);startActivity(i);}});}

在单击 “飞行控制器” 按钮跳转到 FlightActivity 页面前,需要判断应用程序激活注册、状态,以及无人机绑定、连接等是否正常。故在 initUI() 方法后添加 checkDroneConnection() 方法来判断,代码如下

    private boolean checkDroneConnection() {//应用程序激活管理器AppActivationManager mgrActivation = DJISDKManager.getInstance().getAppActivationManager();//判断应用程序是否注册if (!DJISDKManager.getInstance().hasSDKRegistered()) {showToast("应用程序未注册");return false;}//判断应用程序是否激活if (mgrActivation.getAppActivationState() != AppActivationState.ACTIVATED) {showToast("应用程序未激活");return false;}//判断无人机是否绑定if (mgrActivation.getAircraftBindingState() != AircraftBindingState.BOUND) {showToast("无人机未绑定");return false;}//判断无人机是否连接//if ((DJISDKManager.getInstance().getProduct() == null) || !(DJISDKManager.getInstance().getProduct().isConnected())) {BaseProduct product = DJISDKManager.getInstance().getProduct();if (product == null || !product.isConnected()) {showToast("无人机连接失败");return false;}return true;}

3.FlightActivity

activity_flight.xml

FlightActivity UI界面添加名为 “起飞”、“取消起飞”、“降落”、“取消降落”、“设置返航高度”、“获取返航高度”、“返航”、“取消返航” 按钮,界面与代码如下:

FlightActivity UI界面
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="10dp" ><TextViewandroid:id="@+id/DJI_fly"style="?android:listSeparatorTextViewStyle"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="飞行控制"android:textSize="15sp"app:layout_constraintTop_toTopOf="parent"android:layout_marginTop="10dp" /><Buttonandroid:id="@+id/btn_takeoff"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="起飞"app:layout_constraintTop_toBottomOf="@+id/DJI_fly"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_takeoff_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消起飞"app:layout_constraintTop_toBottomOf="@+id/btn_takeoff"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_landing"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="降落"app:layout_constraintTop_toBottomOf="@+id/btn_takeoff_cancel"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_landing_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消降落"app:layout_constraintTop_toBottomOf="@+id/btn_landing"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_set_home_height"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="设置返航高度"app:layout_constraintTop_toBottomOf="@+id/btn_landing_cancel"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_get_home_height"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="获取返航高度"app:layout_constraintTop_toBottomOf="@+id/btn_set_home_height"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_home"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="返航"app:layout_constraintTop_toBottomOf="@+id/btn_get_home_height"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" /><Buttonandroid:id="@+id/btn_home_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消返航"app:layout_constraintTop_toBottomOf="@+id/btn_home"android:layout_marginTop="10dp"android:textSize="25sp"android:padding="15dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

FlightActivity.java

在上一步添加的按钮,要使其实现功能,需要在 FlightActivity.java 中获取上述8个按钮的对象,并监听其单击方法,代码如下:

public class FlightActivity extends AppCompatActivity implements View.OnClickListener {private Button mBtnTakeoff, mBtnCancelTakeoff, mBtnLanding, mBtnCancelLanding;private Button mBtnSetHomeHeight, mBtnGetHomeHeight, mBtnHome, mBtnCancelHome;public FlightActivity() {}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_flight);//初始化UI界面initUI();//初始化监听器initListener();}private void initUI() {mBtnTakeoff = findViewById(R.id.btn_takeoff);mBtnCancelTakeoff = findViewById(R.id.btn_takeoff_cancel);mBtnLanding = findViewById(R.id.btn_landing);mBtnCancelLanding = findViewById(R.id.btn_landing_cancel);mBtnSetHomeHeight = findViewById(R.id.btn_set_home_height);mBtnGetHomeHeight = findViewById(R.id.btn_get_home_height);mBtnHome = findViewById(R.id.btn_home);mBtnCancelHome = findViewById(R.id.btn_home_cancel);}private void initListener() {mBtnTakeoff.setOnClickListener(this);mBtnCancelTakeoff.setOnClickListener(this);mBtnLanding.setOnClickListener(this);mBtnCancelLanding.setOnClickListener(this);mBtnSetHomeHeight.setOnClickListener(this);mBtnGetHomeHeight.setOnClickListener(this);mBtnHome.setOnClickListener(this);mBtnCancelHome.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_takeoff: {takeoff();break;}case R.id.btn_takeoff_cancel: {cancelTakeoff();break;}case R.id.btn_landing: {landing();break;}case R.id.btn_landing_cancel: {cancelLanding();break;}case R.id.btn_set_home_height: {setHomeHeight();break;}case R.id.btn_get_home_height: {getHomeHeight();break;}case R.id.btn_home: {home();break;}case R.id.btn_home_cancel: {cancelHome();break;}default:break;}}//起飞private void takeoff() {}//取消起飞private void cancelTakeoff() {}//降落private void landing() {}//取消降落private void cancelLanding() {}//设置返航高度private void setHomeHeight() {}//获取返航高度private void getHomeHeight() {}//返航private void home() {}//取消返航private void cancelHome() {}//在主线程中显示提示private void showToast(final String toastMsg) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), toastMsg, Toast.LENGTH_LONG).show();}});}
}

4.AndroidManifest

AndroidManifest.xml 文件中,配置 MainActivityFlightActivity 之间的关系,以便于在 FlightActivity 中返回到 MainActivity,界面与代码如下:

<activityandroid:name=".MainActivity"android:configChanges="orientation"android:launchMode="singleTop"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity><activityandroid:name=".FlightActivity"android:configChanges="orientation"android:parentActivityName=".MainActivity"android:screenOrientation="portrait" />

DJI Mobile SDK的回调方法

无人机的监控操作需要通过LightBridge、OcuSync等链路进行信息传递。

受信号衰减和环境干扰的影响,信息传递通常要消耗一定时间完成。因此对无人机的各类操作均需要通过回调的方法来介入处理。

在 Android Mobile SDK 中,回调函数的接口通过 CommonCallbacks 定义。

  • CompletionCallback :仅包括 onResult(DJIError  error) 抽象方法。当 error 为空时,任务执行成功;当 error 不为空时,通过其 getDescription() 方法详细错误信息。
  • CompletionCallbackWith<T>:包括 onSuccess(T  val)onFailure(DJIError  error) 两个方法。当任务执行成功时,回调 onSuccess(…) 方法,且返回参数 val ;当任务执行失败时,回调 onFailure(…) 方法,且其中的 error 对象包含了错误描述。
  • CompletionCallbackWithTwoParam<X, Y>:与 CompletionCallbackWith<T> 类似,包括 onSuccess(X val1, Y val2)onFailure(DJIError  error) 两个方法,方法执行成功时返回 val1 和 val2 两个参数。

起飞、降落与返航的实现

获取控制器

API Reference:FlightController()

“点击API可跳转DJI Developer官网API相应位置 ”

创建获取飞行控制器的 getFlightController() 方法

大疆Mobile SDK API中对FlightController() 类的描述

飞行控制器的功能由飞行控制器类定义,飞行控制器对象可通过以下步骤获取:

(1)通过 DJISDKManager 获取产品基类(BaseProduct)对象,并判断是否为无人机对象

(2)在 Android 中需要通过飞行控制器对象的 isConnected() 方法判断是否与无人机成功连接

具体代码实现:

    //获取无人机的飞行控制器private FlightController getFlightController() {BaseProduct product = DJISDKManager.getInstance().getProduct();if (product != null && product.isConnected()) {if (product instanceof Aircraft) {return ((Aircraft) product).getFlightController();}}return null;}

起飞与取消起飞

API Reference:startTaskoff()、cancelTaskoff()

“点击API可跳转DJI Developer官网API相应位置 ”

有关 startTakeoff(…) 方法的描述

有关 cancelTakeoff(…) 方法的描述题

通过飞行控制器的自动起飞自动精准起飞方法可实现无人机的起飞动作。

自动起飞方法必须在电机关闭时调用,并在起飞后0.5m左右悬停并回调。对于具有下方视觉定位的无人机,可通过自动精准起飞方法在起飞的6m之内获得其周围视觉定位记忆,当无人机再次降落时即可降落到相对更加准确的位置。

具体代码实现:

实现 takeoff()cancelTakeoff() 方法,通过飞行控制器对象的 startTakeoff(…) 方法实现起飞功能,通过飞行控制器对象的 cancelTakeoff(…) 方法实现取消起飞功能

    //起飞private void takeoff() {FlightController flightController = getFlightController();if (flightController != null) {flightController.startTakeoff(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast(djiError.toString());} else {showToast("开始起飞!");}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}//取消起飞private void cancelTakeoff() {FlightController flightController = getFlightController();if (flightController != null) {flightController.cancelTakeoff(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast(djiError.toString());} else {showToast("取消起飞成功!");}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}

降落与取消降落

API Reference:startLanding()、cancelLanding()

“点击API可跳转DJI Developer官网API相应位置 ”

有关 startLanding(…) 方法的描述

有关 cancelLanding(…) 方法的描述

通过飞行控制器的自动降落方法可实现无人机的降落动作。

对于具有降落保护功能(下方避障功能)的无人机,无人机在距离地面 0.3m 时会对地面进行检测。如果检测通过,则自动进行降落;如果检测不通过,则需要通过确认自动降落的方法继续执行降落程序。

实现 landing()cancelLanding() 方法,通过飞行控制器对象的 startLanding(…) 方法实现降落功能,通过飞行控制器的 cancelLanding(…) 方法实现取消降落功能。

具体代码实现: 

    //降落private void landing() {FlightController flightController = getFlightController();if (flightController != null) {flightController.startLanding(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("开始降落!");} else {showToast(djiError.toString());}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}//取消降落private void cancelLanding() {FlightController flightController = getFlightController();if (flightController != null) {flightController.cancelLanding(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("取消降落成功!");} else {showToast(djiError.toString());}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}

在 Android 中,是否需要确认降落需要通过飞行控制器状态(FlightControllerState)的isLandingConfirmationNeeded() 方法获取。如需要确认降落,则可通过飞行控制器类的confirmLanding(…) 方法继续降落。


返航与取消返航

API Reference: startGoHome()、cancelGoHome()

“点击API可跳转DJI Developer官网API相应位置 ”

有关 startGoHome(…) 方法的描述

有关 cancelGoHome(…) 方法的描述

实现 home()cancelhome() 方法,通过飞行控制器对象的 startGoHome(…) 方法实现返航功能,通过飞行控制器的 cancelGoHome(…) 方法实现取消返航功能。

具体代码实现:

    //返航private void home() {FlightController flightController = getFlightController();if (flightController != null) {flightController.startGoHome(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("开始返航!");} else {showToast(djiError.toString());}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}//取消返航private void cancelHome() {FlightController flightController = getFlightController();if (flightController != null) {flightController.cancelGoHome(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast("取消返航成功!");} else {showToast(djiError.toString());}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}

返航高度的设置与获取

API Reference:  setGoHomeHeightInMeters()、getGoHomeHeightInMeters()

“点击API可跳转DJI Developer官网API相应位置 ”

有关 setGoHomeHeightInMeters(…) 方法的描述

返航高度应设置在20~500m 的范围内,切不超过得醒的最大高度。

当返航高度设置过低时,会返回类 “The go home altitude is too low (lower than 20m)” 的错误提示;当设置的返航高度过高时,会返回类似 “The go home altitude is too high (higher than max flight height)” 的错误提示。

有关 getGoHomeHeightInMeters(…) 方法的描述

实现 setGoHomeHeight()getGoHomeHeight() 方法,通过飞行控制器对象的 setGoHomeHeightInMeters(…) 方法实现设置返航高度功能,通过飞行控制器的 getGoHomeHeightInMeters(…) 方法实现获取返航高度功能。

具体代码实现:

    //设置返航高度private void setHomeHeight() {//设置返航高度文本里final EditText editText = new EditText(this);//限定只能输入数字editText.setInputType(InputType.TYPE_CLASS_NUMBER);new AlertDialog.Builder(this).setTitle("请输入返航高度(m)").setView(editText).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {int height = Integer.parseInt(editText.getText().toString());final FlightController flightController = getFlightController();if (flightController != null) {flightController.setGoHomeHeightInMeters(height, new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {if (djiError != null) {showToast(djiError.toString());} else {showToast("返航高度设置成功!");}}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}}).setNegativeButton("取消", null).show();}//获取返航高度private void getHomeHeight() {final FlightController flightController = getFlightController();if (flightController != null) {flightController.getGoHomeHeightInMeters(new CommonCallbacks.CompletionCallbackWith<Integer>() {@Overridepublic void onSuccess(Integer integer) {showToast("返航高度为:" + integer + "米");}@Overridepublic void onFailure(DJIError djiError) {showToast("获取返航高度失败:" + djiError.toString());}});} else {showToast("飞行控制器获取失败,请检查飞行控制器是否连接正常!");}}

在 setGoHomeHeight() 方法中,通过 AlertDialog 类弹出对话框,用于用户输入返航高度,由于 setView(editText) 语句,将输入内容限定为整形数字。

设置返航高度对话框

在关闭对话框后,调用飞行控制器的 setGoHomeHeightInMeters(…) 方法,并传入返航高度和回调函数。在 getGoHomeHeight() 方法中,其回调方法 onSuccess(Integer height) 中的 height 参数返回了无人机的返航高度。


自定义提示

代码中均使用 showToast() 方法来实现在主线程中显示提示的功能,也可直接使用 Toast() 提示,将文中代码涉及 showToast() 的部分更换为 Toast() 

    //在主线程中显示提示private void showToast(final String toastMsg) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), toastMsg, Toast.LENGTH_LONG).show();}});}

按住键盘的 Crtl 键,鼠标左键单击Toast方法,即可在 Android Studio 中跳转到 Toast 类

public class Toast {public static final int LENGTH_LONG = 1;public static final int LENGTH_SHORT = 0;public Toast(Context context) {throw new RuntimeException("Stub!");}public void show() {throw new RuntimeException("Stub!");}public void cancel() {throw new RuntimeException("Stub!");}/** @deprecated */@Deprecatedpublic void setView(View view) {throw new RuntimeException("Stub!");}/** @deprecated */@Deprecated@Nullablepublic View getView() {throw new RuntimeException("Stub!");}public void setDuration(int duration) {throw new RuntimeException("Stub!");}public int getDuration() {throw new RuntimeException("Stub!");}public void setMargin(float horizontalMargin, float verticalMargin) {throw new RuntimeException("Stub!");}public float getHorizontalMargin() {throw new RuntimeException("Stub!");}public float getVerticalMargin() {throw new RuntimeException("Stub!");}public void setGravity(int gravity, int xOffset, int yOffset) {throw new RuntimeException("Stub!");}public int getGravity() {throw new RuntimeException("Stub!");}public int getXOffset() {throw new RuntimeException("Stub!");}public int getYOffset() {throw new RuntimeException("Stub!");}public void addCallback(@NonNull Toast.Callback callback) {throw new RuntimeException("Stub!");}public void removeCallback(@NonNull Toast.Callback callback) {throw new RuntimeException("Stub!");}public static Toast makeText(Context context, CharSequence text, int duration) {throw new RuntimeException("Stub!");}public static Toast makeText(Context context, int resId, int duration) throws NotFoundException {throw new RuntimeException("Stub!");}public void setText(int resId) {throw new RuntimeException("Stub!");}public void setText(CharSequence s) {throw new RuntimeException("Stub!");}public abstract static class Callback {public Callback() {throw new RuntimeException("Stub!");}public void onToastShown() {throw new RuntimeException("Stub!");}public void onToastHidden() {throw new RuntimeException("Stub!");}}
}

大疆 DJI Mobile SDK 开发:模拟器调试相关推荐

  1. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)

    大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...

  2. Android 大疆无人机Mobile Sdk开发,如何输出Log日志

    职场小白迷上优美句子: <断章> -- 卞之琳 你在桥上看风景, 看风景的人在楼上看你. 明月装饰了你的窗子, 你装饰了别人的梦. 通过大疆 "桥" 连接,查看日志 精 ...

  3. 大疆无人机安卓Sdk开发rtmp推流

    大疆无人机安卓Sdk开发rtmp推流

  4. 【大疆DJI】安卓开发实习历程- 0.前期准备到面试(HR电话初面+技术一面+技术二面/终面+OC)

    目录 前言 实习选择 0. 腾讯云 1. 面试复盘 2. 海投简历 大疆HR电话初面 大疆技术一面 0. 面试形式 1. 问题准备 2. 面试经过(70 mins) 大疆技术二面(终面) 0. 面试形 ...

  5. 大疆DJI Android Mobile SDK 开发问题汇总

    大疆DJI Android Mobile SDK 开发问题汇总 前言 SDK Api ANR(调用DJISDKManager.getInstance() 死锁.无响应) ClassNotFoundEx ...

  6. 【DJI Mobile SDK】RTMP 推流卡顿问题

    /** * 只对作者个人理解的功能进行描述说明,参考官方说明文档 * 需要其他功能教程或说明请留言或私信 * 需要其他合作请留言或私信 * auth by antman-s */ 项目场景: 使用大疆 ...

  7. 大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目

    PS:最近又涉及该项目,增加部分没写内容,记录下详细步骤. 上一篇文章讲到了怎么使用DJI mobile SDK,这次主要讲解DJI mobile SDK和DJI onboard SDK联合开发. a ...

  8. 大疆无人机二次开发简介-引入DJI mobile SDK 4.8

    基于android studio 3.5 1.引入DJI mobile SDK 4.8和DJI UX SDK 4.8 部分build.gradle如下 apply plugin: 'com.andro ...

  9. 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointMission

    大疆无人机安卓Mobile Sdk开发(一)简单介绍 大疆无人机安卓Mobile Sdk开发(二)连接无人机,获取无人机信息 大疆无人机安卓Mobile Sdk开发(三)制定航点任务WaypointM ...

最新文章

  1. matlab图片插值数据_使用双线性插值法放大图像(matlab实现)
  2. Synchronize对象属性改变
  3. 计算机视觉与深度学习 | 粒子群算法与遗传算法(GA)及与蚁群算法(ACO)比较
  4. Python——七段数码管绘制
  5. Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码
  6. UML模型中的图-静态图【类图、对象图】
  7. java三个取最大值、菜单新增修改、猜数字大小
  8. 中文情感分析——snownlp类库 源码注释及使用
  9. Socket通信案例
  10. LeaRun快速开发平台:企业供应链管理系统解决方案
  11. 【小米商城首页简单设计】
  12. 开源设计和原型制作平台Penpot
  13. Python,OpenCV制作全透明图,简单的图片
  14. 遥感影像的特征空间图
  15. 实验记录 | somatic.pl运行1
  16. 刘畅清华大学计算机学院,刘畅
  17. 计算机视觉 牛人主页
  18. python数据分析实战之超市零售分析
  19. SpringBoot单元测试断言 assertions
  20. 代码实现:圣诞树效果(易懂,必会)/用html实现圣诞树效果

热门文章

  1. 想进阿里必须啃透的 13 道 MySQL 面试题
  2. W5100硬件设计和调试要点
  3. SQLite3封装类CppSQLite,超牛逼
  4. 【EXCEL学习笔记】
  5. Linux系统重装U盘启动出现“Failed to load ldlinux.c32解决办法
  6. Pytorch二维卷积 conv2d 使用/源码/手写实现conv2d/手写向量内积实现conv2d/转置卷积实现——学习笔记
  7. 2023-05-23-数据结构课程设计
  8. B站网页黑白色转彩色(油猴)
  9. 【串口发送中断】基于赛元单片机使用三合一串口的UART功能
  10. [机器学习导论]—— 第四课——决策树