在ROS Kinetic和Gazebo 8中使用智能汽车仿真演示

智能车无人驾驶技术是目前人工智能和机器人技术的研究热点,有许多开源平台可以使我们零基础零成本入门无人驾驶技术。本文分享一下目前ROS官网最新推荐的一款开源汽车仿真模拟。使用的平台为Ubuntu 16.04 + ROS Kinetic + Gazebo 8。同时需要具备Docker和nvidia-docker的基础。

Gazebo:

RVIZ:

1. Docker安装

请参考https://www.docker.com官网和CSDN相关博客。

2. nvidia-docker安装

请参考文末附录。如果出现如下错误,请按附录内容进行修正:

$ nvidia-docker run -ti --rm nvidia/cuda
nvidia-docker | 2017/07/06 13:13:17 Error: unsupported CUDA version: driver 6.5 < image 8.0.61

3. 配置和使用ROS/Gazebo中的Prius示例

$ ./build_demo.bash

----

relaybot@relaybot-desktop:~/Rob_Soft/car_demo-master$ ./build_demo.bash
[sudo] password for relaybot:
Sending build context to Docker daemon  58.96MB
Step 1/12 : FROM osrf/ros:kinetic-desktop
 ---> fe1c52012515
Step 2/12 : LABEL com.nvidia.volumes.needed "nvidia_driver"
 ---> Using cache
 ---> c0a552983f0f
Step 3/12 : ENV PATH /usr/local/nvidia/bin:${PATH}
 ---> Using cache
 ---> b4336a6fcd17
Step 4/12 : ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}
 ---> Using cache
 ---> d9f0873b5c72
Step 5/12 : RUN apt-get update  && apt-get install -y     wget     lsb-release     sudo     mesa-utils  && apt-get clean
 ---> Using cache
 ---> d1d2e996eae1
Step 6/12 : RUN echo "deb http://packages.osrfoundation.org/gazebo/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list  && wget http://packages.osrfoundation.org/gazebo.key -O - | apt-key add -  && apt-get update  && apt-get install -y     gazebo8     ros-kinetic-gazebo8-ros-pkgs     ros-kinetic-fake-localization     ros-kinetic-joy  && apt-get clean
 ---> Using cache
 ---> 62e82befdf92
Step 7/12 : RUN mkdir -p /tmp/workspace/src
 ---> Using cache
 ---> 3344777de771
Step 8/12 : COPY prius_description /tmp/workspace/src/prius_description
 ---> Using cache
 ---> d6c8c42918c2
Step 9/12 : COPY prius_msgs /tmp/workspace/src/prius_msgs
 ---> Using cache
 ---> ce2281718303
Step 10/12 : COPY car_demo /tmp/workspace/src/car_demo
 ---> Using cache
 ---> ca825da11474
Step 11/12 : RUN /bin/bash -c 'cd /tmp/workspace  && source /opt/ros/kinetic/setup.bash  && catkin_make'
 ---> Using cache
 ---> a78d42ed877a
Step 12/12 : CMD /bin/bash -c source /opt/ros/kinetic/setup.bash && source /tmp/workspace/devel/setup.bash && roslaunch car_demo demo.launch
 ---> Using cache
 ---> 20890ac15cee
Successfully built 20890ac15cee
Successfully tagged osrf/car_demo:latest
relaybot@relaybot-desktop:~/Rob_Soft/car_demo-master$ 

----

$ ./run_demo.bash

$ ./run_demo.bash
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
... logging to /root/.ros/log/31d9adfa-620b-11e7-a113-0242ac110002/roslaunch-a0950e425e8e-82.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://a0950e425e8e:37129/

SUMMARY
========

PARAMETERS
 * /joy_node0/dev: /dev/input/js0
 * /joy_node1/dev: /dev/input/js1
 * /robot_description: <?xml version="1....
 * /rosdistro: kinetic
 * /rosversion: 1.12.7
 * /use_sim_time: True

NODES
  /
    fake_localization (fake_localization/fake_localization)
    gazebo (gazebo_ros/gzserver)
    gazebo_gui (gazebo_ros/gzclient)
    joy_node0 (joy/joy_node)
    joy_node1 (joy/joy_node)
    joystick_translator (car_demo/joystick_translator)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)
    rviz (rviz/rviz)
    spawn_urdf (gazebo_ros/spawn_model)
    very_inaccurate_odom (tf2_ros/static_transform_publisher)

auto-starting new master
process[master]: started with pid [93]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 31d9adfa-620b-11e7-a113-0242ac110002
process[rosout-1]: started with pid [106]
started core service [/rosout]
process[gazebo-2]: started with pid [109]
process[gazebo_gui-3]: started with pid [113]
process[robot_state_publisher-4]: started with pid [142]
process[fake_localization-5]: started with pid [195]
process[very_inaccurate_odom-6]: started with pid [196]
process[joystick_translator-7]: started with pid [255]
process[joy_node0-8]: started with pid [299]
process[joy_node1-9]: started with pid [300]
Gazebo multi-robot simulator, version 8.1.1
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

process[spawn_urdf-10]: started with pid [328]
process[rviz-11]: started with pid [356]
[ INFO] [1499318590.218434440]: Finished loading Gazebo ROS API Plugin.
[Msg] Waiting for master.
[ INFO] [1499318590.220829714]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting...
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 172.17.0.2
[Wrn] [ColladaLoader.cc:1804] Triangle input semantic: 'TEXCOORD' is currently not supported
[Wrn] [ColladaLoader.cc:1804] Triangle input semantic: 'TEXCOORD' is currently not supported
[Wrn] [ColladaLoader.cc:1804] Triangle input semantic: 'TEXCOORD' is currently not supported
[Wrn] [ColladaLoader.cc:1804] Triangle input semantic: 'TEXCOORD' is currently not supported
[Wrn] [ColladaLoader.cc:1804] Triangle input semantic: 'TEXCOORD' is currently not supported
[spawn_urdf-10] process has finished cleanly
log file: /root/.ros/log/31d9adfa-620b-11e7-a113-0242ac110002/spawn_urdf-10*.log
[ INFO] [1499318597.020363774, 1341.708000000]: Camera Plugin: Using the 'robotNamespace' param: '/'
[ INFO] [1499318597.029090560, 1341.708000000]: Camera Plugin (ns = /)  <tf_prefix_>, set to ""
[ WARN] [1499318597.051198614, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318597.051501949, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318597.051634287, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318597.051772773, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ WARN] [1499318597.071652157, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318597.071737149, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318597.071765174, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318597.071788477, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ WARN] [1499318597.074830942, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318597.075126204, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318597.075418562, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318597.075720639, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ WARN] [1499318597.089499716, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318597.090064739, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318597.090382446, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318597.090626321, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ INFO] [1499318603.934692266, 1341.708000000]: Block laser plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318603.934773061, 1341.708000000]: Block laser plugin missing <hokuyoMinIntensity>, defaults to 101
[ INFO] [1499318603.934847668, 1341.708000000]: Block laser plugin missing <updateRate>, defaults to 0
[ INFO] [1499318604.031684097, 1341.708000000]: Camera Plugin: Using the 'robotNamespace' param: '/'
[ WARN] [1499318604.036142916, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318604.036419387, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318604.036500172, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318604.036576326, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ INFO] [1499318604.048912318, 1341.708000000]: Camera Plugin (ns = /)  <tf_prefix_>, set to ""
[ INFO] [1499318604.601344650, 1341.708000000]: Laser Plugin: Using the 'robotNamespace' param: '/'
[ INFO] [1499318604.602166296, 1341.708000000]: Starting Laser Plugin (ns = /)!
[ INFO] [1499318604.609125255, 1341.708000000]: Laser Plugin (ns = /)  <tf_prefix_>, set to ""
[ WARN] [1499318604.622696602, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318604.622786468, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318604.622838959, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318604.622875155, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ WARN] [1499318604.675410176, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318604.675486412, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318604.675527058, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318604.675556004, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ INFO] [1499318605.145527632, 1341.708000000]: Laser Plugin: Using the 'robotNamespace' param: '/'
[ INFO] [1499318605.145614241, 1341.708000000]: Starting Laser Plugin (ns = /)!
[ INFO] [1499318605.154089749, 1341.708000000]: Laser Plugin (ns = /)  <tf_prefix_>, set to ""
[ WARN] [1499318605.158758063, 1341.708000000]: Range plugin missing <radiation>, defaults to ultrasound
[ WARN] [1499318605.158840499, 1341.708000000]: Range plugin missing <fov>, defaults to 0.05
[ INFO] [1499318605.158877742, 1341.708000000]: Range plugin missing <gaussianNoise>, defaults to 0.0
[ INFO] [1499318605.158909882, 1341.708000000]: Range plugin missing <updateRate>, defaults to 0
[ INFO] [1499318605.244331364, 1341.708000000]: Camera Plugin: Using the 'robotNamespace' param: '/'
[ INFO] [1499318605.260901986, 1341.708000000]: Camera Plugin: Using the 'robotNamespace' param: '/'
[ INFO] [1499318605.268178012, 1341.708000000]: Camera Plugin (ns = /)  <tf_prefix_>, set to ""
[ INFO] [1499318605.295667008, 1341.708000000]: Camera Plugin (ns = /)  <tf_prefix_>, set to ""
[Wrn] [PriusHybridPlugin.cc:361] PriusHybridPlugin loading params
[ INFO] [1499318605.487444516, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: rear_right_wheel_joint
[ INFO] [1499318605.487560947, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: rear_left_wheel_joint
[ INFO] [1499318605.487821573, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: front_right_wheel_joint
[ INFO] [1499318605.487860817, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: front_left_wheel_joint
[ INFO] [1499318605.487897223, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: front_right_steer_joint
[ INFO] [1499318605.487938402, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: front_left_steer_joint
[ INFO] [1499318605.487983362, 1341.708000000]: GazeboRosJointStatePublisher is going to publish joint: steering_joint
[ INFO] [1499318605.488209156, 1341.708000000]: Starting GazeboRosJointStatePublisher Plugin (ns = //)!, parent name: prius
[ INFO] [1499318605.694392977, 1341.729000000]: waitForService: Service [/gazebo/set_physics_properties] is now available.
[ INFO] [1499318605.875331513, 1341.751000000]: Physics dynamic reconfigure ready.
[Wrn] [Publisher.cc:141] Queue limit reached for topic /gazebo/default/pose/local/info, deleting message. This warning is printed only once.

----

----详细过程如下----

ROS / GAZEBO中的Prius演示

这是使用ROS kinetic发布的传感器数据的 gazebo 8中的Prius的模拟。 通过发布ROS消息来控制汽车的节气门,制动器,转向和换档。ROS节点允许使用游戏手柄或操纵杆进行驾驶。

要求(基本)

该演示已经在Ubuntu Xenial(16.04)

推荐(选配)

  • 一个操纵杆
  • 创建到/dev/input/js0或的链接的操纵杆驱动程序/dev/input/js1

编译

首先克隆repo,然后运行脚本build_demo.bash。它使用本地源代码构建了一个docker映像。

$ cd car_demo
$ ./build_demo.bash

运行

将游戏控制器连接到您的电脑。使用脚本run_demo.bash运行演示。

$ ./run_demo.bash

一个RVIZ窗口将打开,显示汽车和传感器输出。将出现一个Gazebo窗口,显示模拟。使用控制器驱动世界各地的prius,或者点击Gazebo窗口并使用WASD钥匙来驾驶汽车。

如果使用Logitech F710控制器:

  • 确保MODE状态指示灯熄灭
  • 将swtich设置为XInput模式
  • 右侧杆控制油门和制动器
  • 左键控制转向
  • Y把车放进DRIVE
  • A把车放进REVERSE
  • B把车放到中性

----

先看效果:

Gazebo:

參考網址:

1.  http://www.ros.org/news/2017/06/simulated-car-demo.html

2.  https://github.com/NVIDIA/nvidia-docker

----

智能汽车仿真演示

由Tully Foote于20176月30日上午10:30编辑

OSRF博客转载

我们很高兴用ROS Kinetic和Gazebo 8展示Mcity的Prius仿真。ROS使用现有的软件和库可以更快地开发模拟。车辆的节气门,制动器,转向和变速器通过发布到ROS主题进行控制。所有传感器数据都是使用ROS发布的,可以使用RViz进行可视化。

我们利用Gazebo 8的功能来整合现有的模型和传感器。仿真世界(环境)包含了一个新型的Mcity和交汇高速公路。还有来自Gazebo模型库的模型,包括垃圾箱,交通锥和加油站。在车辆本身上,屋顶上有一个16束激光雷达,8个超声波传感器,4个摄像头和2个平面激光雷达。

仿真模拟是开源的,可以在osit / osdf / car_demo上的GitHub上获得。通过安装nvidia-docker并从Docker Hub拉出“osrf / car_demo”来尝试。有关构建和运行的更多信息,请参阅源存储库中的README。

----

NVIDIA Docker

该存储库包括构建和运行NVIDIA Docker映像的实用程序。

CUDA如何与Docker集成的示例

文档

完整的文档可在存储库wiki中找到
首先要了解为什么需要NVIDIA Docker,这是一个很好的开始。

快速开始

假设NVIDIA驱动程序和Docker已正确安装(请参阅安装

Ubuntu发行版

#安装nvidia-docker和nvidia-docker-plugin
wget -P / tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg  - i / tmp / nvidia-docker * .deb && rm / tmp / nvidia-docker * .deb#测试nvidia-smi
nvidia-docker运行--rm nvidia / cuda nvidia-smi

----

先决条件

运行的先决条件列表nvidia-docker如下所示。
有关如何为您的Linux发行版安装Docker的信息,请参阅Docker文档

  1. GNU / Linux x86_64,内核版本> 3.10
  2. 多克尔> = 1.9(官方docker-enginedocker-cedocker-ee仅)
  3. NVIDIA GPU与架构>费米(2.1)
  4. NVIDIA驱动程序 > = 340.29与二进制nvidia-modprobe

您的驱动程序版本可能会限制您的CUDA功能(请参阅CUDA要求

从二进制包安装

二进制包可在发行页面上下载。

软件包安装将自动设置nvidia-docker-plugin并根据您的分发,将其注册到init系统。

从源头构建

在存储库问题的根目录makemake install构建二进制文件。
稍后还将在由环境变量设置的位置prefix/usr/local默认情况下)处理二进制文件。您必须nvidia-docker-plugin手动启动此方法:

sudo -b nohup nvidia-docker-plugin

或者,您可以为您的发行版使用make debmake rpm生成deb / rpm软件包。
软件包安装将自动设置nvidia-docker-plugin并根据您的分发,将其注册到init系统。

make cleanmake distclean分别清理构建和分配环境。

----

> = 346.46 > = 2.0(费米) 7.5 > = 352.39 > = 2.0(费米) 8 = 361.93或> = 375.51 == 6.0(P100) 8 > = 367.48 > = 2.0(费米)

例子

看一下样本部分,找到编译简单CUDA应用程序的Dockerfiles示例。

#运行交互式CUDA会话隔离第一个GPU
NV_GPU = 0 nvidia-docker运行-ti --rm nvidia / cuda#查询CUDA 7.5编译器版本
nvidia-docker运行--rm nvidia / cuda:7.5-devel nvcc --version

----

挑战

安装用户级驱动程序库和设备文件会破坏容器的环境,只有当容器运行GPU应用程序时才应该执行。这里的挑战是确定给定的图像是否将使用GPU。我们还应该防止基于与主机NVIDIA驱动程序版本不兼容的Docker映像启动容器,您可以在此wiki页面上找到更多详细信息。

NVIDIA-泊坞窗

没有通用的解决方案来检测是否有任何图像将使用GPU代码。在nvidia-docker我们假设基于我们的nvidia/cuda图像(DockerHub上可用)的任何图像将是GPU应用程序,因此它们需要驱动程序卷和设备文件。
更具体地说,当nvidia-docker run使用时,我们检查在命令行上指定的图像。在此图像中,我们查找标签 的存在和值com.nvidia.volumes.needednvidia/cuda我们提供的图像开始时都包含这个标签。所有执行此操作的Dockerfiles FROM nvidia/cuda将自动继承此元数据,从而可以无缝工作nvidia-docker

为了检测图像与主机驱动程序不兼容,我们依赖于第二个元数据com.nvidia.cuda.version标签。此标签存在于每个CUDA基本图像中,并具有相应的版本号。该版本与驱动程序支持的最大CUDA版本进行比较,为此目的nvidia-docker使用CUDA API函数cudaDriverGetVersion。如果驱动程序对于运行此版本的CUDA来说太旧了,则在启动容器之前会出现错误:

$ nvidia-docker run --rm nvidia/cuda
nvidia-docker | 2016/04/21 21:41:35 Error: unsupported CUDA version: driver 7.0 < image 7.5

备择方案

在这种情况下,nvidia-docker不会简单地将参数注入docker命令行。因此,重现这种行为更复杂。您将需要检查工作流中的图像或容器编排解决方案中的图像。查看图像中的标签很简单:

$ docker inspect -f '{{index .Config.Labels "com.nvidia.volumes.needed"}}' nvidia/cuda
nvidia_driver
$ docker inspect -f '{{index .Config.Labels "com.nvidia.cuda.version"}}' nvidia/cuda
7.5

如果您构建自己的自定义CUDA映像,建议您为兼容性原因重用相同的标签。

----

在ROS Kinetic和Gazebo 8中使用智能汽车仿真演示的更多相关文章

  1. Ubuntu 16.04 + ROS Kinetic 机器人操作系统学习镜像分享与使用安装说明

    Ubuntu 16.04 + ROS Kinetic 镜像分享与使用安装说明 内容概要:1 网盘文件介绍  2 镜像制作  3 系统使用与安装 ---- 祝ROS爱好者和开发者新年快乐:-) ---- ...

  2. ubuntu 16.04,ros kinetic 使用husy_gazebo

    我当前使用的是ubuntu 16.04,ros kinetic ,Gazebo版本为7.0.protoc需要确保版本为2.6.1,而我当前的为3.4.0,因此需要将系统中的protoc替换为2.6.1 ...

  3. 在ROS Kinetic中使用Gazebo 8进行机器人仿真

    在ROS Kinetic中使用Gazebo 8比在ROS Indigo中使用Gazebo 3-8要容易一些. 目前最新稳定版本的Gazebo8为8.1.1. 安装流程如下: $  sudo apt-g ...

  4. SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  5. ROS-1 : Ubuntu16.04中安装ROS Kinetic

    1.安装 ROS Kinetic仅支持Wily(Ubuntu 15.10).Xenial( Ubuntu16.04)和Jessie(Debian 8)的debian软件包. 1.1 配置Ubuntu ...

  6. ROS_Kinetic_02 ROS Kinetic 迁移指南及中文wiki指南(Migration guide)

    ROS_Kinetic_02 ROS Kinetic 迁移指南(Migration guide) 对于ROS Kinetic Kame有些功能包已经更新改变,提供关于这些包的迁移注意或教程.主要针对于 ...

  7. ROS_Kinetic_01 在ubuntu 16.04安装ROS Kinetic 2017.01更新

    ROS_Kinetic系列学习(一),在ubuntu 16.04安装ROS Kinetic. Celebrating 9 Years of ROS! ubuntu16.04已经发布半年多了,ROS的K ...

  8. ros kinetic安装rbx1

    1.首先安装一些依赖包 sudo apt-get install ros-kinetic-turtlebot-bringup \ ros-kinetic-turtlebot-create ros-ki ...

  9. Ros Kinetic 配置 OpenCV2和CV_bridge (Python, C++)

    本篇介绍如何在Ros-kinetic环境下运用opencv2进行开发的配置,系统平台为64位Ubuntu16.04. 需要系统环境: 1.Ros kinetic版本,一般自带cv_bridge, 若没 ...

随机推荐

  1. 20145335郝昊《java程序设计》第9周学习总结

    20145335郝昊 <Java程序设计>第9周学习总结 教材学习内容总结 第16章 JDBC(Java DataBase Connectivity)即java数据库连接,是一种用于执行S ...

  2. 20144303 《Java程序设计》第三周学习总结

    20144303 <Java程序设计>第三周学习总结 教材学习内容总结 •对象是存在的具体实体,具有明确的状态和行为,类是具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属 ...

  3. c++ 使用WinHTTP实现文件下载功能

    因为要项目中要想要实现一个软件自动更新的功能,之前是使用socket直接下载.但切换下载源的时候很麻烦.所以换用http方式. 网上找了很多资料,基本上就是下面几种: 1.curllib //功能强大 ...

  4. [转载]Javassist 使用指南(二)

    ======================= 本文转载自简书,感谢原作者!. 原链接如下:https://www.jianshu.com/p/b9b3ff0e1bf8 =============== ...

  5. Ubuntu 设置为固定ip

    vmware设置为桥接模式 使用root登陆ubuntu 使用gedit打开/etc/network/interfaces auto lo iface lo inet loopback auto en ...

  6. RunLoop Note

    I. Begin from Apple Document Apple describes the priciples of runloop in Threading Programming Guide ...

  7. 数据结构——堆(Heap)大根堆、小根堆

    目录 Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是偏序: Min-heap: 父节点的值小于或等于子节点的值: Max-heap: 父节点的值大于或等于子节点的值 ...

  8. jQuery Ajax总结

    jQuery对Ajax的操作进行了封装.jQuery中\(.ajax()属于最底层的方法,这个放在后面说,首先看看封装了\).ajax()的方法. load()方法 load()可以远程载入HTML并 ...

  9. 前端项目,引入PingFang SC字体

    在仿苹果官网"垃圾桶"时, 设计出的UI使用PingFang SC 字体,在网上查了很久,特记录.如果你有更好的方法,欢迎评论留言~ 实现原理,使用@font-face将字体下载在 ...

  10. 缓存技术内部交流_05_Cache Through

    参考资料: http://www.ehcache.org/documentation/3.2/caching-patterns.html http://www.ehcache.org/document ...