BlueROV加舵机控制以及走过的弯路

news/2024/10/31 1:31:25/

BlueROV加舵机控制以及走过的弯路

因实验需求,需要在BlueROV上加上一个一自由度的机械臂,由一个水下舵机控制,水下舵机需要通过PWM控制,PWM输出由手柄控制。
思路也很简单:手柄——pixhawk——舵机
就是弯路走了好久。。。。。

一、手柄资源不足?

BlueROV在下水实验后发现,现有的按键基本都已经使用。只有上面还有两个按键没有使用,并且不具有保持功能
后面发现,手柄上有一个按键可以设置为shift按键,按住shift键,在按住别的按键可以切换按键的第二功能

二、PWM控制程序需要自己写?

这也是走的弯路最多的一步,因为舵机并不属于原本ROV上的一部分,因此认为BlueROV上的源代码并没有相关代码,于是从一个多月以前,就陆陆续续的开始看BlueROV的源代码,几十万行的源代码,一点一点的看,然而并没有什么收获,反而发现了pix上集成了非常庞大的功能。
首先看BlueROV手册的RCinput
在这里插入图片描述由于BlueROV中的硬件需求,Aux1和Aux2已经被占用了,所以新加的舵机优先采用Aux3接口,对应的按键功能是servo_3,查看QGC可以发现,在按键设置中包含servo_3这个功能
在这里插入图片描述在这里插入图片描述现在的任务就是写servo_3接口的输出程序,servo_3输出PWM控制舵机,任务完成,完美!
然而源代码又多又杂,每个代码之间的关联性又极强,如何加入PWM控制程序,并且加在什么地方,会不会损坏源程序都成了问题。
但是在ArduSub程序的手柄控制代码中/ardupilot/ArduSub/joystick.cpp中,有如下代码:

case JSButton::button_function_t::k_servo_3_inc:{SRV_Channel* chan = SRV_Channels::srv_channel(SERVO_CHAN_3 - 1); // 0-indexeduint16_t pwm_out = hal.rcout->read(SERVO_CHAN_3 - 1); // 0-indexedpwm_out = constrain_int16(pwm_out + 50, chan->get_output_min(), chan->get_output_max());ServoRelayEvents.do_set_servo(SERVO_CHAN_3, pwm_out); // 1-indexed}break;case JSButton::button_function_t::k_servo_3_dec:{SRV_Channel* chan = SRV_Channels::srv_channel(SERVO_CHAN_3 - 1); // 0-indexeduint16_t pwm_out = hal.rcout->read(SERVO_CHAN_3 - 1); // 0-indexedpwm_out = constrain_int16(pwm_out - 50, chan->get_output_min(), chan->get_output_max());ServoRelayEvents.do_set_servo(SERVO_CHAN_3, pwm_out); // 1-indexed}break;case JSButton::button_function_t::k_servo_3_min:case JSButton::button_function_t::k_servo_3_min_momentary:{SRV_Channel* chan = SRV_Channels::srv_channel(SERVO_CHAN_3 - 1); // 0-indexedServoRelayEvents.do_set_servo(SERVO_CHAN_3, chan->get_output_min()); // 1-indexed}break;case JSButton::button_function_t::k_servo_3_max:case JSButton::button_function_t::k_servo_3_max_momentary:{SRV_Channel* chan = SRV_Channels::srv_channel(SERVO_CHAN_3 - 1); // 0-indexedServoRelayEvents.do_set_servo(SERVO_CHAN_3, chan->get_output_max()); // 1-indexed}break;case JSButton::button_function_t::k_servo_3_center:{SRV_Channel* chan = SRV_Channels::srv_channel(SERVO_CHAN_3 - 1); // 0-indexedServoRelayEvents.do_set_servo(SERVO_CHAN_3, chan->get_trim()); // 1-indexed}break;

分别是servo_3输出的增加、减少、最大值、最小值、中间量,控制PWM输出,明显,PWM控制是已经集成进pix的

三、QGC设置

由于采购的BlueROV没有摄像头左右旋转的舵机,因此在设置QGC的时候,直接借用手柄上的mount_pan_left和mount_pan_right选项,设置这两个选项的通道,具体通道见下表
在这里插入图片描述可以看到Aux3对应的是通道11,于是

在这里插入图片描述在这里插入图片描述设置完成,上图右边是按住shift时,对应按键的功能。还可以更改所需PWM的最大值和最小值。

四、小结

实际上这一篇文章上一周就应该写了,一直拖到了现在,目前在准备舵机所需的硬件设备以及密封等。就这么很简单的一篇文章,实际上从3月中旬就开始做了,包括之前的编译环境搭配。直到最后解决了才发现是我们问题想偏了,想复杂了,最后根本就不用更改源代码。那我们看了这么久的代码就是白看了吗,也不是,如果不是看到了源代码,也没有想到pix的功能竟然如此强大。
或许后面的研究生生活都是这样,不断地走着弯路,不断地否定自己,但是最后能实现自己的小目标时候的欣喜,能盖过之前所有的怀疑和否定,然后去迎接下一个难题。
研究生生活,也不再是一个人的战场,更需要跟小伙伴一起努力想办法,或许你一言我一语问题就解决了,所有的渺小和微不足道,都是最后结果中的至关重要的一环。所以,不要高看自己,也不要看轻自己。未来的路还有很长。。。


http://www.ppmy.cn/news/523531.html

相关文章

NORDIC的打怪之旅(第二篇)

Nordic的52832芯片中有很多可以使用的协议,在其的官方文档中可以查看到(地址 在第一篇SDK的网址是一样的),其中使用最多的为spi,twi等,而twi中又完全兼容I2C协议,今天的目的主要是说明一下spi的…

领域驱动模型VO,BO,PO,DO,DTO概念及其区别

本文来说下领域驱动模型VO,BO,PO,DO,DTO 概念及其区别 文章目录 概述概念以及区别本文小结 概述 随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等)&#xff0c…

别了,DjVu!

原帖地址:http://www.comicer.com/stronghorse/water/software/djvu886.htm 别了,DjVu! 作者:马健 邮箱:stronghorsetom.com 主页:http://www.comicer.com/stronghorse 发布:2010.05.21 目录 一…

领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

本篇文章主要讨论一下我们经常会用到的一些对象:VO、DTO、DO和PO。 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: VO&a…

探索GaussDB(DWS)的过程化SQL语言能力

摘要:在当前GaussDB(DWS)的能力中主要支持两种过程化SQL语言,即基于PostgreSQL的PL/pgSQL以及基于Oracle的PL/SQL。本篇文章我们通过匿名块,函数,存储过程向大家介绍一下GaussDB(DWS)对于过程化SQL语言的基本能力。 本文分享自华为…

基于DGUS II 实现高性能GUI

前言 2019年迪文推出了T5L系列芯片,同时还更新了针对它的第二代DGUS软件——因为大多数功能以及设置都与T5平台相通,所以T5L系列所使用的DGUS软件依然是第二代的范畴。 跟T5与K600平台之间差别的情况不同,因为采用了相近的底层逻辑&#xff0…

修普诺斯游戏测评报告

修普诺斯测评报告 目录 1.游戏简介 2.美术表现 2.1.开场cg登陆、加载界面 2.2.音乐音效 2.3.角色模型 2.4.UI 2.5.战斗场景战斗表现 3.游戏内容 3.1.养成系统 3.2.PVE玩法 3.3.PVP玩法 4.核心玩法 5.付费点 5.1.首充破冰后续付费 5.2.成长基金等其他付费点 5.3.限时礼包 …

NYOJ-20 吝啬的国度【深搜】

描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重…