Phoenix Framework-流程中如何走检查点分支

PhoenixFramework自动化测试工具支持基本的分支和循环结构,通过checkPointStatusAct方法实现条件判断,需提供两个独立检查点用例来分别处理不同路径。

Phoenix Framework自动化测试工具中 checkPointStatusAct 方法讲解。

我们在执行流程是通常会走一些分支流程,如条件为“真”时走流程1,条件为“假”时走流程2。在本工具中,由于是直接执行测试数据,所以不支持特复杂的分支语句。目前程序中支持两种比较常用的如:if...else...和for循环。后续可将逻辑语句较为复杂的用例单独保存在一个类中,由程序反射执行,测试结果会同样在测试报告中体现。但我们建议您这样的用例越少越好,否则会给项目的部署带来维护上的困难。在本程序中如果要走分支流程,需要用到一个关键方法:checkPointStatusAct,字面意义为:检查点状态行为。使用本方法时要注意以下两点:

1、该方法只适用于插入该方法前的一个检查点返回的状态
2、该检查点需要提供两个独立的检查点用例,检查点用例结构与普通用例结构一致。
3、步骤类型提供参数,格式为:检查点成功时用例名:检查点失败时用例名。

可在编辑操作单元标签页和用例及数据维护标签页插入checkPointStatusAct方法。步骤与 如何设置检查点 一致。不在赘述。

本文内容来自:http://www.phoenixframe.org/support/index.html#QA3

更多详细内容请见官网:http://www.phoenixframe.org/

int main(int argc, char* argv[]) { #if (PROJECT_PLATFORM == PROJECT_PLATFORM_LINUX) || \ (PROJECT_PLATFORM == PROJECT_PLATFORM_WINDOWS) int exit_code = 0; char path[1024] = { 0 }; if (readlink("/proc/self/exe", path, sizeof(path)-2) < 1) { std::cout << "readlink failed!" << std::endl; return (-1); } std::string current_path(path); std::cout << "current_path = " << current_path << std::endl; // Set work space int separator_count = 0; std::string::reverse_iterator it_current_path = current_path.rbegin(); for (; it_current_path != current_path.rend(); ++it_current_path) { if (*it_current_path == '/') { if (it_current_path == current_path.rbegin()) { continue; } ++it_current_path; ++separator_count; if (separator_count > 1) { break; } } } std::string work_space(current_path.begin(), it_current_path.base()); std::cout << "work_space = " << work_space << std::endl; // Create QT Application QApplication qt_app(argc, argv); // Create windows s_main_window = new phoenix::hmi::MainWindow(argc, argv, work_space); s_main_window->show(); #endif CruiseTrajPlanning planner; // 确保初始化只执行一次 std::call_once(init_flag, [&]{ planner.cruiseTrajPlanningInit("./conf/Cru_Planning_Parameter.yaml"); std::cout << "Cruise planning initialized once\n"; }); // // 创建三个不同周期的线程 // std::thread t1([&planner] { // while(running) { // planner.updateUserClockUs(); // std::this_thread::sleep_for(std::chrono::milliseconds(10)); // } // }); // std::thread t2([&planner] { // while(running) { // planner.checkModuleStatus(); // std::this_thread::sleep_for(std::chrono::milliseconds(50)); // } // }); std::thread t3([&planner] { while(running) { // 先执行所有接收函数(模拟数据接收) std::string file_name = "./conf/map_1030.txt"; phoenix::msg::map::MapMsg map_msg; bool read_map = phoenix::framework::GetProtoFromASCIIFile(file_name, map_msg.mutable_hdmap()); if(read_map) { LOG_INFO(5) << "Read map ok"; } else { LOG_INFO(5) << "Read map fail"; std::cout << "The map is: \n" << map_msg.hdmap().DebugString() << std::endl; } Int32_t map_msg_serialize_size = map_msg.ByteSize(); std::shared_ptr<Char_t> map_data_array(new Char_t[map_msg_serialize_size], std::default_delete<Char_t[]>()); if (!map_msg.SerializeToArray(map_data_array.get(), map_msg_serialize_size)) { LOG_ERR << "Failed to serialize Map message."; } planner.recvMapMessage(map_data_array.get(), map_msg_serialize_size); phoenix::ad_msg::Chassis chassis_; chassis_.driving_mode = phoenix::ad_msg::VEH_DRIVING_MODE_ROBOTIC; chassis_.eps_status = phoenix::ad_msg::VEH_EPS_STATUS_ROBOTIC; chassis_.steering_wheel_angle_valid = 1; chassis_.steering_wheel_angle = 0; chassis_.v_valid = 1; chassis_.v = 30.0F/3.6F; chassis_.yaw_rate_valid = 1; chassis_.yaw_rate= 0; chassis_.gear = phoenix::ad_msg::VEH_GEAR_D; // Update message head chassis_.msg_head.valid = true; chassis_.msg_head.UpdateSequenceNum(); chassis_.msg_head.timestamp = phoenix::common::GetClockNowMs(); phoenix::msg::control::Chassis chassis_proto; phoenix::msg::ParseProtoMsg pase_proto; pase_proto.EncodeChassisMessage(chassis_,&chassis_proto); Int32_t chassis_proto_serialize_size = chassis_proto.ByteSize(); std::shared_ptr<Char_t> chassis_data_array(new Char_t[chassis_proto_serialize_size], std::default_delete<Char_t[]>()); if (!chassis_proto.SerializeToArray(chassis_data_array.get(), chassis_proto_serialize_size)) { LOG_ERR << "Failed to serialize chassis message."; } planner.recvChassisMessage(chassis_data_array.get(), chassis_proto_serialize_size); phoenix::ad_msg::Gnss gnss_; gnss_.msg_head.valid = true; gnss_.x_utm = 255874.82626128072; gnss_.y_utm = 3371818.8817550726; gnss_.z_utm = 0.0; gnss_.heading_utm = 0.0; gnss_.gnss_status = 3 ; gnss_.utm_status = 3 ; phoenix::msg::localization::Gnss gnss_proto; pase_proto.EncodeGnssMessage(gnss_,&gnss_proto); Int32_t gnss_proto_serialize_size = gnss_proto.ByteSize(); std::shared_ptr<Char_t> gnss_data_array(new Char_t[gnss_proto_serialize_size], std::default_delete<Char_t[]>()); if (!gnss_proto.SerializeToArray(gnss_data_array.get(), gnss_proto_serialize_size)) { LOG_ERR << "Failed to serialize gnss message."; } planner.recvGnssMessage(gnss_data_array.get(), gnss_proto_serialize_size); planner.recvImuMessage(nullptr, 0); phoenix::ad_msg::ObstacleList obstacle_list_; obstacle_list_.obstacles_els_num = 1; Float32_t obj_v = -10.0F / 3.6F; for (Int32_t i = 0; i < obstacle_list_.obstacles_els_num; ++i) { phoenix::ad_msg::Obstacle &obj = obstacle_list_.obstacles[i]; obj.id = 0; obj.x = 60.0F; //-0.5F * obj_v; obj.y = 0.0F; //-3.6F; obj.obb.x = obj.x + 1.0F; obj.obb.y = obj.y; obj.obb.heading = phoenix::common::com_deg2rad(0.0F); obj.obb.half_length = 2.0F; obj.obb.half_width = 1.0F; obj.type = phoenix::ad_msg::OBJ_TYPE_PASSENGER_VEHICLE; obj.dynamic = false; obj.confidence = 90; obj.perception_type = phoenix::ad_msg::OBJ_PRCP_TYPE_FUSED; obj.v = obj_v; obj.v_x = obj_v; obj.v_y = 0.0F; } // Update message head obstacle_list_.msg_head.valid = true; obstacle_list_.msg_head.UpdateSequenceNum(); obstacle_list_.msg_head.timestamp = phoenix::common::GetClockNowMs(); phoenix::msg::perception::ObstacleList obstacle_list_proto; pase_proto.EncodeObstacleListMessage(obstacle_list_,&obstacle_list_proto); Int32_t obstacle_list_proto_serialize_size = obstacle_list_proto.ByteSize(); std::shared_ptr<Char_t> obstacle_list_data_array(new Char_t[obstacle_list_proto_serialize_size], std::default_delete<Char_t[]>()); if (!obstacle_list_proto.SerializeToArray(obstacle_list_data_array.get(), obstacle_list_proto_serialize_size)) { LOG_ERR << "Failed to serialize obstacle list message."; } planner.recvPerceptionMessage(obstacle_list_data_array.get(), obstacle_list_proto_serialize_size); planner.recvLaneInfoCameraListMessage(nullptr, 0); phoenix::ad_msg::ParkingSystemStatus parking_system_status_; parking_system_status_.current_mode = phoenix::ad_msg::ParkingMode::CRUISE_MODE; phoenix::msg::parking::ParkingSystemStatus parking_system_status_proto; pase_proto.EncodeParkSystemStatusMessage(parking_system_status_,&parking_system_status_proto); Int32_t parking_system_status_proto_serialize_size = parking_system_status_proto.ByteSize(); std::shared_ptr<Char_t> parking_system_status_data_array(new Char_t[parking_system_status_proto_serialize_size], std::default_delete<Char_t[]>()); if (!parking_system_status_proto.SerializeToArray(parking_system_status_data_array.get(), parking_system_status_proto_serialize_size)) { LOG_ERR << "Failed to serialize parking system status message."; } planner.recvParkSystemStatusMessage(parking_system_status_data_array.get(), parking_system_status_proto_serialize_size); // 然后执行规划输出 const char* output_data; planner.cruiseTrajPlanningOutput(&output_data); // // 最后发送HMI消息 // planner.sendHmiMsg(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } }); // enter main window loop exit_code = qt_app.exec(); delete s_main_window; // 主线程等待10秒 std::cout << "Running for 10 seconds...\n"; std::this_thread::sleep_for(std::chrono::seconds(10)); running = false; // 等待所有线程结束 // t1.join(); // t2.join(); t3.join(); std::cout << "All threads stopped\n"; return 0; } 为什么没有执行打印Read map ok
11-15
【事件触发一致性】研究多智能体网络如何通过分布式事件驱动控制实现有限时间内的共识(Matlab代码实现)内容概要:本文围绕多智能体网络中的事件触发一致性问题,研究如何通过分布式事件驱动控制实现有限时间内的共识,并提供了相应的Matlab代码实现方案。文中探讨了事件触发机制在降低通信负担、提升系统效率方面的优势,重点分析了多智能体系统在有限时间收敛的一致性控制策略,涉及系统模型构建、触发条件设计、稳定性与收敛性分析等核心技术环节。此外,文档还展示了该技术在航空航天、电力系统、机器人协同、无人机编队等多个前沿领域的潜在应用,体现了其跨学科的研究价值和工程实用性。; 适合人群:具备一定控制理论基础和Matlab编程能力的研究生、科研人员及从事自动化、智能系统、多智能体协同控制等相关领域的工程技术人员。; 使用场景及目标:①用于理解和实现多智能体系统在有限时间内达成一致的分布式控制方法;②为事件触发控制、分布式优化、协同控制等课题提供算法设计与仿真验证的技术参考;③支撑科研项目开发、学术论文复现及工程原型系统搭建; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注事件触发条件的设计逻辑与系统收敛性证明之间的关系,同时可延伸至其他应用场景进行二次开发与性能优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值