航)
ROS2運(yùn)行海龜模擬器#啟動海龜模擬器 ros2 run turtlesim turtlesim_node #啟動海龜模擬器鍵盤控制節(jié)點(diǎn) ros2 run turtlesim turtle_teleop_key工作環(huán)境source install/setup.bash編譯colcon build可視化修改參數(shù)工具rqt查看參數(shù)列表ros2 param list參數(shù)查詢與修改ros2 param describe turtlesim background_b # 查看某個參數(shù)的描述信息 ros2 param get turtlesim background_b # 查詢某個參數(shù)的值 ros2 param set turtlesim background_b 10 # 修改某個參數(shù)的值參數(shù)文件保存與加載ros2 param dump turtlesim turtlesim.yaml # 將某個節(jié)點(diǎn)的參數(shù)保存到參數(shù)文件中 ros2 param load turtlesim turtlesim.yaml # 一次性加載某一個文件中的所有參數(shù)顯示串口ll /dev | grep tty* ll /dev | grep ttyUSB*啟動導(dǎo)航這是我自己的不要用#運(yùn)行底盤控制 ros2 run airobot_pkg move #運(yùn)行雷達(dá) ros2 launch lslidar_driver lsm10_uart_launch.py #發(fā)布tf坐標(biāo) ros2 launch rm_bringup urdf2tf.launch.py #啟動建圖cartographer_ros ros2 launch cartographer_ros mylaser.launch.py #啟動建圖slam_toolbox ros2 launch slam_toolbox online_async_launch.py use_sim_time:False #鍵盤控制 ros2 run teleop_twist_keyboard teleop_twist_keyboard #或者 ros2 run airobot_pkg mbot_teleop #停止建圖 ros2 service call /finish_trajectory 0 #保存地圖 ros2 run nav2_map_server map_saver_cli -f ~/ros2bookcode/ros2_ws/src/rm_navigation2/maps/zoulang #進(jìn)行導(dǎo)航 ros2 launch rm_navigation2 navigation2.launch.py #添加導(dǎo)航航點(diǎn) ros2 launch wp_map_tools add_waypoint_sim.launch.py #航點(diǎn)保存節(jié)點(diǎn) ros2 run wp_map_tools wp_saver #啟動航點(diǎn)導(dǎo)航 ros2 launch rm_navigation2 waypoint_nav.launch.py #運(yùn)行航點(diǎn)導(dǎo)航 ros2 run rm_navigation2 waypoint_navigation #以下是相機(jī)與機(jī)械臂 夾爪使用python運(yùn)行 serial_control.py #相機(jī)~/rosbookcode/orbbec_ws$ roslaunch orbbec_camera gemini_330_series.launch #運(yùn)行二維碼識別~/rosbookcode/orbbec_ws$ roslaunch orbbec_camera gemini_330_series.launch #機(jī)械臂 sudo ifconfig enxe04e7ad23ef3 192.168.1.150 #運(yùn)行movit規(guī)劃~/rosbookcode/gluon_ws$ roslaunch gluon_moveit_config cm_demo.launch #運(yùn)行給定坐標(biāo)規(guī)劃任務(wù) ~/rosbookcode/gluon_ws$ roslaunch moveit_tutorials move_group_interface_tutorial.launch發(fā)布速度控制命令ros2 topic pub /cmd_vel geometry_msgs/msg/Twist linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0RDKX5項(xiàng)目命令#運(yùn)行底盤控制 ros2 run airobot_pkg smallcar_move #運(yùn)行雷達(dá) ros2 launch ldlidar_stl_ros2 ld06.launch.py ros2 launch turn_on_wheeltec_robot wheeltec_lidar.launch.py #發(fā)布tf坐標(biāo) ros2 launch rm_bringup urdf2tf.launch.py #啟動建圖cartographer_ros ros2 launch cartographer_ros mylaser.launch.py #啟動建圖slam_toolbox ros2 launch slam_toolbox online_async_launch.py use_sim_time:False #鍵盤控制 ros2 run teleop_twist_keyboard teleop_twist_keyboard #或者 ros2 run airobot_pkg mbot_teleop #停止建圖 ros2 service call /finish_trajectory 0 #保存地圖 ros2 run nav2_map_server map_saver_cli -f ~/ros2bookcode/ros2_ws/src/rm_navigation2/maps/zoulang #進(jìn)行導(dǎo)航 ros2 launch rm_navigation2 navigation2.launch.py #添加導(dǎo)航航點(diǎn) ros2 launch wp_map_tools add_waypoint_sim.launch.py #航點(diǎn)保存節(jié)點(diǎn) ros2 run wp_map_tools wp_saver #啟動航點(diǎn)導(dǎo)航 ros2 launch rm_navigation2 waypoint_nav.launch.py #運(yùn)行航點(diǎn)導(dǎo)航 ros2 run rm_navigation2 waypoint_navigation #攝像頭ascam ros2 launch ascamera hp60c.launch.py #運(yùn)行識別 ros2 run qrnode_pkg rdk_power_QTLivox-MID-70雷達(dá)ros2使用livox-ros2-driver 首先mid70在ros2上的驅(qū)動是livox-ros2-driver而不是livox-ros-driver2。發(fā)布的點(diǎn)云格式為 livox_interfaces/msg/custommsg。 具體安裝方法見https://github.com/Livox-SDK/livox_ros2_driver 原文鏈接https://blog.csdn.net/omnas/article/details/145163154 從覽沃 GitHub 獲取覽沃 ROS2 驅(qū)動程序 git clone https://github.com/Livox-SDK/livox_ros2_driver.git ws_livox/src sudo ifconfig eno1 192.168.1.50 rviz小記 fixed_frame: livox_frame #固定坐標(biāo)系 pointclound2: topic– livox/lidar Decay Time: 1 #值越大激光線越密集圖像顯示效果越好 style: point 模式選擇 FAST-LIOFast LiDAR-Inertial Odometry是一種高效的激光雷達(dá)-慣性里程計(jì)算法由香港大學(xué)HKU開發(fā).FAST-LIO結(jié)合了激光雷達(dá)LiDAR和慣性測量單元IMU的數(shù)據(jù)通過緊耦合的迭代擴(kuò)展卡爾曼濾波器EKF實(shí)現(xiàn)高精度的位姿估計(jì)。該算法在快速運(yùn)動、噪聲或雜亂環(huán)境中表現(xiàn)出色具有計(jì)算效率高和魯棒性強(qiáng)的特點(diǎn)。 FAST_LIO_ROS2 git clone https://github.com/Ericsii/FAST_LIO_ROS2.git --recursive git clone https://github.com/Ericsii/FAST_LIO.git --recursive pcl包 sudo apt install ros-humble-pcl-ros 保存點(diǎn)云圖并查看 catlubancat:~$ ros2 service call /map_save std_srvs/srv/Triggerrequester: making request: std_srvs.srv.Trigger_Request()response:std_srvs.srv.Trigger_Response(successTrue, messageMap saved.) 可以使用pcl_viewer工具進(jìn)行查看sudo apt-get install pcl-toolspcl_viewer test.pcdLivox-MID-360雷達(dá)ros2使用注意更改路徑~/ws_livox/install/livox_ros_driver2/share/livox_ros_driver2/config下的MID360_config.json配置參考https://blog.csdn.net/bitswh/article/details/148477007?ops_request_miscelastic_search_miscrequest_idcff5bfc805d40a6c0fae41640a033e51biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-148477007-null-null.142^v102^pc_search_result_base9utm_termmid360ROS2spm1018.2226.3001.4187與https://www.cnblogs.com/oliudaneng/p/18964156安裝3D地圖轉(zhuǎn)換柵格地圖需要的庫 pip3 install open3d opencv-python PyYAML numpy # 安裝 ROS2 依賴 sudo apt install -y ros-$ROS_DISTRO-nav2-map-server \ ros-$ROS_DISTRO-nav2-common \ ros-$ROS_DISTRO-geometry-msgs # 安裝 Python 依賴 pip3 install open3d opencv-python PyYAML numpy#以下指令在~/ros2bookcode/ros2_ws工作空間下 #啟動底盤控制發(fā)布里程計(jì) ros2 run airobot_pkg move #啟動底盤控制不發(fā)布里程計(jì) ros2 run airobot_pkg fastlio_move #啟動底盤控制發(fā)布里程計(jì)odom_car ros2 run airobot_pkg fastlio2_move #啟動鍵盤控制 ros2 run airobot_pkg mbot_teleop #松靈底盤每次斷電時執(zhí)行此命令 sudo bash /src/ranger_ros2/ranger_bringup/scripts/bringup_can2usb.bash sudo ip link set can0 up type can bitrate 500000 #啟動基礎(chǔ)節(jié)點(diǎn)ranger_mini_v3 $ ros2 launch ranger_bringup ranger_mini_v3.launch.py #for ranger_mini 3.0 #啟動urdf的TF坐標(biāo)發(fā)布 ros2 launch rm_bringup fastlio_urdf2tf.launch.py #以下指令在~/ros2bookcode/livox_ws工作空間下 #啟動雷達(dá) ros2 launch livox_ros_driver2 msg_MID360_launch.py ros2 launch livox_ros_driver2 rviz_MID360_launch.py #啟動FAST-LIO2建圖 ros2 launch fast_lio mapping.launch.py config_file:mid360.yaml #保存地圖 ros2中建圖不能直接保存PCD需要call service ros2 service call /map_save std_srvs/srv/Trigger #使用pcl_viewer工具進(jìn)行查看sudo apt-get? install ? pcl-tools pcl_viewer test.pcd #生成柵格地圖并且發(fā)布地圖 ros2 launch pcd_to_gridmap pcd_to_gridmap_launch.py #將MID360自定義點(diǎn)云轉(zhuǎn)化為ROS標(biāo)準(zhǔn)點(diǎn)云格式 ros2 run rm_pointcloud_to_laserscan mid360_to_pointcloud2.py #運(yùn)行地面分割程序 ros2 run pcd_processor terrain_analysis_node.py ros2 run pcd_processor ray_ground_segmentation_node #使用pointcloud_to_laserscan將3D點(diǎn)云轉(zhuǎn)換成2D ros2 run rm_pointcloud_to_laserscan custom_pointcloud_to_laserscan.py #發(fā)布地圖 ros2 run pcd_to_gridmap grid_map_publisher.py #啟動ICP定位 ros2 launch icp_registration icp.launch.py #啟動fstlio_location定位 ros2 launch fast_lio_location mapping.launch.py #運(yùn)行nav2導(dǎo)航 ros2 launch robot_navigation2 navigation2.launch.py #運(yùn)行DBSCAN點(diǎn)云分割程序 ros2 run pcd_processor dbscan_clustering_node.py ros2 run pcd_processor multi_frame_dbscan_clustering_node #啟動攝像頭 ros2 launch orbbec_camera gemini_330_series.launch.py #運(yùn)行多傳感器融合的目標(biāo)檢測程序 ros2 run pcd_processor fused_detector_with_calib.py ros2 run pcd_processor semantic_conflict_fusion_node #錄制雷達(dá)點(diǎn)云包 ros2 bag record /livox/lidar #啟動延遲3秒后開始播放bag文件 ros2 bag play my_rosbag2_folder --delay 3.0 #0.1倍速播放 ros2 bag play 地下車庫坡道加障礙物/ --rate 0.1FAST_LIVO2部署教程https://blog.csdn.net/qq_62275910/article/details/153752091https://blog.csdn.net/qq_62275910/article/details/153752091與https://blog.csdn.net/qq_62275910/article/details/151625713?spm1001.2014.3001.5502https://blog.csdn.net/qq_62275910/article/details/151625713?spm1001.2014.3001.5502運(yùn)行指令都需要在工作空間之下 ros2 launch fast_livo mapping_avia.launch.py use_rviz:True ros2 bag play HKU_Centennial_Garden_ros2/ #錄制雷達(dá)包 ros2 bag record -o 1bag /livox/lidar #進(jìn)行標(biāo)定 ros2 launch fast_calib calib.launch.py 如果要修改實(shí)機(jī)與仿真需要修改camera_pinhole.yaml和avia.yaml直接列出所有網(wǎng)絡(luò)接口名稱ls /sys/class/netRos2-SLAM-RPlidar 激光雷達(dá)git clone https://github.com/Slamtec/sllidar_ros2.git sudo chmod 777 /dev/ttyUSB0 #啟動 RPLidar 節(jié)點(diǎn) ros2 launch sllidar_ros2 sllidar_a3_launch.py #確認(rèn)正在發(fā)布掃描數(shù)據(jù) ros2 topic echo /scan #github連接 https://github.com/SYED-M-HUSSAIN/Ros2-Slam-RPlidarYOLOv8# 創(chuàng)建虛擬環(huán)境 conda create --name myYolov8 python3.8 # 激活環(huán)境 conda activate myYolov8 # CUDA 11.7安裝 Pytorch 1.13 pip install torch1.13.1cu117 torchvision0.14.1cu117 torchaudio0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117 # 安裝 ultralytics 包yolov8僅需要安裝這一個庫就ok了 pip install ultralytics 配置環(huán)境變量 export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH 然后執(zhí)行以下命令使環(huán)境變量生效 source ~/.bashrc #關(guān)閉conda環(huán)境 conda deactivate #添加環(huán)境 export PYTHONPATH/home/cyx/.conda/envs/myYolov8/lib/python3.8/site-packages:$PYTHONPATH #查看顯卡命令 lspci | grep -i vga # 查看所有 VGA 兼容顯卡通用 lspci | grep -i nvidia # 僅查看 NVIDIA 顯卡 lspci | grep -i amd # 僅查看 AMD 顯卡 lspci | grep -i intel # 僅查看 Intel 顯卡 nvidia-smi #數(shù)據(jù)集標(biāo)注 labelimgyolo taskdetect modepredict modelyolov8n.pt source~/1.jpg高斯?jié)姙R參考一下文章ubuntu22.04復(fù)現(xiàn)3DGS包含雙系統(tǒng)、cuda、conda、colmap的安裝_3dgs ubuntu-CSDN博客Ubuntu22.04及ROS2復(fù)現(xiàn)Fast_livo2包含ROS2的安裝、cmake的版本選擇等等_fastlivo2 復(fù)現(xiàn)-CSDN博客Ubuntu22.04結(jié)合fast_livo2進(jìn)行3DGS三維重建_fastlivo23dgs-CSDN博客高斯?jié)姙R的網(wǎng)址 https://github.com/graphdeco-inria/gaussian-splatting #創(chuàng)建虛擬環(huán)境 conda env create --file environment.yml #激活虛擬環(huán)境 conda activate gaussian_splatting 3DGS訓(xùn)練模型輸出成果 #進(jìn)入視頻存放文件夾 cd gaussian-splatting/data/Chomper/ #使用ffmpeg截取視頻幀為圖片在Chomper目錄下創(chuàng)建input目錄將截取好的圖片放到該目錄下 mkdir input ffmpeg -i Chomper.mp4 -vf setpts0.2*PTS input/input_%4d.jpg #返回到gaussian-splatting文件夾下使用源碼中的convert.py生成點(diǎn)云過程中會調(diào)用colmap cd ~/gaussian-splatting/ python convert.py -s data/Chomper/ #開始訓(xùn)練,訓(xùn)練完成后data文件夾下生成一個output文件夾里面存放著訓(xùn)練結(jié)果 python train.py -s data/Chomper -m data/Chomper/output 使用gaussian-splatting文件夾下的SIBR_viewers進(jìn)行可視化 路徑/home/cyx/3DGS/gaussian-splatting/SIBR_viewers/install/bin ./SIBR_gaussianViewer_app -m ~/3DGS/gaussian-splatting/data/Chomper/output/ 網(wǎng)址superspl https://superspl.at/editor 使用fastlivo的數(shù)據(jù)進(jìn)行訓(xùn)練 首先將 /fast_ws/src/fast_livo/Log/Clomap 下的 images 和 sparse 文件夾拷貝到 /gaussian-splatting/data/RS/ 下接著可以開始訓(xùn)練進(jìn)行重建 #激活虛擬環(huán)境 conda activate gaussian_splatting cd ~/gaussian-splatting/ python train.py -s data/RS -m data/RS/output #優(yōu)化生成高斯點(diǎn)云 查看高斯圖 ./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m ~/gaussian-splatting/data/RS/output/ 若是在運(yùn)行 train.py 階段提示顯存不足也可以通過降低圖片分辨率的方式進(jìn)行訓(xùn)練不過最終呈現(xiàn)的效果也會打折扣 # --resolution 2 表示分辨率降為原來的1/2, --resolution 3 則表示降為原來的1/3,以此類推 python train.py -s data/RS -m data/RS/output --resolution 2 .bin文件轉(zhuǎn)換成.txt文件 colmap model_converter \ --input_path /home/cyx/3DGS/gaussian-splatting/data/Chomper/sparse/0 \ --output_path /home/cyx/3DGS/gaussian-splatting/data/Chomper/sparse/0 \ --output_type TXT .txt文件轉(zhuǎn)換成.bin文件 colmap model_converter \ --input_path /home/cyx/3DGS/gaussian-splatting/data/Chomper/sparse/0 \ --output_path /home/cyx/3DGS/gaussian-splatting/data/Chomper/sparse/0 \ --output_type BIN使用SIBR_viewers可視化參考鏈接Ubuntu20.04 3DGS復(fù)現(xiàn)全流程-CSDN博客 3D Gaussian Splatting復(fù)現(xiàn)-CSDN博客將下面代碼保存為 .html 文件格式后打開可實(shí)現(xiàn)滑動來對比效果!DOCTYPE html html langzh-CN head style meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title自適應(yīng)比例圖片對比滑動組件/title link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css style * { margin: 0; padding: 0; box-sizing: border-box; font-family: Segoe UI, Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, #0f2027, #203a43, #2c5364); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 30px 20px; color: white; overflow-x: hidden; } .comparison-container { position: relative; width: 100%; max-width: 700px; /* 最大寬度 */ background: #000; box-shadow: 0 15px 50px rgba(0, 0, 0, 0.5); } .image-wrapper { position: relative; width: 100%; height: 0; padding-bottom: 56.25%; /* 默認(rèn)16:9比例可根據(jù)圖片的實(shí)際比例調(diào)整 */ } .comparison-image { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: block; object-fit: contain; } .twenty-before { clip: rect(0px, 50%, 100%, 0px); z-index: 2; } .twenty-after { clip: rect(0px, 100%, 100%, 50%); } .twenty-handle { position: absolute; left: 50%; top: 0; bottom: 0; width: 4px; background: white; cursor: ew-resize; z-index: 3; transform: translateX(-50%); box-shadow: 0 0 20px rgba(0, 0, 0, 0.8); } .twenty-handle::before { content: ; position: absolute; width: 50px; height: 50px; border-radius: 50%; background: white; top: 50%; left: 50%; transform: translate(-50%, -50%); box-shadow: 0 0 15px rgba(0, 0, 0, 0.7); } /style /head body div classcomparison-container idcomparison-container div classimage-wrapper idimage-wrapper img classcomparison-image twenty-before idbefore-image srchttps://i-blog.csdnimg.cn/direct/e54f5424002a49e19e08be193e65de20.png alt原始圖像 img classcomparison-image twenty-after idafter-image srchttps://i-blog.csdnimg.cn/direct/97ff516e878944df929b0c4a5b7925d5.png alt處理后圖像 div classtwenty-handle idhandle/div /div /div script document.addEventListener(DOMContentLoaded, function() { const container document.getElementById(image-wrapper); const beforeImg document.getElementById(before-image); const afterImg document.getElementById(after-image); const handle document.getElementById(handle); let isDragging false; let startX, startLeft; // 圖片加載后初始化組件 function initComponent() { // 設(shè)置容器比例 setContainerAspectRatio(beforeImg); setContainerAspectRatio(afterImg); // 初始化滑塊位置 initSlider(); } // 根據(jù)圖片寬高設(shè)置容器的比例 function setContainerAspectRatio(image) { const imgWidth image.naturalWidth; const imgHeight image.naturalHeight; const aspectRatio imgHeight / imgWidth; // 設(shè)置容器的高度比例 container.style.paddingBottom (aspectRatio * 100) %; } // 初始化滑塊位置 function initSlider() { const containerWidth container.offsetWidth; const position containerWidth / 2; updateClip(position); handle.style.left position px; } // 更新圖片裁剪區(qū)域 function updateClip(pos) { const containerHeight container.offsetHeight; beforeImg.style.clip rect(0px, ${pos}px, ${containerHeight}px, 0px); afterImg.style.clip rect(0px, ${container.offsetWidth}px, ${containerHeight}px, ${pos}px); } // 添加鼠標(biāo)事件 handle.addEventListener(mousedown, startDrag); // 添加觸摸事件 handle.addEventListener(touchstart, startDrag); // 容器點(diǎn)擊事件 container.addEventListener(click, function(e) { if (isDragging) return; const rect container.getBoundingClientRect(); const position e.clientX - rect.left; updateClip(position); handle.style.left position px; }); // 開始拖動 function startDrag(e) { e.preventDefault(); isDragging true; const startX e.clientX || e.touches[0].clientX; const startLeft parseFloat(handle.style.left); function onDrag(e) { const currentX e.clientX || e.touches[0].clientX; const rect container.getBoundingClientRect(); let newPosition startLeft (currentX - startX); // 限制位置在容器范圍內(nèi) newPosition Math.max(0, Math.min(newPosition, container.offsetWidth)); updateClip(newPosition); handle.style.left newPosition px; } function stopDrag() { document.removeEventListener(mousemove, onDrag); document.removeEventListener(mouseup, stopDrag); document.removeEventListener(touchmove, onDrag); document.removeEventListener(touchend, stopDrag); isDragging false; } document.addEventListener(mousemove, onDrag); document.addEventListener(mouseup, stopDrag); document.addEventListener(touchmove, onDrag, { passive: false }); document.addEventListener(touchend, stopDrag); } // 窗口大小變化時重新計(jì)算 window.addEventListener(resize, function() { initSlider(); }); // 圖片加載后初始化 beforeImg.addEventListener(load, function() { initComponent(); }); afterImg.addEventListener(load, function() { initComponent(); }); // 如果圖片已經(jīng)加載完成 if (beforeImg.complete afterImg.complete) { initComponent(); } }); /script /body /htmlRAICOM???啟動spark各種驅(qū)動 roslaunch spark_bringup driver_bringup.launch camera_type_tel:d435 #啟動TF坐標(biāo)以及底盤 roslaunch spark_bringup base_bringup.launch #啟動intel d435相機(jī) roslaunch realsense2_camera rs_rgbd.launch #啟動機(jī)械臂 roslaunch swiftpro pro_control_nomoveit.launch #啟動機(jī)械臂通信 roslaunch swiftpro swift_control.launch #啟動movit規(guī)劃 roslaunch swift_moveit_config demo.launch #啟動點(diǎn)云分割處理 rosrun cmz_bs pointcloud_grasp_node.py #啟動QT界面 rosrun cmz_bs qt_control_node.py 啟動gmapping建圖 roslaunch spark_slam 2d_slam_teleop.launch slam_methods_tel:gmapping camera_type_tel:d435 lidar_type_tel:ydlidar_g6 導(dǎo)航 roslaunch spark_navigation amcl_demo_lidar_rviz.launch camera_type_tel:d435 lidar_type_tel:ydlidar_g6 鍵盤控制 rosrun spark_teleop spark_teleop_node 0.2 0.5Ubuntu(1)重啟系統(tǒng) sudo reboot (2)關(guān)閉系統(tǒng) sudo poweroff設(shè)置中文#更新軟件包列表并安裝language-pack-zh-hans sudo apt update sudo apt install language-pack-zh-hans #生成本地化文件 sudo locale-gen zh_CN.UTF-8 sudo update-locale LANGzh_CN.UTF-8 #重啟系統(tǒng) sudo rebootubuntu查看版本lsb_release -aubuntu查看存儲空間df -lhUbuntu下U盤沒有寫權(quán)限的問題查看U盤的掛載點(diǎn)df -h然后使用命令即可mount -o remount,rw /dev/sdd4 #/dev/sdd4需要替換成自己看到的文件系統(tǒng)路徑解決linux系統(tǒng)下U盤只讀文件系統(tǒng)問題https://blog.csdn.net/ITBigGod/article/details/79914534