安装说明
- 下载Pixymon和pixy对应markone的固件,在这里。
irlock = markone
然后固件里 irlock = pixy
- 给Pixy刷固件的方法
打开PixyMon,将Pixy连接到电脑,然后长按Pixy上的按钮,进入烧录过程,松开按钮并选择下载好的Markone固件。
刷完固件后,重置Pixy
然后点击
Raw video
才能显示可见光图像
Markone上有29个红外灯,正常情况下仅需要MarkOne的目标信息,因此需要在Pixy的镜头上加上红外滤光片。
- 端口设置
pixy支持I2C、SPI以及串口三种输出方式,点击设置按钮在Interface
栏可以看到。将鼠标悬浮在data out port
处时会出现相应端口的默认设定值,其中SPI为0,I2C为1….
SPI、I2C、串口的协议输出的帧完全相同,每个帧中的对象按大小排序,最大的对象先发送。小端形式发送,一个新的换帧有两个同步信号0xaa55
表示
Bytes 16-bit words Description
----------------------------------------------------------------
0, 1 0 sync (0xaa55)
2, 3 1 checksum (sum of all 16-bit words 2-6)
4, 5 2 signature number
6, 7 3 x center of object
8, 9 4 y center of object
10, 11 5 width of object
12, 13 6 height of object
- 相机调焦
这一步非常重要
为了实现15米的测距精度,相机的棱镜需要稍微不聚焦,这能够让MarkOne在相机视野中看上去更大,因此可以测得的距离更远。
将MarkOne信标放到离相机10-15米远的地方。将IR-Lock对准相机,打开Pixymon并点击Display raw video
来查看相机返回的视频,可以发现MarkOne看上去像是一个白斑。
通过旋转镜头对焦,直到MarkOne看上去非常清晰。在室外进行对焦更加简单,因为你能在视频中看到其他物体。如果你在室内,就只能看到MarkOne信标。完成对焦后,抄任意一个方向传动棱镜约1/4圈,这将使得棱镜稍微不对焦。可以发现markOnede 形状在返回的视频中稍微变大了一些。
点击Action
栏下的Default program
,你会发现能够在15米内准确的检测到IR-Lock.信标的位置由一个白色的方框表示。
硬件连接
IR-Lock可以使用3S电池供电,工作电压范围为10.2-18V DC。
IR-Lock与Pixhawk的连接示意图如下
飞控固件&PL设置
精准着陆功能包含在AC3.3的修改版本中,而在AC3.4中,精准着陆已经成为默认的功能了(需要使用额外的距离测量模块,例如SF10/A激光雷达、声呐进行高度测量)。
AC3.3* PL固件(APM:Copter V3.3.3-rc2 IR-LOCK Firmware)
- Quad:Arducopter_PL_Quad_3.3.3-rc2.px4
- Source Code: Copter-3.3 Github
- Latest Commit: 593db3….
- 对开发者:如果想要自己编译源码,则需要修改一下子模块中的
irlock.cpp
文件,将其替换为这个文件。代码位置: ardupilot\modules\PX4Firmware\src\drivers\irlock
必要参数设置
烧好AC3.3* PL固件后,有三个参数需要修改。其中由两个是使用精准着陆功能必须修改的,另一个参数控制精准着陆的下降速度
- PRECLND_ENABLED: 将此值置
1
- PRECLND_SPEED: 这个参数不需要修改。它可以用于限制在精准着陆期间飞行器的水平速度,但目前在控制代码中不使用。
- PRECLND_TYPE: 将此值设置成
2
。此参数对应IR-Lock的传感器类型。 LAND_SPEED: 下降速度(cm/s)。该值可以降低到低至30cm / s。通常,较低的值可提高精准着陆的精度。
- 飞行模式
AC3.3 * PL固件中包含修改的飞行模式
LAND: 飞机中心对准IR目标下降,同时以参数PREC_LND SPEED中规定的下降速率下降。应用滚动或俯仰将立即禁用自动精准着陆控制。
LOITER: 在保持高度的同时,中心在IR目标上。应用滚动或俯仰将立即禁用自动精度着陆控制。
AUTO (LAND): 当执行脚本任务时,LAND命令将使对角线对准IR对象,同时以参数PREC_LND SPEED中规定的下降速率下降。
出现异常,请切换到Stabilize模式
首次飞行时,可以使用STABLIZE模式起飞并手动将飞机飞到MarkOne信标上方附近。然后切换到LOITER或者LOITER模式。如果信标在传感器视觉范围内,你会看到飞机会朝着信标移动。
注意: 如果你在LOITER/LAND模式下触碰了横滚或俯仰摇杆,精准着陆控制将失效。
- PL日志解读
记录的精准着陆变量可以在“PL”标题下找到。
bX/bY: Angle-to-target measurement in the body-frame reference BEFORE accounting for roll/pitch of copter.在考虑飞机的横滚、俯仰之前测得的机体坐标系中距目标的角度。
eX/eY: Angle-to-target measurement in the earth-frame reference AFTER accounting for roll/pitch of copter.考虑飞机的横滚、俯仰之后测得的地球坐标系中距目标的角度。
pX/pY: Calculated distance of target from copter in earth-frame. Note that the distance calculation depends on the altitude measurement. Also, the altitude variable in this particular instance is range limited, such that a negative value or very small value is not used to calculate the position.算得的在地球坐标系中目标与飞机直接的距离。注意距离的测量取决于高度的测量。同时,在这个特殊实例中的高度变量范围有限,因此将不使用负值或非常小的值来计算位置。
// get body-frame angles to target from backend
if (!_backend->get_angle_to_target(_bf_angle_to_target.x, _bf_angle_to_target.y)) {
_have_estimate = false;
}
float x_rad = _bf_angle_to_target.x - _ahrs.roll;
float y_rad = -_bf_angle_to_target.y + _ahrs.pitch;
// rotate to earth-frame angles
_ef_angle_to_target.x = y_rad*_ahrs.cos_yaw() - x_rad*_ahrs.sin_yaw();
_ef_angle_to_target.y = y_rad*_ahrs.sin_yaw() + x_rad*_ahrs.cos_yaw();
// get current altitude (constrained to no lower than 50cm)
float alt = max(alt_above_terrain_cm, 50.0f);
// convert earth-frame angles to earth-frame position offset
_target_pos_offset.x = alt*tanf(_ef_angle_to_target.x);
_target_pos_offset.y = alt*tanf(_ef_angle_to_target.y);
_target_pos_offset.z = 0; // not used
下图显示了5次连续精准着陆。绿线表示飞机的高度。红线(’bX’)表示传感器在x方向上相对于传感器测量的与目标对象的角度。
当LAND模式启动时,飞机开始向目标移动,将角度测量值向零驱动。通常观察角度测量中的振荡。