文章目录
  1. 1. PX4学习二:camera_trigger的参数问题

PX4学习二:camera_trigger的参数问题

PX4新增的相机触发位于Firmware\src\drivers\camera_trigger,它的目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
|- camera_trigger
|- interfaces 接口程序
|- src
|- camera_interface.cpp
|- camera_interface.h 相机API
|- pwm.cpp
|- pwm.h 继承API类,用于SeagullMAP2实现
|- relay.cpp
|- relay.h 继承API类,用于GPIO实现
|- camera_trigger.cpp 相机触发主程序
|- camera_trigger_params.c 相关参数
|- CMakeLists.txt

其中,在camera_interface包含了一个相机接口的类,而pwm和relay则是通过继承这个类实现的。具体实现尚未研究,这次仅仅是研究了camera_trigger_params.c中的参数设置。

以下是camera_trigger_params.c中的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
* Camera trigger Interface
*
* Selects the trigger interface
* 选择使用的触发接口
* @value 1 GPIO
* @value 2 Seagull MAP2 (PWM)
*
* @reboot_required true
*
* @group Camera trigger
*/
PARAM_DEFINE_INT32(TRIG_INTERFACE, 2);

/**
* Camera trigger interval
*
* This parameter sets the time between two consecutive trigger events
* 用于时间间隔模式下的时间设置
* @unit ms
* @min 4.0
* @max 10000.0
* @decimal 1
* @group Camera trigger
*/
PARAM_DEFINE_FLOAT(TRIG_INTERVAL, 40.0f);

/**
* Camera trigger polarity
*
* This parameter sets the polarity of the trigger (0 = active low, 1 = active high )
* 选择高电平触发还是低电平触发
* @value 0 Active low
* @value 1 Active high
* @min 0
* @max 1
* @group Camera trigger
*/
PARAM_DEFINE_INT32(TRIG_POLARITY, 1);

/**
* Camera trigger activation time
*
* This parameter sets the time the trigger needs to pulled high or low.
* 触发时间
* @unit ms
* @min 0.1
* @max 3000
* @decimal 1
* @group Camera trigger
*/
PARAM_DEFINE_FLOAT(TRIG_ACT_TIME, 0.5f);

/**
* Camera trigger mode
* 触发模式
* @value 0 Disable
* @value 1 On individual commands
* @value 2 Time based, always on
* @value 3 Distance based, always on
* @value 4 Distance, mission controlled
* @min 0
* @max 4
* @reboot_required true
* @group Camera trigger
*/
PARAM_DEFINE_INT32(TRIG_MODE, 0);

/**
* Camera trigger pin
* 选择触发的pin口
* Selects which pin is used, ranges from 1 to 6 (AUX1-AUX6 on px4fmu-v2 and the rail
* pins on px4fmu-v4). The PWM interface takes two pins per camera, while relay
* triggers on every pin individually. Example: Value 34 would trigger on pins 3 and 4.
*
* @min 1
* @max 123456
* @decimal 0
* @reboot_required true
* @group Camera trigger
*/
PARAM_DEFINE_INT32(TRIG_PINS, 6);

/**
* Camera trigger distance
*
* Sets the distance at which to trigger the camera.
* 距离间隔触发模式下用于设置距离
* @unit m
* @min 0
* @increment 1
* @decimal 1
* @group Camera trigger
*/
PARAM_DEFINE_FLOAT(TRIG_DISTANCE, 25.0f);

通过修改这个文件里的参数,便可以达到各种目的。
接着就是camera_trigger.cpp中几个重要参数的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
首先定义了接口模式这个枚举变量,用于判断使用哪种接口
*/

typedef enum {
CAMERA_INTERFACE_MODE_NONE = 0,
CAMERA_INTERFACE_MODE_RELAY,
CAMERA_INTERFACE_MODE_SEAGULL_MAP2_PWM
} camera_interface_mode_t;

...

// 这里创建了接口模式和一个接口对象,接口对象在构造函数中赋值为nullptr
camera_interface_mode_t _camera_interface_mode;
CameraInterface *_camera_interface; ///< instance of camera interface

...

// Parameters
// PX4最常使用的参数设置方法,先通过param_find(), 再通过param_get()指向变量
_p_interval = param_find("TRIG_INTERVAL");
_p_distance = param_find("TRIG_DISTANCE");
_p_activation_time = param_find("TRIG_ACT_TIME");
_p_mode = param_find("TRIG_MODE");
_p_interface = param_find("TRIG_INTERFACE");

param_get(_p_activation_time, &_activation_time);
param_get(_p_interval, &_interval);
param_get(_p_distance, &_distance);
param_get(_p_mode, &_mode);
param_get(_p_interface, &_camera_interface_mode);

// 判断接口的模式来建立不同子类对象,因此可用通过在interfaces\src中建立新方法来实现不同接口模式,仅需要修改这里
switch (_camera_interface_mode) {
case CAMERA_INTERFACE_MODE_RELAY:
_camera_interface = new CameraInterfaceRelay;
break;

case CAMERA_INTERFACE_MODE_SEAGULL_MAP2_PWM:
_camera_interface = new CameraInterfacePWM;
break;

default:
break;
}

文章目录
  1. 1. PX4学习二:camera_trigger的参数问题