OpenVX在安全关键应用中的技术解析与实践
1. OpenVX核心功能封装
在OpenVX的安全关键应用中,对核心功能进行了封装,以提高代码的安全性和可维护性。以下是一些关键的封装类和函数:
1.1 图操作封装
图操作封装提供了对图的参数设置、处理、调度和等待等功能。以下是相关代码:
return vxSetGraphParameterByIndex( *this, index, value );
}
vx_status processGraph( void ) const
{
return vxProcessGraph( *this );
}
vx_status scheduleGraph( void ) const
{
return vxScheduleGraph( *this );
}
vx_status waitGraph( void ) const
{
return vxWaitGraph( *this );
}
};
1.2 vx_image封装
vx_image
被封装在
VxImage
类中,提供了查询和设置图像属性的功能。以下是
VxImage
类的部分代码:
class VxImage : public VxReference
{
protected:
friend class VxImageMap<VX_READ_AND_WRITE>;
friend class VxImageMap<VX_READ_ONLY>;
friend class VxImageMap<VX_WRITE_ONLY>;
operator const vx_image() const
{
return reinterpret_cast<vx_image>( pimpl );
}
public:
VxImage( vx_image ref )
: VxReference( reinterpret_cast<vx_reference>( ref ),
VX_TYPE_IMAGE )
{
}
VxImage( vx_reference ref )
: VxReference( ref, VX_TYPE_IMAGE )
{
}
~VxImage() {}
template <vx_enum A>
typename tagmap<A>::vx_type queryImage(typename tagmap<A>::vx_type
init={0}) const
{
static_assert( (A & VX_TYPE_MASK) == (VX_TYPE_IMAGE << 8),
"You must use an Image type attribute!");
auto data(init);
if ( nullptr != pimpl )
{
vxQueryImage( *this, A, &data, sizeof( data ) );
}
return data;
}
template <vx_enum A>
vx_status setImageAttribute(typename tagmap<A>::vx_type data)
{
static_assert( (A & VX_TYPE_MASK) == (VX_TYPE_IMAGE << 8),
"You must use an Image type attribute!");
return vxSetImageAttribute(*this, A, &data, sizeof(data));
}
// Copying and mapping
template<vx_enum usage>
vx_status copyImagePatch( const vx_rectangle_t &rect,
vx_uint32 plane_index,
const vx_imagepatch_addressing_t &addr,
void * ptr,
vx_enum mem_type=VX_MEMORY_TYPE_HOST)
{
static_assert( (VX_READ_ONLY == usage) ||
(VX_WRITE_ONLY == usage),
"usage must be VX_READ_ONLY or VX_WRITE_ONLY");
return vxCopyImagePatch(*this, &rect,
plane_index, &addr,
ptr, usage, mem_type);
}
template <vx_enum usage>
auto mapImagePatch( const vx_rectangle_t& rect,
vx_uint32 plane_index,
vx_enum mem_type=VX_MEMORY_TYPE_HOST,
vx_uint32 flags=0 )
{
return VxImageMap<usage>(*this, rect, plane_index, mem_type,
flags);
}
// Child factories
VxImage createImageFromROI( const vx_rectangle_t* rect )
{
return VxImage( vxCreateImageFromROI( *this, rect ) );
}
VxImage createImageFromChannel( enum vx_channel_e channel )
{
return VxImage( vxCreateImageFromChannel( *this, channel ) );
}
vx_status swapImageHandle( const VxImageHandle& new_ptrs,
VxImageHandle& prev_ptrs )
{
return ( new_ptrs.size() == prev_ptrs.size() &&
new_ptrs.color() == prev_ptrs.color() &&
new_ptrs.mem_type() == prev_ptrs.mem_type() )
? vxSwapImageHandle( *this, new_ptrs, prev_ptrs,
new_ptrs.mem_type() )
: VX_ERROR_INVALID_PARAMETERS;
}
vx_status setImageValidRectangle( const vx_rectangle_t& rect )
{
return vxSetImageValidRectangle( *this, &rect );
}
vx_status getImageValidRectangle( vx_rectangle_t& rect )
{
return vxGetValidRegionImage( *this, &rect );
}
};
1.3 图像映射封装
为了提高图像映射的安全性,引入了
VxImageMap
类。以下是
VxImageMap
类的部分代码:
VxImageMap( VxImage image_in,
const vx_rectangle_t& rect_in,
vx_uint32 plane_index,
vx_enum mem_type_in=VX_MEMORY_TYPE_HOST,
vx_uint32 flags=0 ):
image(image_in),
rect(rect_in),
mem_type(mem_type_in),
status(vxMapImagePatch( image, &rect, plane_index, &map_id, &addr,
&ptr, usage, mem_type, flags ))
{}
public:
~VxImageMap()
{
if ( VX_SUCCESS == status && image != nullptr )
{
status = vxUnmapImagePatch( image, map_id );
}
}
typename const_if_RO<vx_pixel_value_t, usage>::vx_ptr
formatImagePatchAddress1d( vx_uint32 index )
{
return ( VX_SUCCESS == status ) ?
vxFormatImagePatchAddress1d( ptr, index, &addr ) :
nullptr;
}
typename const_if_RO<vx_pixel_value_t, usage>::vx_ptr
formatImagePatchAddress2d( vx_uint32 x, vx_uint32 y )
{
return ( VX_SUCCESS == status ) ?
vxFormatImagePatchAddress2d( ptr, x, y, &addr ) :
nullptr;
}
typename const_if_RO<void, usage>::vx_ptr getVoidPtr()
{
return ptr;
}
vx_status copyPatch( VxImage image_in, const vx_rectangle_t&
rect_in, vx_uint32 image_plane_index, vx_enum usage_in )
{
auto my_size_x = rect.end_x - rect.start_y;
auto my_size_y = rect.end_y - rect.start_y;
auto copy_size_x = rect_in.end_x - rect_in.start_x;
auto copy_size_y = rect_in.end_y - rect_in.start_y;
return ( ( my_size_x < copy_size_x ) || ( my_size_y <
copy_size_y ) )
? VX_ERROR_INVALID_PARAMETERS
: vxCopyImagePatch( image_in, &rect,
image_plane_index, &addr, ptr, usage_in, mem_type
);
}
const vx_imagepatch_addressing_t* getAddressing() const { return
&addr; }
};
1.4 其他对象映射封装
对于其他可以映射和取消映射的对象(如LUT、数组、分布和重映射),也可以进行类似的抽象封装。
1.5 延迟和对象数组类封装
vx_delay
和
vx_object_array
分别被封装在
VxDelay
和
VxObjectArray
类中。以下是
VxDelay
类的部分代码:
class VxDelay : public VxReference
{
private:
VxDelay( vx_delay ref )
: VxReference( reinterpret_cast<vx_reference>( ref ),
VX_TYPE_DELAY )
{
}
operator const vx_delay() const { return
reinterpret_cast<vx_delay>( pimpl ); }
friend class VxImport;
friend class VxContext;
friend class VxRefArray;
public:
~VxDelay() {}
template <vx_enum tag>
typename tagmap<tag>::vx_type queryDelay(typename
tagmap<tag>::vx_type init={0}) const
{
auto data(init);
if ( nullptr != pimpl )
{
vxQueryDelay( *this, tag, &data, sizeof( data ) );
}
return data;
}
template <class TYPE>
TYPE getReferenceFromDelay( vx_uint32 index )
{
vx_reference ref = vxGetReferenceFromDelay( *this, index );
if ( nullptr != ref )
{
vxRetainReference( ref );
}
return TYPE( ref );
}
vx_status age() { return vxAgeDelay( *this ); }
};
以下是
VxObjectArray
类的部分代码:
class VxObjectArray : public VxReference
{
private:
VxObjectArray( vx_object_array ref )
: VxReference( reinterpret_cast<vx_reference>( ref ),
VX_TYPE_OBJECT_ARRAY )
{
}
VxObjectArray( vx_reference ref )
: VxReference( ref, VX_TYPE_OBJECT_ARRAY )
{
}
operator const vx_object_array() const { return
reinterpret_cast<vx_object_array>( pimpl ); }
friend class VxImport;
friend class VxContext;
friend class VxRefArray;
public:
~VxObjectArray() {}
// general-purpose query function.
// (Could be made to raise an exception if vxQueryObjectArray
// returns an error)
template <vx_enum tag>
typename tagmap<tag>::vx_type queryObjectArray(typename
tagmap<tag>::vx_type init={0}) const
{
auto data(init);
if ( nullptr != pimpl )
{
vxQueryObjectArray( *this, tag, &data, sizeof( data )
);
}
return data;
}
template <class TYPE>
TYPE getObjectArrayItem( vx_uint32 index )
{
return TYPE( vxGetObjectArrayItem( *this, index ) );
}
template <class T>
T operator [](vx_size index) { return
getObjectArrayItem<T>(index); }
};
2. 安全关键系统中的软件学习与修改
在安全关键系统中,软件的学习和修改需要严格控制。以下是相关内容:
2.1 背景介绍
在大多数安全相关规范中,动态修改程序通常被认为是不可取的。对影响程序运行的存储数据(通常称为“校准”)的更新需要严格控制,并且确保数据完整性的方法已经得到了很好的发展。
2.2 汽车发动机校准示例
汽车发动机校准是一个很好的例子。发动机校准经过了充分的测试和严格的控制,不同的校准可以使同一台发动机在不同的功率输出下运行。这些校准可以在售后进行更新,但需要满足一定的条件,如不影响有害排放评级、不改变车辆的税级等。
2.3 行业反应
由于发动机校准更改的经验,行业加强了内部监管。新的Adaptive AUTOSAR标准仔细解决了数据安全和现场更新车辆的方法等问题。
2.4 坑洼避让系统示例
坑洼避让系统是一个典型的安全关键应用。该系统具有以下优点:
- 为乘客提供更平稳的乘坐体验。
- 减少悬架的磨损,降低成本。
- 降低轮胎和转向等安全相关部件故障的风险。
该系统的设计包括:
- 基于多个摄像头拍摄的前方道路图像的坑洼识别系统。
- 从现有系统获取其他道路使用者的位置、速度和估计轨迹的信息。
- 现有系统检测到的其他障碍物的位置。
- 自身速度和轨迹的信息。
- 从现有系统获取的关于制动距离、坡度等道路条件的信息。
- 基于上述信息的轨迹规划系统。
- 控制发动机、转向和制动,实现平稳的轨迹改变。
2.5 OpenVX图的应用
坑洼识别系统和轨迹规划系统的实现都可以使用OpenVX图。通过上传新数据,可以有效地更改整个图,就像更改校准一样。但需要严格的测试和安全协议。
2.6 系统升级思考
作为坑洼识别系统制造商,考虑以下更改的可行性:
- 改进坑洼识别算法。
- 改进轨迹规划系统。
- 考虑坑洼的天气条件。
- 记住坑洼的先前位置。
- 回忆未能避开特定坑洼的先前经验。
- 考虑自上次遇到坑洼以来天气对坑洼的可能影响。
- 识别修补后的坑洼并从坑洼记忆中移除。
- 通过数据库与其他车辆共享数据(非实时)。
- 离线将数据共享给负责道路维护的机构。
- 负责道路维护的机构离线从数据库中移除坑洼数据。
- 与其他车辆实时共享坑洼数据。
- 与其他车辆实时共享轨迹。
- 记录不同距离的坑洼图像。
- 记录坑洼避让失败的经验以及相关图像。
- 使用图像数据和避让失败经验离线优化坑洼识别算法。
- 从其他来源(如道路维护机构或专门委托的调查)获取坑洼数据,以结合视觉数据并改进识别算法。
- 实时添加车辆下方坑洼的超声波深度测量。
- 将匿名获取的数据出售给负责道路维护的机构以获取收入。
2.7 数据隐私考虑
在上述更改中,需要考虑数据隐私问题,确定哪些数据需要假名化,哪些数据需要匿名化。所有数据都需要安全地保存和传输,某些情况下还需要加密以确保保密性。
2.8 增强功能的帮助
一些OpenVX实现提供的增强功能可以帮助现场升级过程:
- 一个供应商内核可以从由字符串标识的数据源加载数据对象。如果数据源未准备好,内核可以阻塞指定的延迟时间(零表示不阻塞),并通过布尔输出参数指示超时到期。数据对象的类型由字符串确定,还有其他输入参数用于进一步限定数据源。
- 一个供应商内核可以将数据对象发送到由字符串和其他参数标识的数据接收器。同样,超时值是输入参数,超时到期是输出参数。
- 数据源和数据接收器可以位于持久内存(重置后仍保留)或传感器、指示器甚至云端的远程数据库中。
- 涉及的数据对象可以是虚拟的。
- 所有数据在传输或存储时都带有错误检测和纠正算法,并且可以选择加密。
3. 总结
OpenVX在安全关键应用中提供了强大的功能和灵活性。通过封装核心功能,可以提高代码的安全性和可维护性。在安全关键系统中,软件的学习和修改需要严格控制,同时要考虑数据隐私和安全问题。利用OpenVX图和相关增强功能,可以实现系统的升级和优化。
3.1 图操作流程
graph TD;
A[设置图参数] --> B[处理图];
B --> C[调度图];
C --> D[等待图完成];
3.2 图像操作流程
graph TD;
A[创建VxImage对象] --> B[查询图像属性];
A --> C[设置图像属性];
A --> D[复制图像补丁];
A --> E[映射图像补丁];
E --> F[处理映射数据];
F --> G[取消映射图像补丁];
3.3 坑洼避让系统设计
| 系统组件 | 功能描述 |
|---|---|
| 坑洼识别系统 | 基于多个摄像头拍摄的前方道路图像识别坑洼 |
| 信息获取模块 | 从现有系统获取其他道路使用者的位置、速度和估计轨迹等信息 |
| 轨迹规划系统 | 根据上述信息规划最佳轨迹 |
| 控制模块 | 控制发动机、转向和制动,实现平稳的轨迹改变 |
4. OpenVX核心功能封装的优势分析
4.1 提高代码安全性
通过封装,将底层的OpenVX函数调用隐藏在类的成员函数中,减少了直接操作底层函数带来的潜在风险。例如,在
VxImage
类中,对图像属性的查询和设置都进行了类型检查,使用
static_assert
确保使用的是图像类型的属性,避免了使用错误类型的属性导致的问题。
4.2 增强代码可维护性
封装后的代码结构更加清晰,每个类都有明确的职责。例如,
VxDelay
类负责处理延迟对象的查询和引用获取,
VxObjectArray
类负责处理对象数组的查询和元素获取。这样,当需要修改或扩展功能时,只需要在相应的类中进行修改,而不会影响到其他部分的代码。
4.3 便于代码复用
封装后的类可以在不同的项目中复用。例如,
VxImageMap
类可以用于不同的图像映射场景,只需要传入不同的参数即可。
5. 安全关键系统中软件学习与修改的挑战与应对
5.1 挑战
- 数据完整性 :在更新校准数据或程序时,需要确保数据的完整性,避免因数据错误导致系统故障。
- 安全性 :数据的传输和存储需要保证安全,防止数据被篡改或泄露。
- 兼容性 :新的校准数据或程序需要与现有的系统兼容,避免出现不兼容的问题。
5.2 应对措施
- 严格测试 :在更新校准数据或程序之前,进行充分的测试,确保数据的完整性和系统的兼容性。
- 安全协议 :使用安全协议对数据进行加密和认证,确保数据的安全性。
- 版本管理 :对校准数据和程序进行版本管理,方便回滚到之前的版本。
6. 坑洼避让系统升级的具体操作步骤
6.1 改进坑洼识别算法
- 收集更多的坑洼图像数据,包括不同天气条件下的图像。
- 使用这些数据对坑洼识别算法进行训练和优化。
- 将优化后的算法以数据的形式上传到车辆系统中,替换原有的算法。
6.2 改进轨迹规划系统
- 分析现有的轨迹规划系统,找出可以改进的地方。
- 设计新的轨迹规划算法,考虑更多的因素,如其他道路使用者的行为、道路条件等。
- 对新的算法进行测试和验证。
- 将新的算法上传到车辆系统中,更新轨迹规划系统。
6.3 考虑坑洼的天气条件
- 增加天气传感器,获取当前的天气信息。
- 修改坑洼识别算法,考虑天气对坑洼的影响。
- 在轨迹规划系统中,根据天气条件调整轨迹规划策略。
6.4 记住坑洼的先前位置
- 设计一个坑洼位置数据库,用于存储坑洼的先前位置。
- 在坑洼识别系统中,将识别到的坑洼位置存储到数据库中。
- 在轨迹规划系统中,查询数据库,考虑坑洼的先前位置。
6.5 回忆未能避开特定坑洼的先前经验
- 记录未能避开特定坑洼的相关信息,如垂直加速度、转向系统的扰动等。
- 分析这些信息,找出未能避开坑洼的原因。
- 根据分析结果,调整坑洼识别算法和轨迹规划系统。
6.6 考虑自上次遇到坑洼以来天气对坑洼的可能影响
- 记录每次遇到坑洼的时间和天气信息。
- 分析天气对坑洼的影响规律。
- 在坑洼识别系统中,根据上次遇到坑洼以来的天气信息,调整对坑洼的判断。
6.7 识别修补后的坑洼并从坑洼记忆中移除
- 设计一个修补后坑洼的识别算法,通过图像分析或其他传感器数据判断坑洼是否已经修补。
- 当识别到修补后的坑洼时,从坑洼位置数据库中移除该坑洼的信息。
6.8 通过数据库与其他车辆共享数据(非实时)
- 建立一个数据库服务器,用于存储坑洼数据。
- 车辆定期将坑洼数据上传到数据库服务器。
- 其他车辆可以从数据库服务器下载坑洼数据。
6.9 离线将数据共享给负责道路维护的机构
- 设计一个数据导出接口,将坑洼数据导出到可移动存储设备中。
- 将存储设备交给负责道路维护的机构。
6.10 负责道路维护的机构离线从数据库中移除坑洼数据
- 道路维护机构通过数据库管理系统登录数据库。
- 根据实际情况,从数据库中移除已经修复的坑洼数据。
6.11 与其他车辆实时共享坑洼数据
- 建立车辆之间的通信网络,如V2V通信。
- 车辆实时将坑洼数据发送给其他车辆。
- 其他车辆接收并处理这些数据,更新自己的坑洼信息。
6.12 与其他车辆实时共享轨迹
- 同样利用车辆之间的通信网络。
- 车辆实时将自己的轨迹信息发送给其他车辆。
- 其他车辆接收并处理这些轨迹信息,用于轨迹规划和避障。
6.13 记录不同距离的坑洼图像
- 调整摄像头的参数,使其能够拍摄不同距离的坑洼图像。
- 在坑洼识别系统中,记录图像的拍摄距离信息。
6.14 记录坑洼避让失败的经验以及相关图像
- 当未能避开坑洼时,记录相关的信息,如垂直加速度、转向系统的扰动等。
- 同时保存当时拍摄的坑洼图像。
6.15 离线优化坑洼识别算法
- 收集大量的坑洼图像数据和避让失败的经验信息。
- 使用机器学习或深度学习算法对这些数据进行训练和优化。
- 将优化后的算法上传到车辆系统中。
6.16 从其他来源获取坑洼数据
- 与道路维护机构或专门的调查机构建立数据接口。
- 从这些机构获取坑洼数据。
- 将获取的数据与车辆自身的视觉数据进行融合,改进坑洼识别算法。
6.17 实时添加车辆下方坑洼的超声波深度测量
- 安装超声波传感器,用于测量车辆下方坑洼的深度。
- 在坑洼识别系统中,将超声波测量数据与图像数据进行融合,提高坑洼识别的准确性。
6.18 出售匿名化数据
- 对获取的坑洼数据进行匿名化处理,确保不泄露车辆和用户的隐私信息。
- 与道路维护机构或其他相关机构签订数据出售协议。
- 将匿名化后的数据出售给这些机构。
7. 数据隐私保护的具体措施
7.1 假名化和匿名化
- 对于涉及车辆和用户身份的信息,进行假名化处理,使用假名代替真实身份。
- 对于不需要身份信息的数据,进行匿名化处理,确保无法从数据中识别出个人身份。
7.2 加密传输和存储
- 在数据传输过程中,使用加密算法对数据进行加密,防止数据被窃取。
- 在数据存储过程中,同样对数据进行加密,确保数据的安全性。
7.3 访问控制
- 对数据的访问进行严格的控制,只有授权的人员才能访问和处理数据。
8. 增强功能在现场升级中的应用流程
8.1 数据加载供应商内核的应用流程
- 确定需要加载的数据对象和数据源的字符串标识。
- 调用数据加载供应商内核,传入数据源的字符串标识和其他相关参数。
- 内核检查数据源是否准备好,如果未准备好,根据设置的延迟时间进行阻塞。
- 如果超时,通过布尔输出参数指示超时到期;如果未超时,加载数据对象。
8.2 数据发送供应商内核的应用流程
- 确定需要发送的数据对象和数据接收器的字符串标识及其他参数。
- 调用数据发送供应商内核,传入数据对象、数据接收器的字符串标识和超时值等参数。
- 内核尝试将数据对象发送到数据接收器,如果在超时时间内未完成发送,通过输出参数指示超时到期。
8.3 整体升级流程
graph TD;
A[确定升级需求] --> B[准备升级数据];
B --> C[使用数据加载内核加载数据];
C --> D[检查数据完整性];
D --> E[使用数据发送内核将数据发送到目标位置];
E --> F[更新系统配置];
F --> G[进行系统测试];
G --> H[完成升级];
9. 总结与展望
9.1 总结
OpenVX在安全关键应用中展现出了强大的功能和优势。通过对核心功能的封装,提高了代码的安全性和可维护性;在安全关键系统中,严格控制软件的学习和修改,同时考虑数据隐私和安全问题,利用OpenVX图和相关增强功能实现系统的升级和优化。坑洼避让系统作为一个典型的安全关键应用,展示了OpenVX在实际场景中的应用和价值。
9.2 展望
未来,随着技术的不断发展,OpenVX可能会在更多的安全关键领域得到应用。例如,在自动驾驶、工业自动化等领域,OpenVX的高效图像处理和计算能力将发挥重要作用。同时,随着数据隐私和安全问题的日益重要,OpenVX的相关安全机制也需要不断完善,以满足更高的安全要求。此外,与其他技术的融合,如人工智能、物联网等,也将为OpenVX带来更广阔的发展前景。
超级会员免费看
994

被折叠的 条评论
为什么被折叠?



