ros package source code path

pathfinder

viewfinder

xmms2

主工作站上的groovy_workspace都没有成功编译过package。运行过hydro版本。

源代码安装版方式。hydro-desktop-full-wet.rosinstall

svn:

http://pi-robot-ros-pkg.googlecode.com/svn/trunk/pi_vision使用的svn版本较低,可svn upgrade升级。

工作副本根目录: /home/ppeix/tutorials/catkin_ws/src/pirobot  要求svn1.8
URL: http://pi-robot-ros-pkg.googlecode.com/svn/trunk
http://isr-uc-ros-pkg.googlecode.com/svn/stacks/serial_communication/trunk
URL: https://github.com/mrjogo/rosserial_avr_tutorial.git


URL: https://svn.openslam.org/data/svn/g2o

git:

https://github.com/rdiankov/openrave.git


https://github.com/yuanboshe/rovio_base.git    将pocketsphinx作用于该package的功能代码丢失了。

https://github.com/WPI-RAIL/rovio.git

https://github.com/LucidOne/Rovio.git


https://github.com/ros/pluginlib.git


https://github.com/pirobot/rbx2.git 

rbx2_description/urdf/pi_robot/pi_robot.urdf   +    <limit effort="1.0" lower="-2.09" upper="2.09" velocity="3.14"/>

https://github.com/pirobot/rbx1.git    modified:   rbx1_bringup/launch/fake_turtlebot.launch

<node name="arbotix" pkg="arbotix_python" type="arbotix_driver.py" output="screen">


https://github.com/ericperko/uvc_cam.git     

src/uvc_cam/uvc_cam.cpp      if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))/*ppeix:check if capture feature is supported*/


 https://github.com/ros-drivers/rosserial.git

https://github.com/ros-perception/openslam_gmapping.git

https://github.com/ros-perception/vision_opencv.git


git://git.code.sf.net/p/boa/code

https://github.com/OpenQbo/qbo_cereal_port.git

https://github.com/LucidOne/iheart-ros-pkg.git

https://github.com/ros-planning/moveit_core.git    CMakeLists.txt   -  cmake_modules  +  #  cmake_modules

https://github.com/ros-planning/moveit_ros.git

https://github.com/ros-planning/moveit_setup_assistant.git

删除neo package.因为在image中已经有最新版本的。

删除ekho5.7 解压生成,无版本管理.

删除espeak 使用svn,但版本较老.svn upgrade即可。

工作副本根目录: /home/ppeix/tutorials/catkin_ws/src/espeak-code
URL: svn://svn.code.sf.net/p/espeak/code/trunk




 https://github.com/HumaRobotics/ros-indigo-qbo-packages.git
https://github.com/pstemari/RoboBeacon.git

https://github.com/robotictang/eddiebot.git

https://github.com/ros/executive_smach.git

 https://github.com/whoenig/crazyflie_ros.git

https://github.com/sigproc/python-sigprocge.git----------------python-sigproc     

https://github.com/sigproc/robotic_surgery.git

git://source.ffmpeg.org/ffmpeg.git

https://github.com/jacksonliam/mjpg-streamer.git

https://github.com/dorian3d/DBoW2.git

https://github.com/dorian3d/DLib.git

https://github.com/dorian3d/DLoopDetector.git

https://github.com/Atom-machinerule/OpenQbo.git

navigation https://github.com/ros-planning/navigation.git

https://github.com/ros-drivers/openni2_launch.git

https://github.com/ros-drivers/openni_camera.git

 https://github.com/OpenNI/OpenNI2.git

https://github.com/arthurv/OpenTLD.git

 https://github.com/ros-drivers/openni2_camera.git

git://git.code.sf.net/p/opensound/git

https://github.com/vanadiumlabs/arbotix.git


https://github.com/OpenQbo/qbo_android_app.git

https://github.com/OpenQbo/qbo_arduqbo.git

https://github.com/OpenQbo/qbo_audio_control

 https://github.com/OpenQbo/qbo_random_move.git

https://github.com/OpenQbo/qbo_brain

https://github.com/OpenQbo/qbo_arduino.git

https://github.com/OpenQbo/qbo_listen.git

https://github.com/OpenQbo/qbo_camera.git

https://github.com/OpenQbo/qbo_launchers.git

https://github.com/OpenQbo/qbo_music_player.git

https://github.com/OpenQbo/qbo_talk.git

 https://github.com/OpenQbo/qbo_cereal_port.git

 https://github.com/OpenQbo/qbo_questions.git

https://github.com/OpenQbo/qbo_self_recognizer.git

https://github.com/OpenQbo/qbo_object_recognition.git

 https://github.com/OpenQbo/qbo_stereo_selector.git

https://github.com/OpenQbo/julius_grammar_compiler.git


https://github.com/BlueCop/pygvoicelib.git

https://github.com/sigproc/docker.git

https://github.com/sigproc/qbo_joint_odom.git

https://github.com/BlueCop/qbo_joy_ctrl.git

opencv

git://code.opencv.org/opencv.git


ppeix:DBoW2$ git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d1f827..a00703c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,8 +23,8 @@ if(BUILD_DBoW2)
 endif(BUILD_DBoW2)
 
 if(BUILD_Demo)
-  add_executable(demo demo/demo.cpp)
-  target_link_libraries(demo ${PROJECT_NAME} ${OpenCV_LIBS} ${DLib_LIBS})
+  add_executable(demo1 demo/demo.cpp)
+  target_link_libraries(demo1 ${PROJECT_NAME} ${OpenCV_LIBS} ${DLib_LIBS})
   file(COPY demo/images DESTINATION ${CMAKE_BINARY_DIR}/)
 endif(BUILD_Demo)

ppeix:DLoopDetector$ git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 32d49d4..df435da 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,8 @@
 cmake_minimum_required(VERSION 2.8)
 project(DLoopDetector)
 
-option(BUILD_DemoBRIEF  "Build demo application with BRIEF features" OFF)
-option(BUILD_DemoSURF   "Build demo application with SURF features"  OFF)
+option(BUILD_DemoBRIEF  "Build demo application with BRIEF features" ON)
+option(BUILD_DemoSURF   "Build demo application with SURF features"  ON)
 
 set(HDRS
   include/DLoopDetector/DLoopDetector.h         include/DLoopDetector/TemplatedLoopDetector.h)



ppeix:OpenTLD$ git diff
diff --git a/include/TLD.h b/include/TLD.h
index 2e94e68..b285d2d 100644
--- a/include/TLD.h
+++ b/include/TLD.h
@@ -3,7 +3,7 @@
 #include <LKTracker.h>
 #include <FerNNClassifier.h>
 #include <fstream>
-
+#include <opencv2/legacy/legacy.hpp>
 
 //Bounding Boxes
 struct BoundingBox : public cv::Rect {


ppeix:navigation$ ls
amcl                    dwa_local_planner  move_base_msgs       README.md
base_local_planner      fake_localization  move_slow_and_clear  robot_pose_ekf
carrot_planner          global_planner     nav_core             rotate_recovery
clear_costmap_recovery  map_server         navfn                voxel_grid
costmap_2d              move_base          navigation


ppeix:kernel$ git diff
diff --git a/Makefile b/Makefile
index 7df8171..e409301 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,8 @@
 .PHONY: patch linux-config livesuit android
 
 SUDO=sudo
-CROSS_COMPILE=arm-linux-gnueabihf-
+CROSS_COMPILE=arm-none-linux-gnueabi-
+#arm-linux-gnueabihf-
 OUTPUT_DIR=$(CURDIR)/output
 BUILD_PATH=$(CURDIR)/build
 ROOTFS=$(CURDIR)/rootfs.img
@@ -40,7 +41,7 @@ $(U_CONFIG_H): u-boot-sunxi/.git
        $(Q)$(MAKE) -C u-boot-sunxi $(UBOOT_CONFIG)_config O=$(U_O_PATH) CROSS_C
 
 u-boot: $(U_CONFIG_H)
-       $(Q)$(MAKE) -C u-boot-sunxi all O=$(U_O_PATH) CROSS_COMPILE=$(CROSS_COMP
+       $(Q)$(MAKE) -C u-boot-sunxi $(BOARD} O=$(U_O_PATH) CROSS_COMPILE=$(CROSS
 
 ## linux
 $(K_DOT_CONFIG): linux-sunxi/.git

视频录制与删除

ppeix:qbo_video_record$ git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cee7228..0dd34c2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,3 +9,4 @@ set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
 include(FindPkgConfig)
 
 rosbuild_add_executable(qbo_video_record src/video_record.cpp)
+rosbuild_add_executable(qbo_video_avi src/avi.cpp)
diff --git a/src/video_record.cpp b/src/video_record.cpp
index 82eab40..6d24931 100644
--- a/src/video_record.cpp
+++ b/src/video_record.cpp
@@ -59,7 +59,7 @@ std::string filename;
 pid_t pID;
 
 using namespace boost;
-
+int loop = 0;
 void recordCallback(const sensor_msgs::Image::ConstPtr& image_ptr)
 {
     cv_bridge::CvImagePtr cv_ptr;
@@ -72,7 +72,13 @@ void recordCallback(const sensor_msgs::Image::ConstPtr& image_ptr)
         ROS_ERROR("cv_bridge exception: %s", e.what());
         return;
     }
-    *writer <<  cv_ptr->image;
+    if(loop++ < 5)
+    {
+        *writer <<  cv_ptr->image;
+        cv::imshow("record", cv_ptr->image);
+        cv::waitKey(3);
+        ROS_INFO("record loop = %d\n", loop);
+    }
 }
 
 bool startServiceCallBack(qbo_video_record::StartRecord::Request  &req,
@@ -144,12 +150,12 @@ void combineAudioVideo()
       ROS_INFO("End Combining");
       pclose(combProc);
       //Removing audio and video files
-      FILE* removeProc = popen(removeCommand, "r");
+/*      FILE* removeProc = popen(removeCommand, "r");
       while (fgets(buffer, 1028, removeProc) != NULL)
       {
       }
       pclose(removeProc);
-      rename(tempFile.c_str(), finalFilename.c_str());
+  */    rename(tempFile.c_str(), finalFilename.c_str());
 }
 
 bool stopServiceCallBack(qbo_video_record::StopRecord::Request  &req,
(END)

ppeix:qbo_face_vision$ git diff .
diff --git a/qbo_face_recognition/src/face_recognizer.cpp b/qbo_face_recognition/src/face_recognizer.cpp
index 18aba3c..0cbbfa9 100644
--- a/qbo_face_recognition/src/face_recognizer.cpp
+++ b/qbo_face_recognition/src/face_recognizer.cpp
@@ -295,7 +295,7 @@ bool FaceRecognizer::storePCA()
                return false;
        }
 
-       fs << "PCA_mean" << pca_.mean;
+       fs << "PCA_mean" << pca_.mean;/*ppeix: operateor << override*/
        fs << "PCA_eigenvalues" << pca_.eigenvalues;
        fs << "PCA_eigenvectors" << pca_.eigenvectors;
 
@@ -320,7 +320,7 @@ bool FaceRecognizer::loadPCA(string path)
 
     if(fs.isOpened())
     {
-        fs["PCA_mean"] >> pca_.mean;
+        fs["PCA_mean"] >> pca_.mean; /*ppeix: operator >> override*/
        fs["PCA_eigenvalues"] >> pca_.eigenvalues;
        fs["PCA_eigenvectors"] >> pca_.eigenvectors;
 
@@ -396,15 +396,15 @@ void FaceRecognizer::trainPCA_SVMClassifiers()
        for(unsigned int i = 0; i< persons_.size(); i++) //For each person
        {
                //Projections matrix
-               cv::Mat train_data(0, pca_dimension_, CV_32FC1);
+               cv::Mat train_data(0, pca_dimension_, CV_32FC1);/*ppeix:(row, colum, format, scalar())*/
 
                for(unsigned int j = 0; j<persons_[i].images_.size(); j++) //For each person's image
                {
                                cv::Mat temp, temp2;
-                               equalizeFace(persons_[i].images_[j]).convertTo(temp, CV_32FC1);
-                               temp.reshape(1,1).copyTo(temp2);
-                               cv::Mat coeffs = pca_.project(temp2);
-                               train_data.push_back(coeffs);
+                               equalizeFace(persons_[i].images_[j]).convertTo(temp, CV_32FC1);/*ppeix:mat.convertTo */
+                               temp.reshape(1,1).copyTo(temp2);/*ppeix: reshape(int cn, int row)  1 channel.1 row.*/
+                               cv::Mat coeffs = pca_.project(temp2);/*ppeix: return matrix from main part of the sample */
+                               train_data.push_back(coeffs);/*ppeix: arrange element in coeffs to 1 row and store them to train_data*/
                }
                
                //Assign projections to person
@@ -564,15 +564,15 @@ void FaceRecognizer::buildPCA()
 //     image_size_.width = persons_[0].images_[0].cols;
 //     image_size_.height = persons_[0].images_[0].cols;
 
-       cv::Mat pca_set(0, image_size_.width*image_size_.height, CV_8UC1);
+       cv::Mat pca_set(0, image_size_.width*image_size_.height, CV_8UC1);/*ppeix: row,column,format*/
 
        //If param for pca_dimension is set
        if (private_nh_.hasParam("/qbo_face_recognition/pca_dimension"))
                private_nh_.getParam("/qbo_face_recognition/pca_dimension", pca_dimension_);
        
 
-       for(unsigned int i = 0 ; i<persons_.size();i++)
-               for(unsigned int j = 0 ; j<persons_[i].images_.size();j++)
+       for(unsigned int i = 0 ; i<persons_.size();i++)/*ppeix:for each person */
+               for(unsigned int j = 0 ; j<persons_[i].images_.size();j++)/*ppeix:for each image of each person*/
                {
                        cv::Mat temp_mat = equalizeFace(persons_[i].images_[j]);
                        temp_mat = temp_mat.reshape(1,1);
@@ -587,8 +587,8 @@ void FaceRecognizer::buildPCA()
                pca_dimension_ = pca_set.rows -1 ;
        else
                pca_dimension_ = min(pca_dimension_, pca_set.rows);
-
-       pca_(pca_set, cv::Mat(), CV_PCA_DATA_AS_ROW, pca_dimension_);
+/*ppeix: pca_ is a class object. the class implement the operator() override.so it acts as a functor.*/
+       pca_(pca_set, cv::Mat(), CV_PCA_DATA_AS_ROW, pca_dimension_);/*ppeix:perform PCA of pca_set. inputArray, mean, flag, maxComponent*/
 
 
        stabilizer_states_.clear();
@@ -1511,14 +1511,14 @@ int FaceRecognizer::trainBOW_SVMClassifiers()
                                cv::ellipse(mask, rot_rect, cv::Scalar(255,255,255), -1);
 
 
-                               descriptor_detector_->detect(temp_img, extracted_keypoints, mask);
+                               descriptor_detector_->detect(temp_img, extracted_keypoints, mask);/*ppeix:FeatureDetect::detect, key_points generated.*/
 
 
                                if(extracted_keypoints.size()==0)
                                        continue;
 
                                cv::Mat words;
-                               bowExtractor_->compute(temp_img, extracted_keypoints, words);
+                               bowExtractor_->compute(temp_img, extracted_keypoints, words);/*ppeix:BOWImagDescriptorExtrator::compute, output image de
 
                                train_data.push_back(words);
 
@@ -1824,7 +1824,7 @@ int FaceRecognizer::trainVocabulary()
 
        ROS_INFO("\t Generating vocabulary of %d clusters from %d descriptors...", number_of_clusters, num_descriptors);
 
-       //initialize BoW trainer
+       //initialize BoW trainer  ppeix:based class to train visual vocabulary using the bag of visual words approach  :public BOWTrainer
        bowTrainer_ = new cv::BOWKMeansTrainer( number_of_clusters, terminate_criterion, k_means_attempts, k_means_flags);
 
 
@@ -1834,7 +1834,7 @@ int FaceRecognizer::trainVocabulary()
                bowTrainer_->add(persons_[ob].descriptors_);
        }
 
-       //Store vocabulary
+       //Store vocabulary ppeix:cluster train descriptors.return the vocabulary.
        persons_vocabulary_ = bowTrainer_->cluster();
 
        //Assign vocabulary to Bow Image Descriptor Extractor
@@ -1910,13 +1910,13 @@ string FaceRecognizer::recognizeBOW_SVM(cv::Mat img)
                return returned;
 
        cv::Mat words;
-       bowExtractor_->compute(temp_img, extracted_keypoints, words);
+       bowExtractor_->compute(temp_img, extracted_keypoints, words);/*words is output.generate extractor descriptor according to the keypoints */
 
        float confidences[persons_.size()];
 
        //Calculate confidences
        for(unsigned int i = 0; i<persons_.size();i++)
-               confidences[i] = -1.f *persons_[i].bow_svm_->predict(words, true);
+               confidences[i] = -1.f *persons_[i].bow_svm_->predict(words, true);/*ppeix:words is input sample to predict*/
 
        float max_confidence = 0;
        unsigned int max_index = 0;
@@ -2048,7 +2048,7 @@ int FaceRecognizer::addDescriptorsToPerson(cv::Mat image, Person &person)
 
        //Convert image to grayscale
        cv::Mat grayscale;
-       cv::cvtColor(image, grayscale, CV_RGB2GRAY);
+       cv::cvtColor(image, grayscale, CV_RGB2GRAY);/*ppeix: convert RGB to gray image*/
 
 
        //Data structures for descriptors extraction
diff --git a/qbo_face_tracking/src/face_detector.cpp b/qbo_face_tracking/src/face_detector.cpp
index 060cb78..b45e90e 100755
--- a/qbo_face_tracking/src/face_detector.cpp
+++ b/qbo_face_tracking/src/face_detector.cpp
@@ -203,7 +203,7 @@ void FaceDetector::onInit()
 
 void FaceDetector::initializeKalmanFilter()
 {
-       kalman_filter_ = cv::KalmanFilter(4, 4);
+       kalman_filter_ = cv::KalmanFilter(4, 4);/*ppeix:state=4  measurement=4*/
 
        kalman_filter_.transitionMatrix = (cv::Mat_<float>(4,4) <<  1,0,1,0,
                                                                                                                                0,1,0,1,
@@ -347,7 +347,7 @@ void FaceDetector::imageCallback(const sensor_msgs::Image::ConstPtr& image_ptr)
        /*
         * Kalman filter for Face pos estimation
         */
-    kalman_filter_.predict();
+    kalman_filter_.predict();/*ppeix:compute a predict state */
        if(face_detected_bool_) //IF face detected, use measured position to update kalman filter
        {
                if(undetected_count_>=undetected_threshold_)
@@ -374,7 +374,7 @@ void FaceDetector::imageCallback(const sensor_msgs::Image::ConstPtr& image_ptr)
                        measures.at<float>(2,0) = u_vel;
                        measures.at<float>(3,0) = v_vel;
 
-                       kalman_filter_.correct(measures);
+                       kalman_filter_.correct(measures);/*update the predict state from measurement.*/
                }
        }
     else //If face haven't been found, use only Kalman prediction
@@ -400,7 +400,7 @@ void FaceDetector::imageCallback(const sensor_msgs::Image::ConstPtr& image_ptr)
        }
        else
        {
-               head_distance=calcDistanceToHead(detected_face_, kalman_filter_);
+               head_distance=calcDistanceToHead(detected_face_, kalman_filter_);/*ppeix: calc according to the kalman_filter result*/
        }
        
     if(head_distances_.size()==0)
@@ -426,7 +426,7 @@ void FaceDetector::imageCallback(const sensor_msgs::Image::ConstPtr& image_ptr)
 
 
     //Update undetected count
-       if(!face_detected_bool_)
+       if(!face_detected_bool_)/*ppeix: undetected count increasing*/
        {       undetected_count_++;
 
        }


ppeix:qbo_camera$ git diff .
diff --git a/src/stereovision.cpp b/src/stereovision.cpp
index 54d936f..61095ca 100755
--- a/src/stereovision.cpp
+++ b/src/stereovision.cpp
@@ -74,8 +74,8 @@ int StereoVision::rectificarImagen(int iCamera, Mat& i) {
     }
     if(calibrated) {
         Mat imagen;
-        i.copyTo(imagen);
-        remap(imagen,i,mx,my,INTER_LINEAR);
+        i.copyTo(imagen);/*ppeix:copy to imagen*/
+        remap(imagen,i,mx,my,INTER_LINEAR);/*ppeix:inputArray: imagen  outArray:i*/
     }
 }
 
@@ -107,7 +107,7 @@ int StereoVision::calibrateStereo(int nx, int ny, int n_boards, float squareSize
         calibrateSingleCamara(RIGHT,nx,ny,n_boards,intrinsic_matrix_right_,distorsion_matrix_right_,squareSize);
     }
 
-    int salida=-1;
+    int salida=-1;/*ppeix:exit flag*/
     do {
 
         cout << endl << "Stereo camera calibration process starts" << endl;
@@ -249,7 +249,7 @@ int StereoVision::calibrateStereo(int nx, int ny, int n_boards, float squareSize
         cout << "Calibration result is being showed. If you want to repeat it press 'r'" << endl;
         cout << "Press enter to continue" << endl;
 
-        salida=mostrarCamaras();
+        salida=mostrarCamaras();/*ppeix:show the camera*/
 
         if(salida!='r')
         {
@@ -351,7 +351,7 @@ int StereoVision::calibrateSingleCamara(int cam,int board_w, int board_h, int n_
         cout << "Press a key to capture the image" << endl;
 
              while( successes < n_boards ){
-            clickToCaptureSingle(cam,image);
+            clickToCaptureSingle(cam,image);/*ppeix:copy the image from right/left mat assigned at callback.*/
             bool result=findChessboardCorners(image,patternSize,temp,CV_CALIB_CB_ADAPTIVE_THRESH+CV_CALIB_CB_FILTER_QUADS);
 
             if( result )    //Si el resultado de la busqueda de esquinas es bueno
@@ -540,7 +540,7 @@ int StereoVision::clickToCaptureSingle(int c,Mat& color) {
                        right_mutex_.unlock();
         }
         int c=waitKey(15);
-        if(c!=-1)
+        if(c!=-1)/*ppeix:break the loop if any key was pressed. continue to loop when no key was pressed before the delay time elapsed.*/
         {
             break;
         }
@@ -589,7 +589,7 @@ int StereoVision::mostrarCamaras() {
 
         c=waitKey(15);
         c=c&0xFF;
-        if(c=='\n'||c=='r'||c=='n')
+        if(c=='\n'||c=='r'||c=='n')/*ppeix: break if the key \n or r or n was pressed!*/
             break;
     }
     cvDestroyWindow("Left");

ppeix:perception_pcl$ git diff
diff --git a/pointcloud_to_laserscan/launch/sample_node.launch b/pointcloud_to_laserscan/launch/sample_node.launch
index 9c077fc..387b869 100644
--- a/pointcloud_to_laserscan/launch/sample_node.launch
+++ b/pointcloud_to_laserscan/launch/sample_node.launch
@@ -2,18 +2,11 @@
 
 <launch>
 
-    <arg name="camera" default="camera" />
-
-    <!-- start sensor-->
-    <include file="$(find openni2_launch)/launch/openni2.launch">
-        <arg name="camera" default="$(arg camera)"/>
-    </include>
-
     <!-- run pointcloud_to_laserscan node -->
     <node pkg="pointcloud_to_laserscan" type="pointcloud_to_laserscan_node" name="pointcloud_to_laserscan">
 
-        <remap from="cloud_in" to="$(arg camera)/depth_registered/points_processed"/>
-        <remap from="scan" to="$(arg camera)/scan"/>
+        <remap from="cloud_in" to="/distance_sensors_state/floor_sensor"/>
+        <remap from="scan" to="/scan"/>
         <rosparam>
             target_frame: base_link # Leave empty for no transform
             min_height: 0.0
@@ -36,4 +29,4 @@
 
     </node>
 
-</launch>
\ No newline at end of file
+</launch>




julius-4.0                                                                   
julius-4.1.5                                                                   
julius-4.2                                                                     
julius-4.3.1 Juliusbook-4.1.5.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值