一、launcher
有远程桌面client正连接着时,安装launcher.apk,无论是用android自带的资源管理器中安装,还是调用SDL_UpdateApp安装,安装完apk后,android自动运行新版本laucher,很快。这个新启动launcher会被android杀死。
没找到原因,但发现一个方法:若当前没有远程桌面client正连接着,这个安装后自动运行的新版本launcher不会被android杀死。
正是因为这方法,launcher源码,在实现升级时,调用SDL_UpdateApp前会执行instance->unregister_server(server_rdpd),目的是关闭所有正连接着client。这里关闭没用更直接的像RdpServer::CloseAllConnection(),是既然升级后肯定要退出原launcher,那不如简单、彻底地关server_rdpd服务。
但是,升级时遇到另一个问题。安装完后launcher.apk后,android随机会发生没有自动运行新版本launcher。测试下来,即使一直没有client连接着,也会出现这个问题。而在出问题时,android确定是调用了startActivity。
<aosp>/packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java ------ public class InstallAppProgress extends Activity implements View.OnClickListener, OnCancelListener { if (getIntent().getBooleanExtra("AutoInstall", false) && enabled) { // [leagor added] // copy from onClick(View v).v==mLaunchButton try { // 在出现随机没有自动运行新版本launcher时,也会进入这在 // 而且生成mLaunchIntent时用的mAppInfo.packageName是com.kos.launcher startActivity(mLaunchIntent); } catch (ActivityNotFoundException e) { Log.e(TAG, "Could not start activity", e); } clearCachedApkIfNeededAndFinish(); return; } else if (enabled) { mLaunchButton.setOnClickListener(InstallAppProgress.this); } else { mLaunchButton.setEnabled(false); } } }
没到找这问题原因。要是一直没解决,只能建议用户若是1分钟后,client还是无法连接,那重启设备。
二、trotate_to_yaw
对trotate_to_yaw,是360度转时。
- 总是以逆时针方向转。
- 到某个中间goal,不会认为转得太大,导致超过它太多,然后为缩小误差又转回来。也就是说,只会逆时针转。
- step_degree。用于设置此次360度会有哪些中间点goal。app可以让在“到”了那些中间点时,做一些特定操作。像抓拍任务把setp_degre设为了90,表示在90、180、270时要各抓拍一张,加上一开始“0”时一张,此次抓拍四张。
在使用
- <apps-src>/apps/libleagor_khome/camera2.cpp。抓拍任务,用于实最一次最多抓拍4张图像。
- <apps-src>/apps/launcher/moveit_calculator.cpp。机械臂,用于最多转一图,以查到目标物在哪。
app判断是否转到goal时,建议用以下逻辑。
void tsnapshot::rtyaw_slice() { ... if (rtyaw_.reaching_goal) {
reaching_goal是true,表示正在转向某个中间点goal
double ang_diff = angles::shortest_angular_distance(curr_yaw, rtyaw_.goal); const double threshold = DEG2RAD(10); if (ang_diff <= threshold) {
认为符合转到goal了。
} ... } ... }
判断是否转到goal,用的条件是“ang_diff <= threshold”,不是fabs(ang_diff) <= threshold。也就是说,要是ang_diff < 0,那不管多小,都认为符合条件。这对应用了上面(2),"不会认为转得太大,导致超过它太多,然后为缩小误差又转回来"。
app要修改step_degree,不要直接改字段,像rtyaw.step_degree = 90,而是调用set_step_degree。对180时,为什么要改到179?这是为避免angles::shortest_angular_distance(...)算出-180。举个例子,如果step_degree是180,那初始角度是0,下个goal就是180,shortest_angular_distance(0, 180)会算出是-180,而不是180,导致认为要顺时针转。改为179,是小了1,但trotate_to_yaw转到角度本不那么严密,小个2度没啥影响。