在测试中使用正角表

 

1、什么是正交表

正交表是一整套规则的设计表格,用Ln( c x t)为正交表的代号,n为试验的次数,t为水平数,c为列数,也就是可能安排最多的因素个数。例如L9(3 × 4) (1),它表示需作9次实验,最多可观察4个因素,每个因素均为3水平。一个正交表中也可以各列的水平数不相等,我们称它为混合型正交表,如L8(4×2,1x4) (2),此表的5列中,有1列为4水平,4列为2水平。根据正交表的数据结构看出,正交表是一个nc列的表,其中第j列由数码12… Sj 组成,这些数码均各出现N/S 次,例如表11中,第二列的数码个数为3S=3 ,即由123组成,各数码均出现 次。

 
 

水平

因数  

1

2

3

4

1

0

0

0

0

2

0

1

2

1

3

0

2

1

2

4

1

0

2

2

5

1

1

1

0

6

1

2

0

1

7

2

0

1

1

8

2

1

0

2

9

2

2

2

0

1  L 9(4x3

水平

因数

1

2

3

4

5

1

0

0

0

0

0

2

0

0

1

1

2

3

0

1

0

1

1

4

0

1

1

0

3

5

1

0

0

1

3

6

1

0

1

0

1

7

1

1

0

0

2

8

1

1

1

1

0

2  L 8(4x2,1x4)

正交表具有以下两项性质:

(1)每一列中,不同的数字出现的次数相等。例如在两水平正交表中,任何一列都有数码“ 1” “ 2” ,且任何一列中它们出现的次数是相等的;如在三水平正交表中,任何一列都有“ 1” “ 2” “ 3” ,且在任一列的出现数均相等。 这就保证了在测试中,每个因数的每个水平(情况)被指向相等的测试次数。

  (2)任意两列中数字的排列方式齐全而且均衡。例如在两水平正交表中,任何两列(同一横行内)有序对子共有4种:(11)(12)(21)(22)。每种对数出现次数相等。在三水平情况下,任何两列(同一横行内)有序对共有9种,1.11.21.32.12.22.33.13.23.3,且每对出现数也均相等。齐全性:保证了在测试中任何两个因素的组合是全排列(也就是全测试,做到了二因素的全测试)。 均衡性又保证了每种组合被测试的次数是相同的。

 

 以上两点充分的体现了正交表的两大优越性,即均匀分散性,整齐可比。通俗的说,每个因素的每个水平与另一个因素各水平各碰一次,这就是正交性。在这种条件下:虽然不能保证任何三因数的测试达到全测试,但是却能实现均匀分散测试,使得测试效果能够更加全面。

2、直角表组合测试工具的使用:

2.1、启动界面(如图1

    2..1.1、点击[file][save]可以把当前的因素和水平配置保存。

2.1.2 、点击[file][new]重新创建一个新的工程。

2.1.3 、点击[file][open]可以把以前的保存工程打开。

2.1.4 、点击[file][exit],可以退出此工具。

2.1.5 、点击[edit][组合拆分],可以进入因素和水平合并和拆分的对话框。2.7部分。

       2.1.6 、点击[edit][生成测试表],可以根据当前工程自动选择直角表生成测试表。

       2.1.7 、点击[edit][直角表],可以浏览和编辑当前所有可以使用的直角表。2.8部分

 

1

2.2、添加因素界面

在启动界面中点击[添加]按钮,可以添加测试的因素以及每种因素的水平。例如添加字体(因素1),黑体(水平1)、宋体(水平2)、Arial(水平3),点击[确定]按钮,如图2。字号(因素2),8号(水平1)、9号(水平2)、10号(水平3),点击[确定]按钮;字形(因素3),正常(水平1)、倾斜(水平2),点击[确定]按钮。当添加完全部的因素和水平后,点击[退出]按钮,完成因素、水平的添加。如图 3

如果添加的某个因素有错误可以因素列表中选中错误因素,点击[删除]按钮,删除此因素。再次点击[添加]按钮,重新进行添加。版本1.0目前不支持对因素的修改功能。

 

2

3

2.4、因素选择界面:

2.4.1 、点击[file][save]可以把当前的因素和水平配置保存。

2.4.2 、点击[edit][生成测试表]会弹出自动选择的直表表对话框,针对此例,选择的直表表是L16(5x4)(这里的ct 位置相反)如图4

 

4

2.4.3 、点击[返回]按钮,返回到主界面上。

2.4.4 、点击[确定]按钮,进入测试表界面,如图5

2.5、测试表界面:

 

5

图中背景黑色的单元格是正常的水平位置。背景白色的单元格是系统自动添加的,用户可以自己根据编辑的单元格。针对本例,字形是2水平的因素,但是选择的直角表是4水平的列,所以对于水平1和水平2,添加了正常和倾斜两个水平,对于空白的水平34,系统自动的也添加了水平正常和倾斜。背景以白色表示,用户可以根据自己的测试重点可以修改此部分的内容。例如想重点测试 正常情况,可以把“_+倾斜”修改成为“_+正常”。

注意:每个水平前面的“+”和“_+”不要被更改。

2.6、导出到Excel中:

   可以点击button2或则是工具栏中的按钮,将现在的测试表导出到excel中,如图6

 

6

       目前的没有制作约束的功能,所以对于某些水平之间的约束,不能在此工具中进行处理。

在导出的测试表中,客户需要手动的删除约束测试用例。

2.7、组合拆分对话框:

       在此对话框中,可以根据具体的情况吧把多个因素,或者是多个水平进行合并。也可以把合并后的因素或者水平进行拆分。在本例中,不需要进行合并,所以我们就不进行设置。

 

7

2.8、直角表一览对话框:

 

8

注:例如第一列表示L43 x 2

在此对话中,列出了所有可以使用的直角表,工具自带了324个直角表,客户也可以自己添加新的直角表。

2.8.1 、添加新的直角表:

       点击[Import Mode]按钮,在打开的对话框中选择需要添加的直角表文件。文件格式如下:

L 8 = 2*4 4*1

0     0     0     0     0

0     0     1     1     2

0     1     0     1     1

0     1     1     0     3

1     0     0     1     3

1     0     1     0     1

1     1     0     0     2

1     1     1     1     0

第一列直角表的类型。

第一行下面几行是直角表数据,数据之间以tab进行分隔。

<think>好的,用户现在想在ROS的C++节点中实现手柄按键事件处理,替代之前的摇杆控制乌龟模拟器。之前我教过他使用摇杆控制,现在需要改用按键。首先,我需要回顾一下之前的解决方案,看看哪里需要调整。 用户提到的是按键事件处理,而之前代码是基于摇杆的axes数组。手柄按键通常对应的是sensor_msgs/Joy消息中的buttons数组,每个按钮的状态是0或1。所以,我需要将代码中的axes部分改为buttons,并处理按钮的按下和释放事件。 接下来,用户的需求是替代键盘控制,可能希望用不同的按键对应不同的方向,比如方向键或者ABXY按钮。需要确定手柄按钮的索引,比如Xbox手柄的A按钮通常是0,B是1,X是2,Y是3,方向键上下左右可能对应axes数组里的值,或者某些手柄可能将方向键映射为按钮。需要用户确认手柄的按钮映射,或者代码里提供参数配置。 然后,考虑如何将按键映射为速度指令。键盘控制通常是按下某个键持续运动,松开停止。而手柄按键是离散的,按下时触发一次,松开时可能不会发送消息。因此,可能需要保持速度的状态,当按下某个方向键时,设置速度,当释放时,可能需要另一个按钮来停止,或者设计成按下时持续运动,松开后停止。或者采用toggle方式,按一次开始运动,再按一次停止。这里需要用户明确需求,但通常可能希望按下时持续运动,松开停止,这需要处理按钮的状态变化。 之前的代码中,JoyControl类订阅了joy主题,并在回调函数中处理axes。现在需要修改回调函数,检查buttons数组的变化。例如,当某个按钮按下时,发布对应的速度指令,松开时发布零速度。但需要注意,Joy消息会持续发送按钮的状态,即使没有变化,所以需要检测状态变化,或者在每次回调中根据当前按钮状态设置速度。 可能的实现方式是,在回调函数中遍历buttons数组,当检测到某个按钮被按下(从0变为1),则设置对应的线速度或速度。或者,如果希望按住按钮时持续运动,则在按钮为1时持续发布速度,松开时发布0。但后者可能会导致松开后无法自动停止,除非在按钮释放时处理。 另外,可能需要组合多个按钮,比如方向键上、下、左、右分别对应前进、后退、左转、右转。每个按钮对应不同的速度值,例如前进按钮按下时linear.x为,后退为负,左转为速度,右转为负速度。或者使用两个按钮控制线速度和速度的组合。 此外,参数配置也很重要,用户可能希望调整按钮映射和速度比例,所以在代码中需要从参数服务器读取按钮索引和速度比例,类似于之前的axis_linear和scale_linear参数。 还需要考虑去抖动处理,避免按钮抖动导致多次触发。不过Joy节点可能已经处理了这一点,通过deadzone参数,但可能需要代码中做进一步处理,比如检测按钮状态的变化,而不是当前状态。 最后,测试和调试部分需要指导用户如何查看按钮的索引,例如使用rostopic echo /joy来查看按钮数组的实时数据,确定各个按钮对应的索引,再配置到参数中。 总结步骤:修改回调函数,处理buttons数组,根据按钮状态设置速度,添加参数配置,处理按钮的按下和释放事件,可能需要状态机来跟踪运动状态,或者持续发布速度直到按钮释放。</think>### ROS C++手柄按键控制乌龟模拟器实现方案 #### 一、按键事件处理原理 1. **手柄按键数据特征**: - `sensor_msgs/Joy`消息的`buttons`数组存储二进制按键状态(0/1) - 按键事件需检测状态变化(0→1或1→0),类似键盘的按下/释放事件[^2] 2. **按键映射方案**: ```cpp // 典型Xbox手柄按键索引(需实际测试确认) #define BUTTON_A 0 #define BUTTON_B 1 #define BUTTON_X 2 #define BUTTON_Y 3 #define DPAD_UP 4 #define DPAD_DOWN 5 ``` #### 二、改进控制节点代码 创建`src/button_control.cpp`: ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <sensor_msgs/Joy.h> class ButtonControl { public: ButtonControl() : linear_speed_(0), angular_speed_(0) { twist_pub_ = nh_.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1); joy_sub_ = nh_.subscribe("joy", 10, &ButtonControl::joyCallback, this); // 从参数服务器加载按键配置 nh_.param<int>("btn_forward", btn_forward_, DPAD_UP); nh_.param<int>("btn_back", btn_back_, DPAD_DOWN); nh_.param<int>("btn_left", btn_left_, BUTTON_X); nh_.param<int>("btn_right", btn_right_, BUTTON_Y); nh_.param<double>("move_speed", move_speed_, 1.0); nh_.param<double>("turn_speed", turn_speed_, 1.0); } void joyCallback(const sensor_msgs::Joy::ConstPtr& joy) { geometry_msgs::Twist twist; // 检测方向按键 if(joy->buttons[btn_forward_]) linear_speed_ = move_speed_; else if(joy->buttons[btn_back_]) linear_speed_ = -move_speed_; else linear_speed_ = 0; // 检测转向按键 if(joy->buttons[btn_left_]) angular_speed_ = turn_speed_; else if(joy->buttons[btn_right_]) angular_speed_ = -turn_speed_; else angular_speed_ = 0; twist.linear.x = linear_speed_; twist.angular.z = angular_speed_; twist_pub_.publish(twist); } private: ros::NodeHandle nh_; ros::Publisher twist_pub_; ros::Subscriber joy_sub_; // 按键配置参数 int btn_forward_, btn_back_, btn_left_, btn_right_; double move_speed_, turn_speed_; double linear_speed_, angular_speed_; }; int main(int argc, char** argv) { ros::init(argc, argv, "button_control"); ButtonControl control; ros::spin(); return 0; } ``` #### 三、配置参数文件 创建`config/buttons.yaml`: ```yaml button_control: btn_forward: 4 # D-pad上键 btn_back: 5 # D-pad下键 btn_left: 2 # X键 btn_right: 3 # Y键 move_speed: 2.0 turn_speed: 1.5 ``` #### 四、修改启动文件 更新`launch/joy_cpp.launch`: ```xml <launch> <!-- 加载按键参数 --> <rosparam command="load" file="$(find joy_control_cpp)/config/buttons.yaml"/> <!-- 控制节点 --> <node pkg="joy_control_cpp" type="button_control" name="turtle_button_control" output="screen"/> <!-- 其他节点保持原有配置 --> </launch> ``` #### 五、高级功能实现 1. **组合键控制**(在回调函数中添加): ```cpp // 按住LB+RB键急停 if(joy->buttons[4] && joy->buttons[5]) { // LB=4, RB=5 twist.linear.x = 0; twist.angular.z = 0; } ``` 2. **速度渐变控制**: ```cpp // 在类定义中添加 #include <ros/duration.h> ros::Time last_update_; // 在构造函数初始化 last_update_ = ros::Time::now(); // 在回调函数中计算时间差 ros::Time current_time = ros::Time::now(); double dt = (current_time - last_update_).toSec(); last_update_ = current_time; // 应用加速度限制 double target_linear = ...; // 根据按键计算目标速度 linear_speed_ += std::min(target_linear - linear_speed_, max_accel_ * dt); ``` #### 六、调试命令 1. **查看按键映射**: ```bash rostopic echo /joy | grep "buttons:" ``` 2. **动态调整参数**: ```bash rosparam set /turtle_button_control/move_speed 3.0 ``` 3. **可视化按键事件**: ```bash rqt_plot /joy/buttons[4] /joy/buttons[5] # 监控特定按键状态 ``` #### 七、工程优化建议 1. **使用动作服务器**实现连续运动控制: ```cpp #include <actionlib/server/simple_action_server.h> #include <turtlesim/MoveAction.h> class MoveActionServer { // 实现动作预判和中断功能 }; ``` 2. **添加状态机**处理复杂控制逻辑: ```cpp enum ControlState { IDLE, MOVING, TURNING }; ControlState current_state_ = IDLE; ``` --相关问题--: 1. 如何实现手柄按键与摇杆的混合控制模式? 2. ROS中如何创建自定义手柄消息类型? 3. 怎样为按键控制添加防抖机制?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值