R Field - 工作
type: channel
link: http://ramlife.org/category/%E5%B7%A5%E4%BD%9C/
description: 所有工作项目相关的
items: lubancat 鲁班猫编译与简单使用
items: 泰山派 系统编译记录
items: 摄像头实际角度比标称小
items: esp32 配网方式
items: mpu6050 使用
items: ros2 中用于串口通信的 serial 库
items: fragment stack 保存数据
items: [转] Android studio中使用Recyclerview与Activity跳转
items: [转] 这些年，我爬过的 Android 坑 | 持续更新
items: android FileProvider

lubancat 鲁班猫编译与简单使用
type: item
date: 2025-05-20T14:46:00+08:00
description: 源码准备 aw-image-build.tar.gz 放入共享文件夹 tar xvf aw-image-build.tar.gz -C ~/linux_h618 注意，虽然后缀名是 tar.gz，但是这个包实际上只用 tar 打包，并没有用 gzip 进行压缩。。。 export PATH=/home/ptz/linux_h618/aw-image-build/toolchains/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH 加入到 .bashrc 中，把交叉编译工具链加入环境变量 编译 使用 sudo -i, 密码 temppwd ip a iw dev wlan0 scan | grep -A 30 Figurobot vim /etc/wpa_supplicant/wpa_supplicant.conf network={ ssid="Figurobot" psk="Figurobot99" key_mgmt=WPA-PSK } wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf ifconfig, 或者 dhclient wlan0 # 获取IP地址 date -s "2025-05-15 16:00:00" timedatectl set-ntp true , 然后 timedatectl 查看前两个是不是 yes 默认 openssh 就是 ok 的。 stty -F /dev/ttyS3 -echo 关闭回显

泰山派 系统编译记录
type: item
date: 2025-05-19T20:44:00+08:00
description: vmware 安装 ubuntu cpu 8核，ram 16g 光驱挂载 iso 安装系统 设置光驱关闭 虚拟机 电源 restart Ubuntu 18.04.6 LTS (Bionic Beaver) Ubuntu 20.04.6 LTS (Focal Fossa) 常用配置 分辨率: 右键 display setting 换源: 左下角，software & update，里面选择 aliyun vmware tools 旧的 vm-tools，不能复制粘贴 新的 open-vm-tools，可以复制粘贴 vm-tools https://packages-prod.broadcom.com/tools/frozen/linux/linux.iso 下载 vmware tools 光驱挂载 linux.iso 打开桌面的 vmware tools 盘，然后复制 tar.gz 文件到桌面，再 extrace here 到桌面。 cd Desktop/VMwareTools-10.3.26-22085142/vmware-tools-distrib/, sudo ./vmware-install.pl ，然后 yes，输入密码，一路回车键接收默认即可安装。 参考 VMware support for open-vm-tools Installing VMware Tools in an Ubuntu Virtual Machine open-vm-tools sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools open-vm-tools-desktop 共享盘有时候没有自动挂载，需要手动或设置自动挂载 #手动挂载 sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other #自动挂载 #打开/etc/fstab，添加 .host:/ /mnt/hgfs fuse.vmhgfs-fuse auto,allow_other 0 0 参考 VMware虚拟机和主机间复制粘贴共享剪贴板 vmware和主机间复制粘贴文件、文字 立创泰山派训练营学习笔记--Linux SDK编译环境搭建与验证（一） 设置 具体虚拟机 -> 设置 -> 选项 共享文件夹-> 总是启用，然后添加共享文件夹 vmware tools -> 开启时间同步。 配置源 左下角所有应用中，选择 software & updates download from 中选择 other 选择 china -> aliyun 确定 sudo apt update ssh sudo apt install openssh-server 或者 sudo apt install ssh 开发环境 sudo apt-get install git ssh make gcc libssl-dev liblz4-tool expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib unzip device-tree-compiler ncurses-dev python vim 源码准备 linux cd ~/ mkdir -p linux_lckfb/tspi_linux_sdk_repo_20240131/ cd /mnt/hgfs/virtual_share tar xvfz tspi_linux_sdk_repo_20240131.tar.gz -C ~/linux_lckfb/tspi_linux_sdk_repo_20240131/ cd ~/linux_lckfb/tspi_linux_sdk_repo_20240131/ .repo/repo/repo sync -l -j88 把 buildroot_dl_4c7c9df616fb.tar.gz 解压，其中的 buildroot/dl 中的压缩文件，全部放到 tspi_linux_sdk_repo_20240131 下面对应的 buildroot/dl 中，节省后续的下载时间。 板级配置 ./build.sh device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk 选择BoardConfig-rk3566-tspi-v10.mk，这里序列号是3 ./build.sh -…

摄像头实际角度比标称小
type: item
date: 2025-05-16T20:22:00+08:00
description: 问题 买的 ov2640，标称 60 度，实际测试角度只有 30度左右？ 解答 一般标称的 60 度，指的是场角度。我们实际测试的角度，指的是水平角度。 大概是 0.5 的关系。 参考 摄像头视场角-对角线视场角-水平视场角

esp32 配网方式
type: item
date: 2025-05-14T19:30:00+08:00
description: 问题 esp32 主要有几种配网方式？ 解答 AP 配网 esp32 作为ap，手机等设备连接到 esp32 上面，把账号密码输入，esp32 使用这些账号和密码连接。 smartconfig esp32 混杂模式，监听网络广播，使用官方的 app ESPTOUCH 即可配网 airkiss 微信配网，和 smartconfig 本质是一样的。 蓝牙配网 需要官方的蓝牙配网的 app才行。 参考 图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss) ESP32-IDF学习笔记(1)---基于WIFI_PROV API的两种配网 使用Arduino开发ESP32（二十八）：WiFiProvisioning 官方说明文档自翻

mpu6050 使用
type: item
date: 2025-04-29T18:47:00+08:00
description: mpu6050 通过 I2C 来驱动，可以使用卡尔曼滤波姿态解算。获取的传感器原始数据中，三个方向的加速度，有一个方向是 9.8 的重力加速度。 参考代码 https://blog.csdn.net/ling3ye/article/details/51360568 #include "Wire.h" #include "I2Cdev.h" #include "MPU6050.h" MPU6050 accelgyro; unsigned long now, lastTime = 0; float dt; //微分时间 int16_t ax, ay, az, gx, gy, gz; //加速度计陀螺仪原始数据 float aax=0, aay=0,aaz=0, agx=0, agy=0, agz=0; //角度变量 long axo = 0, ayo = 0, azo = 0; //加速度计偏移量 long gxo = 0, gyo = 0, gzo = 0; //陀螺仪偏移量 float pi = 3.1415926; float AcceRatio = 16384.0; //加速度计比例系数 float GyroRatio = 131.0; //陀螺仪比例系数 uint8_t n_sample = 8; //加速度计滤波算法采样个数 float aaxs[8] = {0}, aays[8] = {0}, aazs[8] = {0}; //x,y轴采样队列 long aax_sum, aay_sum,aaz_sum; //x,y轴采样和 float a_x[10]={0}, a_y[10]={0},a_z[10]={0} ,g_x[10]={0} ,g_y[10]={0},g_z[10]={0}; //加速度计协方差计算队列 float Px=1, Rx, Kx, Sx, Vx, Qx; //x轴卡尔曼变量 float Py=1, Ry, Ky, Sy, Vy, Qy; //y轴卡尔曼变量 float Pz=1, Rz, Kz, Sz, Vz, Qz; //z轴卡尔曼变量 void setup() { Wire.begin(); Serial.begin(115200); accelgyro.initialize(); //初始化 unsigned short times = 200; //采样次数 for(int i=0;i<times;i++) { accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值 axo += ax; ayo += ay; azo += az; //采样和 gxo += gx; gyo += gy; gzo += gz; } axo /= times; ayo /= times; azo /= times; //计算加速度计偏移 gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移 } void loop() { unsigned long now = millis(); //当前时间(ms) dt = (now - lastTime) / 1000.0; //微分时间(s) lastTime = now; //上一次采样时间(ms) accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值 float accx = ax / AcceRatio; //x轴加速度 float accy = ay / AcceRatio; //y轴加速度 float accz = az / AcceRatio; //z轴加速度 aax = atan(accy / accz) * (-180) / pi; //y轴对于z轴的夹角 aay = atan(accx / accz) * 180 / pi; //x轴对于z轴的夹角 aaz = atan(accz / accy) * 180 / pi; //z轴对于y轴的夹角 aax_sum = 0; // 对于加速度计原始数据的滑动加权滤波算法 aay_sum = 0; aaz_sum = 0; for(int i=1;i<n_sample;i++) { aaxs[i-1] = aaxs[i]; aax_sum += aaxs[i] * i; aays[i-1] = aays[i]; aay_sum += aays[i] * i; aazs[i-1] = aazs[i]; aaz_sum += aazs[i] * i; } aaxs[n_sample-1] = aax; aax_sum += …

ros2 中用于串口通信的 serial 库
type: item
date: 2023-07-01T09:45:00+08:00
description: 在 ros 中，用于串口通信的是 rosserial，在 ros2 中，替代的是 micro-ROS. 创建项目 使用 stm32cube 先创建好一个工程，配置好相关的参数。 生成 micro-ros 静态库 可以先看下介绍 https://github.com/micro-ROS/micro_ros_setup 在项目文件夹下面，clone 一下 https://github.com/micro-ROS/micro_ros_stm32cubemx_utils 进入 micro_ros_stm32cubemx_util 之后，切换到 ros 版本分支，比如 foxy 根据需要，决定是否使用 dos2unix。 修改 Makefile，增加如下: ####################################### # micro-ROS addons ####################################### LDFLAGS += micro_ros_stm32cubemx_utils/microros_static_library/libmicroros/libmicroros.a C_INCLUDES += -Imicro_ros_stm32cubemx_utils/microros_static_library/libmicroros/microros_include Add micro-ROS utils C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/custom_memory_manager.c C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_allocators.c C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_time.c Set here the custom transport implementation C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_transports/dma_transport.c print_cflags: @echo $(CFLAGS) + 拉取生成 micro-ros 库的 docker `docker pull microros/micro_ros_static_library_builder:foxy` + 运行 `docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDER=micro_ros_stm32cubemx_utils/microros_static_library microros/micro_ros_static_library_builder:foxy` + 查看生成的静态库 `micro_ros_stm32cubemx_utils/microros_static_library/libmicroros/libmicroros.a` # 使用 micro-ros + 参考 micro_ros_stm32cubemx_utils 下面的 sample_main ，修改项目自身的 main # 参考: + [How to setup micro-ROS on any STM32 microcontroller](https://www.youtube.com/watch?v=xbWaHARjSmk) + [【分享】microROS 和 rosserial 对比](https://fishros.org.cn/forum/topic/1960/%E5%88%86%E4%BA%AB-microros-%E5%92%8C-rosserial-%E5%AF%B9%E6%AF%94) + [stm32系列MICROROS环境配置（使用cubemx+clion+freertos）](https://fishros.org.cn/forum/topic/2423/stm32%E7%B3%BB%E5%88%97microros%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE-%E4%BD%BF%E7%94%A8cubemx-clion-freertos)

fragment stack 保存数据
type: item
date: 2022-06-04T11:28:00+08:00
description: 背景 需要在 fragment 进行 replace 然后 pop 回来之后，一些选择项还是原来的选项。 方法 查阅了很多资料，发现如果是 view 类型那么可以被自动保存，非 view 的就需要我们自己来保存了。 按照 fragment 的生命周期来说，需要在 onDestroyView 中进行保存，在 onCreateView 中进行读取。 如果是比较简单的，那么直接使用本身生成的 fragement 类型中的 setArguments 和 getArguments 来得到 bundle 来操作即可。 如果是比较复杂的，最好自己来实现一个保存和读取的，方便控制。然后在 onDestroyView, onCreateView 里面进行调用即可。 public Bundle setSaveBundle(Bundle bundle) { if (bundle == null) { bundle = new Bundle(); } bundle.putInt("type_index", analysisTypeLastSelected); DLog.d(TAG, "setSaveBundle: " + "type_index: " + analysisTypeLastSelected); return bundle; } public void getSaveBundle(Bundle bundle) { if (bundle == null) { DLog.d(TAG, "getSaveBundle: " + "null!"); return; } analysisTypeLastSelected = bundle.getInt("type_index"); DLog.d(TAG, "getSaveBundle: " + "type_index: " + analysisTypeLastSelected); } 参考: [译] 保存/恢复 Activity 和 Fragment 状态的最佳实践 https://segmentfault.com/a/1190000006691830 切换Fragment时实现数据保持 https://www.cnblogs.com/zhujiabin/p/4192613.html Pro Android学习笔记（四一）：Fragment（6）：数据保留 https://blog.csdn.net/flowingflying/article/details/12749403 Android Fragment 生命周期onCreatView、onViewCreated https://blog.csdn.net/asdf717/article/details/51383750 Android中Fragment数据保存和恢复 https://www.jianshu.com/p/015c79bedb41 onSaveInstanceState()和onRestoreInstanceState()使用详解 https://www.jianshu.com/p/27181e2e32d2 Android 使用onSaveInstanceState保存数据 https://blog.csdn.net/qq_34694875/article/details/109530012 android onSaveInstanceState方法 https://www.jianshu.com/p/5dde143a143f Android Fragment 在返回栈popBackStack() ，返回时onResume问题 https://blog.csdn.net/qq_34983989/article/details/78126362 Android Fragment回退栈管理(popBackStack) https://blog.csdn.net/qq_35988274/article/details/100518346

[转] Android studio中使用Recyclerview与Activity跳转
type: item
date: 2022-06-03T15:24:00+08:00
description: 转自: https://blog.csdn.net/nonamepao/article/details/120943245 项目介绍 本次项目在上一次类微信界面的设计上，增加了用recyclerview实现的模拟微信聊天联系人列表，其中从列表跳转到联系内容的部分使用了activity的跳转。 设计 列表界面 用一个xml来设计列表的界面，这里采用了最简单的单个textview作为标题模式。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp" xmlns:tools="http://schemas.android.com/tools" android:layout_margin="8dp" android:orientation="vertical"> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="8dp" android:gravity="center" android:text="TextView" /> </LinearLayout> 联系内容界面 显示联系内容的界面新建两个activity来实现，在activity2.xml文件作为被跳转的布局文件用来显示联系内容。 activity_1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".Activity1"> <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="这是第一个activity" android:textSize="40sp" /> </LinearLayout> activity_2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Activity2"> <TextView android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="联系内容" android:textSize="40dp" /> </LinearLayout> 列表的展示 修改之前的weixin.java文件，调用布局文件来实现列表的展示 package com.example.wechatlike; import android…

[转] 这些年，我爬过的 Android 坑 | 持续更新
type: item
date: 2022-06-03T12:24:00+08:00
description: 转自: https://blog.csdn.net/weixin_46093316/article/details/106138435 总结目录 视图篇 如何理解非主线程可以更新UI dialogFragment 全屏时左右留空的解决方案 dialogFragment 全屏时状态栏出现黑色布局的解决方案 多个fragment 切换重叠的解决方案 多个fragment 保存状态时可能出现 TransactionTooLargeException 的解决方案 recyclerview 调用 notifyItemRemoved 方法移除某个 Item 之后因为引用 position 引起 crash 的原因 recyclerview 局部刷新Item时会因为默认动画导致闪烁的解决方案 recyclerview 中的 item 出现莫名的偏移滚动 recyclerview 内容超过一屏时，findFistCompletelyVisibleItemPosition 会返回 -1 的原因 textview 中富文本点击事件拦截了长按事件的解决方案 如何禁止 ViewPager 的滑动 如何仿蘑菇街/马蜂窝 Viewpager 装载图片之后切换时动态变更高度 如何控制 appbarLayout 随时定位到某个位置 如何禁止 appbarLayout 滚动 edittext 未能响应 onClickListener 事件的解决方案 使用 listview 或gridview 的处理 item 的 state_selected 事件是无效的解决方案 解决5.0以上Button自带阴影效果的方案 针对 onSingleTapUp 和 onSIngleTapConfirmed 的使用区别 如何使用layer-list画三角形 关于属性动画中旋转 View 时部分机型出现 View 闪烁的解决方案 关于 ConstraintLayout 的代码布局下的注意事项 TextView 在 6.0 版本下设置单行尾部缩略的坑 服务篇 后台手动清理应用之后，service中启动的notifications并没有消失的解决方案 全局的Context使用更为优雅的获取方案 线程篇 建议新起线程不要随便调用网络请求，一般的newThread没有looper队列，参考handlerThread 网络篇 Retorfit get 请求参数出现错误的解决方案 数据篇 如何优雅处理 sqlite 多线程读写问题 如何理解 Intent 传递数据出现 TransactionTooLargeException 的问题 机型系统适配篇 如何解决 NatigationBar 被 PopupWindow 遮挡的问题 如何解决MIUI系统后台无法 toast 的问题 如何解决关闭通知栏权限无法弹出 toast 的问题 如何适配 vivo 等双面屏幕 如何解决华为设备产生太多 broadcast 导致crash的问题 各种通知栏的适配方案 解决针对魅族推送内容限制的问题 解决从系统安装起安装应用后启动，Home 隐藏后 Launcher 重复启动的问题 针对有launcher做为Activity的应用，在完全没有启动下收到第三方推送（小米，华为，魅族）/分享拉起的注意事项 针对 App 多场景拉起场景下的场景判断分析 8.0 部分 ROM 出现 Only fullscreen opaque activities can request orientation 的解决方案 9.0 android 支持明文连接（Http) 编译构建篇 travis-ci 高版本androidO编译遇到 license 没通过编译失败的解决方案 Dalvik 支持的 android 版本下进行分包执行会有一些限制 Dalvik 分包构建每一个 dex 文件时可能出现 java.lang.NoClassDefFoundError Java 8 methods of java.lang.Long and java.lang.Character are not desugared by D8 databinding 中 findBinding vs getBinding 的场景区别 版本构建出现 Gradle sync failed: Cannot choose between the following configurations of project gradle 配置本地离线包 解决kvm/jvm 编译时 -classpath 遇到的分割及空格的问题 databinding NoSuchMethodError with buildTool 3.4.0 AS连接真机调试出现 debug info can be…

android FileProvider
type: item
date: 2022-04-30T20:54:00+08:00
description: 参考: 安卓使用FileProvider.getUriForFile出现问题解决 https://blog.csdn.net/luo13788507590/article/details/98615151 Couldn‘t find meta-data for provider with authority https://blog.csdn.net/haiyoumeizhuce/article/details/99981936 解决： Couldn‘t find meta-data for provider with authority xxx.fileProvider https://blog.csdn.net/qq_31877171/article/details/114314648 安卓从6.0适配到7.0以上遇到的FileProvider相关问题踩坑 https://blog.csdn.net/qq_36165311/article/details/108777003 android7.0之后版本，FileProvider适配问题 https://blog.csdn.net/oudetu/article/details/78444097 Failed to find configured root that contains https://www.cnblogs.com/fengfenghuifei/p/10725603.html FileProvider 的使用(Failed to find configured root that contains/storage/emulated/0/DCIM/ ) https://blog.csdn.net/leilifengxingmw/article/details/57405908 java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0 https://blog.csdn.net/m0_46366678/article/details/113616407 java.lang.IllegalArgumentException:未能找到包含/storage/emulated/0/Pictures/的已配置根目录 https://cloud.tencent.com/developer/ask/sof/145862 java.lang.IllegalArgumentException: Failed to find configured root that contains ..... https://blog.csdn.net/liu_xueping/article/details/103980700 java.lang.IllegalArgumentException: Failed to find configured root that contains ..... https://blog.csdn.net/songzi1228/article/details/83546066