造了四个轮子之后,我们上路跑一跑

介绍了四个轻量级开源项目:LightKV、LightEvent、Task和Doodle,涵盖高性能存储、事件通信、线程调度及图片加载。并基于Doodle组件,开发了一款图片浏览APP,支持花瓣网和unsplash图片素材展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

最近相继发布了四个开源项目,都是比较轻量的项目。
造完轮子,很自然的想到要弄个App来跑一下。
在搬APP出来之前,先介绍下这几个轮子吧。

二、轮子

昨晚我在秋名山输给一辆五菱宏光, 他用惯性飘移过弯,他的车很快,我只看到他有个修楼房漏水的招牌。
如果知道他是谁的话,麻烦你们跟他说一声:礼拜六晚,我会在秋名山等他。

秋明山车神之所以开得快,不单是因为技术好,车神老爸对车子的调优也很重要,比如给车配了好轮子……编不下去了 -_-

LightKV

项目地址:LightKV
高性能key-value存储组件,相比SharedPreferences有全方位的改进。
支持Kotlin属性委托,在Kotlin环境下使用,可以像读写变量一样读写配置。
推荐指数:

LightEvent

项目地址:LightEvent
轻量级事件通信方案(类似于EventBus的作用),不到50行代码。
简单到极致,使用也很方便。
推荐指数:

Task

项目地址:Task
实用的线程调度框架,针对App开发的使用场景做了适用性封装。
支持优先级,适配生命周期,支持任务分组,任务去重;
可直接执行任务,可用于RxJava, 可替换AsyncTask。
推荐指数:

Doodle

项目地址:Doodle
高效的图片加载框架。
功能完备,实现清晰。
推荐指数:

三、应用

最后一个组件Doodle的功能为图片加载,所以第一时间想到的就是做一个浏览图片相关的APP。
如果仅仅是加载本地相册什么的就没意思了,可以做一个浏览图片素材网站的APP。
当然不是直接拿WebView去打开别人的网站,这样体验不好;
可以解析网站中的图片地址(没错,就是爬虫-_-),用 RecyclerView + ImageView 显示,这样会比WebView流畅一些。

下面是几张效果图:

这些是从花瓣网下载的图片,花瓣网的素材还是不错的,而且更新得很快。
项目中预置了几个频道,图片展示则是瀑布流+分页加载。

遇到喜欢的图片想下载回来怎么办?
虽然功能简单,但是“刚需”还是要提供的:
可以设置存储路径,然后点击图片详情页右上角的“下载”即可。
侧滑栏可以点击“已下载”查看下载好的图片,或者设置路径到SDCard的Picture目录,用系统的图片浏览器打开-_-
有的图片是长图,详情页是用PhotoView显示的图片(提供友好的缩放交互), 其继承于ImageView, 然后对于宽或者高大约4096的图片,显示不出来。
所以遇到这样的图片,可以下载回来,用系统的图片浏览器打开……
主要是笔者一时没找到可以像PhotoView这样支持缩放,而又支持长图的控件。有用过这样的控件的读者可以推荐一下。

除了花瓣网之外,还支持老外的一个图片网站:unsplash
这个网站都是高清相机拍的图片,源文件分辨率超高,还好网站提供了指定分辨率下载的API,所以图片预览无压力。
遗憾的是这个网站没有按频道划分,只有关键字索引,不过也可以自定义关键字来作为频道分组了。

四、总结

上面四个组件中,最简单的LightEvent只有不到50行代码,最复杂的Doodle也不过100K,都是轻量级的组件。

最近Kotlin比较火,所以顺势尝试尽量用Kotlin来实现(改写)。
Kotlin编写代码确实相对Java总体上要更简洁,很多人说能省1/3的代码;
这个我没有具体去算过,从这段时间的体会来看,有部代码确实可以写得比Java简洁,尤其是集合运算,以及能用上Lambda的地方。

个人的体验是,写业务代码可以尽量用Kotlin,写基础组件还是用Java划算一些:
相对于业务代码,基础组件从Java到Kotlin,并不会减少多少代码,反而Jar包会变大,大约增加50%的体积。

五、下载

项目已发布到github, 项目地址:https://github.com/No89757/Collector

<think>我们正在讨论的是四轮小车的控制问题,特别是关于是否需要为每个轮子分别编写PID控制代码的问题。根据引用内容,四轮差速控制可以通过控制四个轮子的速度来实现平移、旋转和路径跟踪。这意味着每个轮子的速度都需要独立控制,但这并不意味着每个轮子都需要个独立的PID控制器。在实际应用中,通常我们会为整个小车系统设计个主控制器(例如路径跟踪的PID控制器),然后根据主控制器的输出(如期望的线速度和角速度)计算出每个轮子的期望速度(这称为运动学逆解),再为每个轮子的速度控制使用独立的PID控制器(或者更常见的,使用单独的电机速度环PID)。也就是说,每个轮子的电机速度控制可能需要个独立的PID控制器来确保该轮子能够达到期望的转速。但是,如果小车的控制目标不是精确控制每个轮子的速度,而是控制小车的整体运动(例如通过个主PID控制器输出小车的整体线速度和角速度),那么每个轮子的速度指令是通过运动学分解得到的,此时每个轮子的电机控制可能只需要个简单的速度环(可能是P或者PI控制,而不定需要完整的PID),甚至在某些情况下(如直流电机自带速度闭环)可能不需要额外的PID。总结:1.对于小车的整体运动控制(如路径跟踪),我们通常使用个主PID控制器(或者更高级的控制器)来计算期望的线速度和角速度。2.然后通过运动学逆解将期望的线速度和角速度分解为四个轮子的期望转速。3.为了确保每个轮子能够精确达到其期望转速,通常每个轮子的电机驱动会使用个独立的速度环PID控制器(这可以是电机驱动器内置的,也可以是我们在软件中实现的)。因此,答案是:通常每个轮子的电机速度控制需要个独立的PID控制器(或至少个速度闭环),但这取决于你的硬件和软件架构。如果电机驱动器已经内置了速度闭环(例如通过编码器反馈进行PID控制),那么在应用层你只需要发送速度指令,而不需要再为每个轮子编写PID代码。否则,你需要在应用层为每个轮子实现个速度环PID控制器。注意:这里有两个层次:-上层:小车整体的运动控制(例如路径跟踪PID,输出线速度v和角速度ω)-下层:每个轮子的速度控制(确保轮子按照上层分解出的速度旋转)所以,如果你需要精确控制每个轮子的转速(例如在差速控制中),那么每个轮子都需要个速度环PID。但如果你只是发送开环的PWM信号,而没有反馈,则无法保证速度的准确性。相关问题:1.如何计算四轮差速小车每个轮子的期望速度?2.电机速度环PID控制器的参数如何整定?3.四轮差速小车的运动学模型是怎样的?4.如果使用带编码器的电机,如何实现轮子的速度闭环?5.在路径跟踪中,如何设计上层PID控制器?</think>### 四轮小车是否需要独立的轮子PID控制? 在四轮差速控制的小车中,**每个轮子通常需要独立的PID控制器**,但具体实现层次取决于控制目标: #### 1. **轮速控制层(必须独立PID)** 每个轮子的电机都需要独立的速度环PID控制,确保实际转速精准跟踪目标转速。例如: ```python # 伪代码示例:轮子独立PID速度控制 class WheelPID: def __init__(self, kP, kI, kD): self.kP = kP self.kI = kI self.kD = kD self.prev_error = 0 self.integral = 0 def compute(self, target_speed, actual_speed): error = target_speed - actual_speed self.integral += error derivative = error - self.prev_error output = self.kP*error + self.kI*self.integral + self.kD*derivative self.prev_error = error return output # 四个轮子独立实例化 pid_fl = WheelPID(0.8, 0.01, 0.05) # 左前轮 pid_fr = WheelPID(0.8, 0.01, 0.05) # 右前轮 pid_rl = WheelPID(0.8, 0.01, 0.05) # 左后轮 pid_rr = WheelPID(0.8, 0.01, 0.05) # 右后轮 ``` **必要性**:电机特性差异、负载不均会导致转速偏差,独立PID可消除轮间扰动[^1]。 #### 2. **运动控制层(非必须独立PID)** 上层运动控制(如路径跟踪)通常使用**集中式PID**: - **平移控制**:输出统的线速度指令 $v_x$ - **旋转控制**:输出统的角速度指令 $\omega$ - 通过运动学模型分解到各轮: $$ \begin{cases} v_{fl} = v_x - \omega \cdot L/2 \\ v_{fr} = v_x + \omega \cdot L/2 \\ v_{rl} = v_x - \omega \cdot L/2 \\ v_{rr} = v_x + \omega \cdot L/2 \end{cases} $$ 其中 $L$ 为轮距,无需为平移/旋转单独设计4个PID。 #### 3. **优化方案** - **分层控制**: ```mermaid graph LR A[路径规划] --> B(运动PID控制器<br>计算v_x和ω) B --> C[运动学分解] C --> D{独立轮速PID} D --> E[电机驱动] ``` - **硬件加速**:若电机驱动器内置PID(如CAN总线电机),只需发送目标转速。 ### 结论 - **必须独立**:轮速控制层需4个独立PID确保转速精度 - **无需独立**:上层运动控制(路径跟踪等)用集中式PID+运动学分解 - **典型架构**:1个运动PID + 4个轮速PID ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值