ipa 覆蓋算法測試

相關文章

ipa 功能包測試

ipa 分區算法?ipa 分區算法總結,部分算法圖解

ipa 覆蓋算法分析(一)

ipa 覆蓋算法分析(二)

測試

網上找的地圖:

fig.1 測試地圖

opencv

fig.2 opencv 顯示的覆蓋路徑

rviz

fig.3 rviz 顯示的覆蓋路徑

rviz 中 path 話題只是將路徑點連線起來而沒有顯示路徑點,單看話題還以為在障礙物和未知區域內規劃了路徑。cv 圖片雖然區分了路徑點和路線,但也只有灰度圖像不方便看。所以最好在 rviz 中再補個路徑點的話題。

為了方便觀察,補充 posearray 話題顯示所有路徑點和起點終點。

效果如下,綠線是路徑,紅色箭頭是路徑點,藍色箭頭是起點和終點。

fig.4 rviz 顯示的覆蓋路徑和路徑點

Ipa 參數測試

覆蓋算法

action 數據結構

客戶端發送任務參數對算法也有影響,下面是 action.goal 數據結構

# goal definition
sensor_msgs/Image input_map # 地圖,# 8bit 8UC1 灰度圖, 0 (黑) 表示障礙物, 255 (白) 表示自由空間#            todo: the image needs to be vertically mirrored compared to the map in RViz for using right coordinate systems#                  OccupancyGrid map = origin lower left corner, image = origin upper left corner#            todo: take the OccupanyGrid message here instead to avoid confusion and deal with map coordinates in server
float32 map_resolution # 地圖分辨率,單位:米/柵格
geometry_msgs/Pose map_origin # 地圖原點位置,暫不支持角度
float32 robot_radius # 沒有用到,看注釋是要考慮機器半徑來檢查碰撞的
float32 coverage_radius # 下面 planning_mode = 1 時候用的 footprint 覆蓋面積
geometry_msgs/Point32[] field_of_view # 用 4 個點表示機器感知區域,x 軸朝前,y 朝左。下面 planning_mode = 2 時候使用
geometry_msgs/Point32 field_of_view_origin # 上面 field_of_view 的原點在機器坐標系中的位置
geometry_msgs/Pose2D starting_position # starting pose of the robot in the room coordinate system [meter,meter,rad]
int32 planning_mode # @1:機器 footprint 計算覆蓋面積 @2:傳感器感知計算覆蓋面積

參數測試

在 ipa_room_exploration/ros/launch 中覆蓋算法有 3 個參數服務器配置文件

cob_map_accessibility_analysis_params 文件

5 個參數都沒用到

coverage_monitor_server_params 文件

  • map_frame

Map 坐標名,tf 轉換用

  • robot_frame

機器坐標名,tf 轉換用

  • coverage_radius

有效覆蓋半徑,單位米,以實際覆蓋區域的最大內接圓計算。然后用 coverage_radius 計算覆蓋柵格的大小,如下圖,綠色區域是有效覆蓋半徑,藍色正方形是其覆蓋柵格。

fig.5 覆蓋柵格

調整參數測試,左邊 0.25m,右邊 0.5m。可以看出該參數直接影響行距。

fig.6 coverage_radius 參數測試
  • coverage_circle_offset_transform

??沒用

  • robot_trajectory_recording_active

??coverage_monitor_server.cpp 中監測覆蓋路徑執行情況,記錄,顯示機器運行軌跡。

room_exploration_action_server_params 文件

  • room_exploration_algorithm

覆蓋算法選擇。

  • display_trajectory

是否顯示算法步驟。

算法選擇 boustrophedon explorator ,coverage_radius 是 0.25m。

左邊是 cell path 步驟,中間是 path 步驟,右邊是最后的 rviz 顯示。

fig.7 display_trajectory 參數測試

僅僅是服務端多顯示一步 “cell path” ,把路徑點轉到柵格地圖顯示而已。

  • map_correction_closing_neighborhood_size

設置地圖預處理中的“腐蝕-膨脹”的開操作(雖然源碼注釋是閉操作)迭代次數,開操作主要用于過濾噪音。

源碼中使用 3*3 的核對地圖圖片進行處理,迭代 n 次意味著能夠過濾 n 個像素的噪聲。

需要注意到 opencv 中腐蝕和膨脹都是對白色像素的操作!

所以源碼的處理實際上是對自由空間的噪音的過濾,可以根據需要修改代碼選擇開閉操作。

給測試地圖增加噪點像素:

fig.8(a) 增加噪點的測試地圖
fig.8(b) 增加噪點的障礙物
fig.8(c) 增加噪點的障礙物

用 map_correction_closing_neighborhood_size = 2 測試:

從左到右分別是:腐蝕步驟,膨脹步驟,規劃路徑,rviz顯示

fig.9 map_correction_closing_neighborhood_size 參數測試
  • return_path

返回路徑到覆蓋 action 的 result 中,同時發布 rviz 話題。

  • execute_path

是否執行路徑,該功能會在覆蓋路徑上選擇目標發布給到 move_base,同時記錄機器軌跡。

  • goal_eps

執行路徑時候,選擇的目標點與機器最小距離。

  • use_dyn_goal_eps

啟用該功能的話當路徑曲率越大,目標選擇最近,goal_eps 作為選點最遠距離。

  • interrupt_navigation_publishing

  • revisit_areas

因為計算或者動態障礙物干擾忽略過的區域是否要回去訪問。

  • left_sections_min_area

重新訪問時候,最小的未訪問區域大小。

  • global_costmap_topic

全局地圖話題名

  • coverage_check_service_name

沒用到

  • map_frame

map 坐標系名

  • camera_frame

相機坐標系名

============================== 規劃器 ==============================

****************** TSP 規劃器 ******************?

  • tsp_solver

根據注釋

tsp 規劃器第一類求解器 Nearest Neighbor 效果:

fig.9(a) tsp_solver 參數測試

tsp 規劃器第三類求解器 Concorde solver 需要到官網下載,注釋說這個規劃算法更加費時我就不折騰看了。

??略...

  • tsp_solver_timeout

Tsp 規劃超時時間,單位秒

??****************** 牛耕法規劃器 ******************

  • min_cell_area

為了方便查看效果,rviz 增加了單元區域顯示,序號是單元遍歷順序。

測試圖片是 200 pixel * 200 pixel = 40000 pixel^2。

下圖左邊是 min_cell_area = 200 效果,右圖是 min_cell_area = 10000 效果。可以看到右圖中 No.0 單元面積非常大,遠不止 10000 pixel^2。

fig.10 min_cell_area 參數測試

看了下代碼,源碼的實現是跳過面積小于 min_cell_area 的單元,當遇到面積滿足條件的單元后,再合并前面被忽略的相鄰單元給到當前單元。由于 0 到 6 號單元面積都不滿足條件,且都相鄰,所以都被合并進 7 號單元了。

測試了 room_exploration_algorithm = 8 的改進牛耕算法,這部分單元融合效果是一樣的。

  • path_eps

覆蓋路徑點間距,單位是像素。

測試 room_exploration_algorithm = 2 牛耕法,左邊 2 圖是 path_eps = 6.0,右邊 2 圖是 path_eps = 10.0。

fig.11 path_eps 參數測試
  • grid_obstacle_offset

第一個應用:計算 min_cell_width,在單元合并時候,寬高小于 min_cell_width 的單元會被相鄰的大單元合并。

const int min_cell_width = half_grid_spacing_as_int + 2.*grid_obstacle_offset/map_resolution;

第二個應用:單元區域內計算牛耕路徑之前,會腐蝕迭代 (半個覆蓋柵格+grid_obstacle_offset) 次。

cv::erode(room_map, inflated_room_map, cv::Mat(), cv::Point(-1, -1), half_grid_spacing_as_int+grid_obstacle_offset);

這里腐蝕的 grid_obstacle_offset 個柵格可以認為是對障礙物的膨脹,增加了路徑安全保障。因為規劃的路徑認為是機器中心跟隨的,為保障路徑可行,需要腐蝕掉大于半個機器半徑的自由柵格空間。

如圖 fig.12 所示,藍色圓圈表示機器(如果是幾何外形,可以用最大外接圓代替),中間棕色正方形 ABCD 就是覆蓋柵格區域,girdObstacleOffset 距離就是最小的安全障礙物膨脹距離 grid_obstacle_offset 。由于源碼的計算得到的是 int 類型,小于 1 地圖柵格還會變為 0 個柵格,所以 grid_obstacle_offset 還得大于等于地圖分辨率。另一種做法是用 std::ceil 向上取整。

fig.12 grid_obstacle_offset 參數意義圖示

左圖 grid_obstacle_offset = 0.251,右圖 grid_obstacle_offset = 0.1。右圖單元邊界附近的路徑更多一些。

fig.13(a) grid_obstacle_offset 參數測試

為什么圖 fig.13(a) 中地圖上方路徑點距離邊界遠一點,但是地圖下方路徑距離邊界卻很近?增加測試代碼顯示旋轉后的地圖如圖 fig.13(b),旋轉后的地圖邊界(一圈障礙物)確實發生了改變,實際上右側已經沒有黑色像素了。而原圖 fig.13(c) 的地圖邊界原本就是整齊的,這說明 ipa 的旋轉步驟會引入噪聲。

fig.13(b) 旋轉后的地圖
fig.13(c) 測試原地圖

為什么圖 fig.13(a) 中 0 號單元區域左側空隙較大?

源碼是在被腐蝕自由區域后的地圖上(增加路徑安全距離),再在單元區域內計算牛耕覆蓋路徑。被腐蝕區域大小是 half_grid_spacing_as_int+grid_obstacle_offset ,也就是上面提到的第二個應用。

fig.13(d) 第 0 號單元區域

圖 fig.13(e) 上方就是第 0 號單元區域。可以看到腐蝕后自由空間已經不多了。

fig.13(e) 腐蝕掉半個機身的地圖

總的來說,地圖旋轉導致了誤差, 安全距離腐蝕自由區域再次放大了誤差,導致最后得到的路徑異常。

  • max_deviation_from_track

遇到障礙物時候,牛耕路徑最大偏移量,單位:地圖像素。設置為負值會自動調整。

左圖 max_deviation_from_track = 0,右圖 max_deviation_from_track = 8,地圖分辨率是 0.05cm。

fig.14 max_deviation_from_track 參數測試

發現單元相接的位置,牛耕路徑是會有重疊的!原因是牛耕路徑規劃是單個單元區域進行的,各個單元并不知道相鄰單元的規劃情況,導致有大量路徑重疊。

  • cell_visiting_order

單元遍歷順序, cell_visiting_order = 1 是 TSP 規劃, cell_visiting_order = 2 是從左到右遍歷。

左圖是順序遍歷,右圖是 TSP 遍歷。

TSP 的起點以機器所在單元開始,這里單元區域被簡化為單元的中心點也就是單元編號所在的位置來計算的。

fig.15 cell_visiting_order 參數測試

****************** 神經網絡規劃器 ******************

神經網絡規劃器有些抽象,應該要像論文那樣動態地觀察網絡是如何更新的才好理解,源碼中大概掃了一眼沒有找到動態觀察的調試功能,下面就是簡單地測試 ipa 參數。

神經元定義(部分):

class Neuron
{
protected:// 外部刺激double I(){if(obstacle_ == true)return -1.0*E_;else if(visited_ == false)return E_;elsereturn 0.0;}// 神經信號值更新void updateState(){// get external inputconst double input = I();// get the current sum of weights times the state of the neighbordouble weight_sum = 0;for(size_t neighbor=0; neighbor<neighbors_.size(); ++neighbor)weight_sum += weights_[neighbor]*std::max(neighbors_[neighbor]->getState(true), 0.0);// calculate current gradient --> see stated paper from the beginningdouble gradient = -A_*state_ + (B_-state_)*(std::max(input, 0.0) + weight_sum) - (D_+state_)*std::max(-1.0*input, 0.0);// update state using euler methodstate_ += step_size_*gradient;}
}
  • step_size

神經信號增益。

左圖 step_size = 0.0008,中圖 step_size = 0.008,右圖 step_size = 0.012。

fig.16 step_size 參數測試
  • A

神經信號衰減值。

左圖 step_size = 0.008,A = 17,右圖 step_size = 0.008,A = 10。

fig.17 A 參數測試
  • B

神經信號的最高預期值。當神經元信號高于該值,下次迭代中信號會被拉低。

左圖 step_size = 0.008,A = 17,B = 5,右圖 step_size = 0.008,A = 17,B = 10。

fig.18 B 參數測試
  • D

神經信號的最低預期值。當神經元信號低于該值,下次迭代中信號會被拉高。

左圖 step_size = 0.008,A = 17,B = 5,D = 7,右圖 step_size = 0.008,A = 17,B = 5,D = 3。

fig.19 D 參數測試
  • E

外部刺激信號大小,E 來自障礙物,未訪問區域或者已訪問區域。

左圖 step_size = 0.008,A = 17,B = 5,D = 7,E = 80。

右圖 step_size = 0.008,A = 17,B = 5,D = 3,E = 200。

fig.20 E 參數測試
  • mu

相鄰神經元的影響權重,該權重會被距離稀釋。

左圖 step_size = 0.008,A = 17,B = 5,D = 7,E = 80,mu = 1.03。

右圖 step_size = 0.008,A = 17,B = 5,D = 3,E = 200,mu = 1.3。

fig.21 mu 參數測試
  • delta_theta_weight

相鄰神經元的角度影響權重

左圖 step_size = 0.008,A = 17,B = 5,D = 7,E = 80,mu = 1.03,delta_theta_weight = 0.15。

右圖 step_size = 0.008,A = 17,B = 5,D = 3,E = 200,mu = 1.03,delta_theta_weight = 0.3。

fig.22 delta_theta_weight 參數測試

****************** 凸感知放置規劃器 ******************

在覆蓋規劃客戶端修改 goal 的 planning_mode=2 用傳感器感知區域計算覆蓋,同時將傳感器感知范圍 field_of_view 設置如下,大概模擬下扇形感知:

std::vector<geometry_msgs::Point32> fov_points(4);
fov_points[0].x = 0.0;
fov_points[0].y = 0.0;
fov_points[1].x = 0.5;
fov_points[1].y = 0.4;
fov_points[2].x = 0.5;
fov_points[2].y = -0.4;
fov_points[3].x = 0.6;
fov_points[3].y = 0.0;
fig.23 凸感知范圍簡化幾何
  • cell_size

凸感知使用的地圖分辨率,單位是地圖像素。cell_size <= 0 會自動檢測分辨率,十分費時且效果不佳。分辨率越小規劃越精確,但是求解時間越久。

左邊是 cell_size = 0 自動檢測分辨率和規劃都十分耗時,右邊是 cell_size = 7,計算快多了。

fig.24 cell_size 參數測試
  • delta_theta

求解傳感器放置位姿時候,傳感器放置角度的采樣步進,單位是弧度。

delta_theta = 0.78539816339 和 delta_theta = 1.570796。

fig.25 delta_theta 參數測試

****************** 流網絡規劃器 ******************

程序陷入死循環,代碼未完成。

  • curvature_factor

  • max_distance_factor

缺陷

  • TSP 規劃十分耗時!

  • 牛耕算法中,旋轉地圖引入了噪聲。

為什么圖 fig.13 中地圖上方路徑點距離邊界遠一點,但是地圖下方路徑距離邊界卻很近?增加測試代碼顯示旋轉后的地圖如圖 fig.26,旋轉后的地圖邊界(一圈障礙物)確實發生了改變,實際上右側已經沒有黑色像素了。而原圖 fig.27 的地圖邊界原本就是整齊的,這說明 ipa 的旋轉步驟會引入噪聲。

fig.26 旋轉后的地圖
fig.27 測試原地圖

為什么在牛耕算法測試中 0 號單元區域左側空隙較大?

源碼是在被腐蝕自由區域后的地圖上(增加路徑安全距離),再在單元區域內計算牛耕覆蓋路徑。被腐蝕區域大小是 half_grid_spacing_as_int+grid_obstacle_offset ,也就是上面提到的第二個應用。

fig.28 第 0 號單元區域

??圖 fig.29 上方就是第 0 號單元區域。可以看到腐蝕后自由空間已經不多了。

fig.29 腐蝕掉半個機身的地圖

總的來說,地圖旋轉導致了誤差, 安全距離腐蝕自由區域再次放大了誤差,導致最后得到的路徑異常。

  • 單元內部存在重疊路徑。

在 max_deviation_from_track 參數測試步驟中,可以發現在 0 號單元內存在重疊路徑(圖 fig.30 左側),當提高 max_deviation_from_track 偏移值后,路徑別沒有重疊了(圖 fig.30 右側)。

fig.30 單元內路徑重疊
  • 牛耕法單元之間路徑沒有連接。

Ipa 功能包是為 move_base 框架服務的,ipa 負責規劃覆蓋路徑,然后根據機器定位和感知情況,選擇路徑點提供給 move_base,move_base 再進行點到點規劃執行任務。

  • 單元區間之間存在重疊的路徑。

因為每個單元區是單獨計算的!

  • 單元合并不合理。

應該是小面積單元先嘗試與之前所有相鄰的小單元合并檢查面積是否達標,不達標則暫時忽略跳過。

  • 單元遍歷順序不合理。

就算是 TSP 規劃遍歷順序,用簡化的單元中心點計算也不合適。可以做成實時的規劃,因為有時候因為動態障礙物干擾導致單元訪問完畢后,終點位置會有變化。

  • 凸感知放置算法中,感知范圍設置只支持 4 個點的多邊形。

改進

  • 單元分解中,對于單個超大面積單元,可以增加分解。就是說單元分解不僅有最小面積限制,還有最大面積限制,超過最大單元面積需要分解為小單元。

  • 障礙物邊緣可以稍微離遠點,提高路徑執行效率。另外執行沿邊規劃來訪問地圖邊緣。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16019.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16019.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6.定時器分時復用測量占空比

1.CUBEMAX配置 測量PA6&#xff0c;PA7輸出的占空比&#xff0c;只需要把主要的配置&#xff0c;配置為A6口就行&#xff0c;A7口黃色表示配置不正確&#xff0c;不用管。 2.軟件代碼 TIME.c中找到TIM3的初始化&#xff0c;在后面初始化A7口 void MX_TIM3_Init_PA7(void) {/*…

創新實訓2024.05.25日志:Web應用技術選型

我們的web應用使用python web的fastapi框架&#xff0c;通過uvicorn開啟web服務。 1. refs 官網文檔&#xff1a;FastAPI (tiangolo.com) github&#xff1a;https://github.com/tiangolo/fastapi 2. 環境配置 python:3.11 uvicorn:0.29.0 pip install "uvicorn[stan…

老外賣27刀每月的教程已經更新

用了兩天半的時間&#xff0c;邊學習&#xff0c;邊整理了一份老外的視頻教程&#xff0c;涉及Facebook&#xff0c;YouTube&#xff0c;tiktok等大的流量平臺&#xff0c;有案例&#xff0c;有分析&#xff0c;有如何做。 這個教程是老外講的&#xff0c;沒有什么玄乎的塑造價…

理解矩陣內積與矩陣乘法的區別及其應用

文章目錄 矩陣內積&#xff08;逐元素乘積&#xff09;矩陣內積的用途矩陣乘法&#xff08;矩陣積&#xff09;矩陣乘法的用途區別總結結論 在數據科學、機器學習、計算機圖形學和圖像處理等領域&#xff0c;矩陣運算是非常基礎且重要的操作。然而&#xff0c;矩陣內積和矩陣乘…

【java程序設計期末復習】chapter3 運算符、表達式和語句

運算符、表達式和語句 Java提供了豐富的運算符&#xff0c;如算術運算符、關系運算符、邏輯運算符、位運算符等。 Java語言中的絕大多數運算符和C語言相同&#xff0c;基本語句&#xff0c;如條件分支語句、循環語句等也和C語言類似&#xff0c;因此&#xff0c;本章就主要知識…

聊聊ChatGPT的本質

這是鼎叔的第九十八篇原創文章。行業大牛和剛畢業的小白&#xff0c;都可以進來聊聊。 階段性總結下我對ChatGPT的基礎理解&#xff0c;算是一篇學習思考筆記吧。其中難免有很多不準確的&#xff0c;或過于簡略的地方&#xff0c;將來再迭代學習。 OpenAI做ChatGPT的底層邏輯…

GitLab的原理及應用詳解(六)

本系列文章簡介&#xff1a; 隨著軟件開發的不斷進步和發展&#xff0c;版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具&#xff0c;在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能&#xff0c;還集成了項…

如何利用線程池實現互聯網驗證碼保護服務

如何利用線程池實現互聯網驗證碼保護服務 1、業務背景與實現思路2、代碼實操1、業務背景與實現思路 首先介紹一下業務背景,假設我們的系統是一個短視頻播放網站,每個新加入的用戶都需要注冊賬號并綁定手機號。為了驗證用戶手機的正確性,我們的系統會發送一條驗證碼到用戶注…

HBase到底是列式存儲還是行式存儲?

行存和列存 在行存儲的數據庫系統中&#xff0c;一行中的所有字段值都是連續存儲的&#xff1b;在基于行存儲的表中&#xff0c;即使只需要讀取指定列時&#xff0c;也需要先將對應行的數據讀取到內存&#xff0c;再過濾目標列&#xff0c;這樣會導致過多的磁盤IO、內存和時間…

隊列——鏈式存儲

核心思路&#xff1a; 1、首先定義隊列結點&#xff0c;包含數據域和指針域&#xff1b;然后定義鏈式隊列&#xff0c;包含隊列節點類型的隊頭和隊尾指針。 2、初始化&#xff1a;     帶頭結點&#xff1a;給頭結點分配內存&#xff0c;然后隊頭和隊尾指針指向頭結點&…

每日一題 字符串排序

目錄 1.前言 2.題目解析 3.算法原理 4.代碼實現 1.前言 在編程練習中&#xff0c;字符串的全排列問題是一個經典的算法問題。通過對字符串進行全排列&#xff0c;可以得到該字符串的所有可能的排列組合。本文將探討如何對含有重復字符的字符串進行全排列&#xff0c;并且解決…

K8s的kubectl的基本操作

K8s的kubectl的基本操作 K8s基本信息的查看 查看版本信息 kubectl versio查看資源對象簡寫 kubectl api-resources查看集群信息 kubectl cluster-info配置kubectl自動補全 source <(kubectl completion bash)查看master節點狀態 kubectl get cs查看命名空間 kubectl…

10.js預解析

就是在代碼執行之前&#xff0c;對代碼進行通讀解釋 只解析兩個內容&#xff1a; &#xff08;1&#xff09;對var聲明的變量 &#xff08;2&#xff09;聲明式函數 &#xff08;1&#xff09;對var聲明的變量進行提前聲明&#xff0c;但不賦值 var x console.log(x) //undefi…

【找出第 K 大的異或坐標值】python

4層循環暴力超時 class Solution:def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:nums[]for a in range(len(matrix)):for b in range(len(matrix[0])):num0for i in range(a1):for j in range(b1):num^matrix[i][j]nums.append(num)nums.sort()retu…

web安全滲透測試十大常規項(一):web滲透測試之CSRF跨站請求偽造

滲透測試之CSRF跨站請求偽造 CSRF跨站請求偽造 CSRF跨站請求偽造

類的內存對齊位段位圖布隆過濾器哈希切割一致性哈希

文章目錄 一、類的內存對齊1.1規則1.2原因 二、位段2.1介紹2.2內存分配問題2.3跨平臺問題2.4使用的注意事項 三、位圖的應用3.1 給40億個不重復的無符號整數&#xff0c;找給定的一個數。&#xff08;int的范圍可以到達42億多&#xff09;3.2 給定100億個整數&#xff0c;設計算…

Golang實現文件復制

方法&#xff1a;三種 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy進行文件的復制&#xff0c;同時也會復制文件的所有權限 // param src 復制文件 // param des 目標文件 // return error 錯誤信息 func CopyFile(s…

2024年弘連網絡FIC大會競賽題線下決賽題

總結&#xff1a; FIC決賽的時候&#xff0c;很多小問題沒發現&#xff0c;在pve平臺做題確實很方便。 這套題目復盤完&#xff0c;服務器這塊的知識確實收獲了很多&#xff0c;對pve集群平臺和網絡拓撲也有了一定的認識&#xff0c;感謝各位大佬悉心指導。 接下來&#xff0…

【FPGA】Verilog:奇校驗位生成器的實現(Odd Parity bit generator)

解釋奇數奇偶校驗位生成器和檢查器的仿真結果及過程。 真值表和卡洛圖: Odd Parity Bit Generator A B C

怎么在pyqt中顯示matplotlib的繪圖?

想要在pyqt中顯示matplotlib的繪圖&#xff0c;在繪圖時&#xff0c;其實不必使用以下語句&#xff1a; matplotlib.use("Qt5Agg") # 聲明使用QT5最關鍵的語句是&#xff1a; from matplotlib.backends.backend_qt5agg import FigureCanvasQTAggFigureCanvasQTAgg…