在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: TrueNODES/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:11311setting /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.orgprocess[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)

    • 一个X服务器
    • Docker
    • nvidia-docker

推荐(选配)

  • 一个操纵杆
  • 创建到/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分别清理构建和分配环境。

----

需要注意,依据驱动类型和显卡型号选择合适的CUDA版本:

CUDA图像有两种口味,可通过NVIDIA公共中心库存储。

runtime:一个轻量级的图像,包含最低限度,部署使用CUDA的预构建应用程序。
devel:通过添加编译器工具链,调试工具和标准CUDA库的开发文件来扩展运行时映像。使用此映像从源代码编译CUDA应用程序。

要求

运行CUDA容器需要一台具有至少一个支持CUDA功能的GPU和与您使用的CUDA工具包版本兼容的驱动程序。
运行CUDA容器的机器只需要NVIDIA驱动程序,不需要安装CUDA工具包。

NVIDIA驱动程序向后兼容 CUDA工具包版本

CUDA工具包版本 驱动程序版本 GPU架构
6.5 > = 340.29 > = 2.0(费米)
7 > = 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. 汽车上的“黑匣子”,EDR成为中美智能汽车产业竞争的关键战场

    数据智能产业创新服务媒体 --聚焦数智 · 改变商业 中国新能源汽车新政策,会给EDR产业带来繁荣的景象吗?中美两国在EDR产业链上各自处于什么地位?本文将从国际化角度,纵观整个汽车EDR产业布局. ...

  2. Ubuntu16.04安装ROS kinetic以及标定工具Kalibr流程

    Ubuntu16.04安装ROS kinetic以及标定工具Kalibr流程 一.安装ROS Kinetic 二.安装kalibr 编译期间可能遇到的问题及解决方案: 一.安装ROS Kinetic ...

  3. 在Ubuntu1604中安装ROS Kinetic

    申明:由于项目需要用到ros环境,所以在此记录一下ubuntu1604下的ROS Kinetic安装过程,全程顺序执行一次性安装成功,当然执行下一步的时候上一步必须执行成功,在网络不好的时候可以多尝试 ...

  4. linux系统上ros安装,Ubuntu中安装ROS Kinetic

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

  5. 树莓派4初次使用笔记(Pi OS ROS Kinetic安装)

    树莓派4初次使用笔记 下载Pi OS 树莓派显示黑边问题 远程连接(Remote) 内置远程桌面 Xshell SSH命令行连接 换源[此步十分重要] 安装ROS 问题合集 [opencv3] sti ...

  6. (一)ROS Kinetic的安装与配置,

    第一次,机器人学起来 kinglee988关注 2018.11.26 04:59:17字数 2,760阅读 5,099 Copyright (c)  陕西科技大学北斗机器人协会,版权所有 David ...

  7. 在Ubuntu16.04 + ROS kinetic环境下安装TurtleBot3

    简介 ROS社区中丰富的功能包和机器人案例为我们的学习和研究提供了绝好的平台.TurtleBot系列是ROS社区中最流行的高性价比机器人平台,前后一共发布了三代. TurtleBot是ROS中最为重要 ...

  8. ros环境下gazebo建模ur5+robotiq85遇到的问题,仅供参考

    1: [ WARN] [1640073545.549872180, 0.028000000]: Deprecated syntax, please prepend 'hardware_interfac ...

  9. 一、PX4环境搭建和编译(Ubuntu 16.04、ROS kinetic)

    Ubuntu16.04 ROS:kinetic 源于:官网PX4开发指南(v1.10.0)<master> https://dev.px4.io/v1.10/zh/ 稍微参考一下这个网站: ...

最新文章

  1. 开启笔记本win7的虚拟热点,让你的本本变成wifi
  2. Plotly绘制金融时间序列图实战:配置滑动控件
  3. Hibernate和JDBC、EJB比较
  4. 【NOIP2010】引水入城
  5. 22行满分代码:L1-054 福到了 (15分)
  6. AUTOSAR协议解析篇(一)-J1939协议解析
  7. 文件服务器ping延时大,windowns 2008 ping 127.0.0.1延迟大的解决方法。
  8. 客座编辑:石勇(1956-),男,中国科学院大学经济与管理学院教授、博士生导师,发展中国家科学院院士...
  9. Python中如何创建元素为ndarray的list
  10. 关于css垂直水平居中的几种方式
  11. AndroidStudio_安卓原生开发_请求网络图片并解析成BitMap_异步处理_在UI线程执行_利用AsyncTask---Android原生开发工作笔记146
  12. sklearn gridsearchcv_sklearn调包侠之PCA降维
  13. AgileEAS.NET平台开发实例-药店系统-功能发布[模块注册][上]
  14. windows 编译xvidcore-1.1.3.tar
  15. Numpy的21个常用知识点
  16. Reflector反编译.NET文件后修复
  17. 学习笔记(01):Java小白修炼手册-工欲善其事必先利其器,掌握Java开发工具
  18. PDF文件太大怎么压缩,一分钟学会压缩PDF
  19. 上海税务局网站 环境检测 可信任站点未设置问题
  20. 三废的日常——什么是负载均衡

热门文章

  1. 嵌入式单片机及其相关博客及教程
  2. 年终小结:什么是智能?
  3. php 微信红包瓜分,PHP实现微信红包金额拆分试玩的算法示例
  4. java稿件管理系统外文翻译,新闻稿件管理系统毕业论文
  5. 虚拟机的vmem lck到底是个啥玩意 用虚拟机很有可能一不小心就把虚拟机搞崩了如何解决
  6. 十年陌陌,是否能成为Hello
  7. C语言以延时的状态读取数据文件,CH376 U盘文件读写相关C语言代码
  8. Spark大数据技术与应用 第一章Spark简介与运行原理
  9. 2.4g和5g要不要合并_路由器WiFi 2.4G和5G要不要合并?双频合一的缺点分析
  10. android x86 优化,x86平台如何优化安卓的多媒体类应用