Wang Han [homepage] ![Profile views](https://camo.githubusercontent.com/07ea37c0ebbad29f435525659d07a71105fcf782d9abe195b51e5e7ba63e8f65/68747470733a2f2f677076632e6172747572696f2e6465762f7768323030373230303431)
- :🌱: currently working in Huawei Singapore (Todmind Program).
- 🎓 received Ph.D. in Nanyang Technological University.
- 🔨 specialize in computer vision and robotics.
Intensity Scan Context based full SLAM implementation for autonomous driving. ICRA 2020
License: Other
On the KITTI benchmark, I noticed your ISC-LOAM has been improved greatly.
Would you like to share your main improvements ?Thanks for your good work!
Hey,I have a question,why your FLOAM(lidar odometry only) is better than your ISCLOAM(with loop closure)in KITTI test dataset(sequence 11 ~ 21)?
Hi, I'm using ROS Melodic an download the repository with git clone.
When I did "catkin_make" the error said that I had to use "catkin_make_isolated".
And after doing so the error says: / usr / bin / ld: cannot find -lBoost :: timer
Could you help me?
What is this warn about?
[ WARN] global optimization finished with transform
Hello, when i do the second roslaunch, there is ERROR: cannot launch node of type [hector_trajectory_server/hector_trajectory_server]: hector_trajectory_server ROS path [0]=/opt/ros/kinetic/share/ros ROS path [1]=/media/lvsijie/mypassport/linux/catkin_ws_iscloam/src ROS path [2]=/opt/ros/kinetic/share
my system is ubuntu 16.04, it seems that there is no hector_trajectory_server.
Do i install hector-slam to get hector_trajectory_server?
thank you!
How could it extract trajectory? to evaluate the poses with evo for example.
@wh200720041 Thanks for your sharing! I want to run in the other kitti sequnce bag, but I meet the problem.
Here I run in the KITTI sequnce 08(2011_09_30_0028().
At first, I apply kitti2bag to 2011_09_30_0028(kITTI raw data page), and I get a .bag file.
Then I based on the topics provided in the KITTI 07 package(2011_09_30_0027) provided by the author(I run success),remap topics of the 2011_09_30_0028.bag in the iscloam.launch.
However, I get this result, I am confused.
8297ca85.png)
I guess the problem is tf,
the KITTI 07 tf:
I have no idea how to deal with it. I hope get your help!
Thanks a lot for this amazing work. But after some seconds, the iscloam_result can not be displayed in rviz. The info is like "No transform between frames world and odom_final available after 1317354879.400485 seconds of waiting".
Hi,
is there a way to use this slam with Ubuntu 20.04 and ROS2 Foxy?
Hi,
It would be nice to test the iscloam with my own data. Currently, the compilation fails due to missing iscloam/LoopInfo.h referenced in iscloam/src/iscOptimizationNode.cpp and iscGenerationNode.cpp.
Regards,
Paul
hi,thanks for your great work.
what's the memory consumed mainly? it seems my 16G memory almost be used,but the robot doesn't move so far.
hope for your reply,thanks
"(base) xdh@Pc:~/SLAM/iscloam_ws$ catkin_make",当我编译的时候有以下错误产生这是为什么
`Base path: /home/xdh/SLAM/iscloam_ws
Source space: /home/xdh/SLAM/iscloam_ws/src
Build space: /home/xdh/SLAM/iscloam_ws/build
Devel space: /home/xdh/SLAM/iscloam_ws/devel
Install space: /home/xdh/SLAM/iscloam_ws/install
[ 0%] Built target std_msgs_generate_messages_lisp
[ 0%] Built target std_msgs_generate_messages_cpp
[ 0%] Built target std_msgs_generate_messages_py
Scanning dependencies of target iscloam_odom_estimation_node
[ 0%] Built target std_msgs_generate_messages_nodejs
[ 0%] Built target std_msgs_generate_messages_eus
[ 13%] Built target iscloam_laser_mapping_node
[ 27%] Built target iscloam_laser_processing_node
[ 37%] Building CXX object iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/src/odomEstimationClass.cpp.o
[ 37%] Building CXX object iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/src/lidarOptimization.cpp.o
[ 37%] Building CXX object iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/src/odomEstimationNode.cpp.o
[ 37%] Built target _iscloam_generate_messages_check_deps_LoopInfo
[ 44%] Built target iscloam_generate_messages_py
[ 48%] Built target iscloam_generate_messages_cpp
[ 55%] Built target iscloam_generate_messages_eus
[ 58%] Built target iscloam_generate_messages_nodejs
[ 62%] Built target iscloam_generate_messages_lisp
Scanning dependencies of target iscloam_isc_optimization_node
[ 62%] Built target iscloam_generate_messages
[ 75%] Built target iscloam_isc_generation_node
[ 79%] Building CXX object iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/lidar.cpp.o
[ 82%] Building CXX object iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/iscOptimizationNode.cpp.o
[ 86%] Building CXX object iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/iscOptimizationClass.cpp.o
[ 89%] Building CXX object iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/lidarOptimization.cpp.o
In file included from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/lidarOptimization.cpp:5:
/home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:39:69: error: expected class-name before ‘{’ token
39 | class PoseSE3Parameterization : public ceres::LocalParameterization {
| ^
In file included from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/lidarOptimization.cpp:5:
/home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:39:69: error: expected class-name before ‘{’ token
39 | class PoseSE3Parameterization : public ceres::LocalParameterization {
| ^
make[2]: *** [iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/build.make:76:iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/src/lidarOptimization.cpp.o] 错误 1
make[2]: *** 正在等待未完成的任务....
make[2]: *** [iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/build.make:89:iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/lidarOptimization.cpp.o] 错误 1
make[2]: *** 正在等待未完成的任务....
In file included from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/odomEstimationClass.h:34,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/odomEstimationClass.cpp:5:
/home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:39:69: error: expected class-name before ‘{’ token
39 | class PoseSE3Parameterization : public ceres::LocalParameterization {
| ^
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/odomEstimationClass.cpp: In member function ‘void OdomEstimationClass::updatePointsToMap(const Ptr&, const Ptr&)’:
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/odomEstimationClass.cpp:57:83: error: no matching function for call to ‘ceres::Problem::AddParameterBlock(double [7], int, PoseSE3Parameterization)’
57 | problem.AddParameterBlock(parameters, 7, new PoseSE3Parameterization());
| ^
In file included from /usr/local/include/ceres/ceres.h:64,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/odomEstimationClass.h:25,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/odomEstimationClass.cpp:5:
/usr/local/include/ceres/problem.h:259:8: note: candidate: ‘void ceres::Problem::AddParameterBlock(double, int)’
259 | void AddParameterBlock(double* values, int size);
| ^~~~~~~~~~~~~~~~~
/usr/local/include/ceres/problem.h:259:8: note: candidate expects 2 arguments, 3 provided
/usr/local/include/ceres/problem.h:271:8: note: candidate: ‘void ceres::Problem::AddParameterBlock(double*, int, ceres::Manifold*)’
271 | void AddParameterBlock(double* values, int size, Manifold* manifold);
| ^~~~~~~~~~~~~~~~~
/usr/local/include/ceres/problem.h:271:62: note: no known conversion for argument 3 from ‘PoseSE3Parameterization*’ to ‘ceres::Manifold*’
271 | void AddParameterBlock(double* values, int size, Manifold* manifold);
| ~~~~~~~~~~^~~~~~~~
In file included from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/odomEstimationClass.h:34,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/odomEstimationNode.cpp:27:
/home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:39:69: error: expected class-name before ‘{’ token
39 | class PoseSE3Parameterization : public ceres::LocalParameterization {
| ^
In file included from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/iscOptimizationClass.h:45,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:5:
/home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:39:69: error: expected class-name before ‘{’ token
39 | class PoseSE3Parameterization : public ceres::LocalParameterization {
| ^
make[2]: *** [iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/build.make:63:iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/src/odomEstimationNode.cpp.o] 错误 1
In file included from /opt/ros/noetic/include/ros/ros.h:40,
from /opt/ros/noetic/include/pcl_ros/point_cloud.h:4,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/iscOptimizationClass.h:19,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:5:
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp: In member function ‘bool ISCOptimizationClass::addPoseToGraph(const Ptr&, const Ptr&, std::vector&, Eigen::Isometry3d&)’:
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:82:30: warning: format ‘%d’ expects argument of type ‘int’, but argument 8 has type ‘std::vector<boost::shared_ptr<pcl::PointCloudpcl::PointXYZI > >::size_type’ {aka ‘long unsigned int’} [-Wformat=]
82 | ROS_WARN("global optimization finished%d,%d with tranform %f,%f,%f, [%f,%f,%f,%f]",pointcloud_edge_arr.size()-1, matched_frame_id[i],loop_temp.translation().x(),loop_temp.translation().y(),loop_temp.translation().z(),loop_temp.rotation().toQuaternion().w(),loop_temp.rotation().toQuaternion().x(),loop_temp.rotation().toQuaternion().y(),loop_temp.rotation().toQuaternion().z());
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| std::vector<boost::shared_ptr<pcl::PointCloudpcl::PointXYZI > >::size_type {aka long unsigned int}
/opt/ros/noetic/include/ros/console.h:351:165: note: in definition of macro ‘ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER’
351 | ::ros::console::print(filter, _rosconsole_define_location__loc.logger, _rosconsole_define_location__loc.level, FILE, LINE, ROSCONSOLE_FUNCTION, VA_ARGS)
| ^~~~~~~~~~~
/opt/ros/noetic/include/ros/console.h:390:7: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION’
390 | ROSCONSOLE_PRINT_AT_LOCATION(VA_ARGS);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/noetic/include/ros/console.h:575:35: note: in expansion of macro ‘ROS_LOG_COND’
575 | #define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, VA_ARGS)
| ^~~~~~~~~~~~
/opt/ros/noetic/include/rosconsole/macros_generated.h:162:23: note: in expansion of macro ‘ROS_LOG’
162 | #define ROS_WARN(...) ROS_LOG(::ros::console::levels::Warn, ROSCONSOLE_DEFAULT_NAME, VA_ARGS)
| ^~~~~~~
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:82:21: note: in expansion of macro ‘ROS_WARN’
82 | ROS_WARN("global optimization finished%d,%d with tranform %f,%f,%f, [%f,%f,%f,%f]",pointcloud_edge_arr.size()-1, matched_frame_id[i],loop_temp.translation().x(),loop_temp.translation().y(),loop_temp.translation().z(),loop_temp.rotation().toQuaternion().w(),loop_temp.rotation().toQuaternion().x(),loop_temp.rotation().toQuaternion().y(),loop_temp.rotation().toQuaternion().z());
| ^~~~~~~~
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:82:60: note: format string is defined here
82 | ROS_WARN("global optimization finished%d,%d with tranform %f,%f,%f, [%f,%f,%f,%f]",pointcloud_edge_arr.size()-1, matched_frame_id[i],loop_temp.translation().x(),loop_temp.translation().y(),loop_temp.translation().z(),loop_temp.rotation().toQuaternion().w(),loop_temp.rotation().toQuaternion().x(),loop_temp.rotation().toQuaternion().y(),loop_temp.rotation().toQuaternion().z());
| ~^
| |
| int
| %ld
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp: In member function ‘double ISCOptimizationClass::estimateOdom(const Ptr&, const Ptr&, const Ptr&, const Ptr&, Eigen::Isometry3d&)’:
/home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:251:79: error: no matching function for call to ‘ceres::Problem::AddParameterBlock(double [7], int, PoseSE3Parameterization*)’
251 | problem.AddParameterBlock(parameters, 7, new PoseSE3Parameterization());
| ^
In file included from /usr/local/include/ceres/ceres.h:64,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:7,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/iscOptimizationClass.h:45,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationClass.cpp:5:
/usr/local/include/ceres/problem.h:259:8: note: candidate: ‘void ceres::Problem::AddParameterBlock(double*, int)’
259 | void AddParameterBlock(double* values, int size);
| ^~~~~~~~~~~~~~~~~
/usr/local/include/ceres/problem.h:259:8: note: candidate expects 2 arguments, 3 provided
/usr/local/include/ceres/problem.h:271:8: note: candidate: ‘void ceres::Problem::AddParameterBlock(double*, int, ceres::Manifold*)’
271 | void AddParameterBlock(double* values, int size, Manifold* manifold);
| ^~~~~~~~~~~~~~~~~
/usr/local/include/ceres/problem.h:271:62: note: no known conversion for argument 3 from ‘PoseSE3Parameterization*’ to ‘ceres::Manifold*’
271 | void AddParameterBlock(double* values, int size, Manifold* manifold);
| ~~~~~~~~~~^~~~~~~~
In file included from /home/xdh/SLAM/iscloam_ws/src/iscloam/include/iscOptimizationClass.h:45,
from /home/xdh/SLAM/iscloam_ws/src/iscloam/src/iscOptimizationNode.cpp:28:
/home/xdh/SLAM/iscloam_ws/src/iscloam/include/lidarOptimization.h:39:69: error: expected class-name before ‘{’ token
39 | class PoseSE3Parameterization : public ceres::LocalParameterization {
| ^
make[2]: *** [iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/build.make:102:iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/src/odomEstimationClass.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:573:iscloam/CMakeFiles/iscloam_odom_estimation_node.dir/all] 错误 2
make[1]: *** 正在等待未完成的任务....
make[2]: *** [iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/build.make:63:iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/iscOptimizationNode.cpp.o] 错误 1
make[2]: *** [iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/build.make:76:iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/src/iscOptimizationClass.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:515:iscloam/CMakeFiles/iscloam_isc_optimization_node.dir/all] 错误 2
make: *** [Makefile:141:all] 错误 2
Invoking "make -j8 -l8" failed`**
Hi :)
I have tried the following methods with the KITTI data and I get exactly the same result in FLOAM and ISCLOAM. I have also evaluated the APE through evo and the result is the same.
I have taken into account what is described in #11 & #3 and I have tested it with:
[800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000]
but in both methods I keep getting exactly the same value.
Hi @wh200720041 ,Thanks a lot for your work! when I listened the topic /map in rviz, I just could viewed the local map message.
Hi doctor wang,
Temporal consistency check
module, right?Geometrical consistency
, which calculate corner-to-corner and surf-to-surf with ceres to get constraint. Is there some reason, why not use FPFH first and ICP, have you test the performance between them?Thanks for your hard work and help!
Jiao
Thank you for your excellent work. I tried to use the dataset to reproduce your algorithm. I used KITTI Raw Data 2011_09_30_drive_0027_sync, which was converted into a rosbag file by kitti_to_rosbag. After the program was successfully installed, I encountered the following problems, I did not change other parameters. When I ran the iscloam.launch file, the following problems appeared. I used PCL1.8.1, Opencv3.4.9, GTSAM4.0.3, Ceres1.14, Do you know how to solve it ?
... logging to /home/ubuntu/.ros/log/c61b096c-d3b6-11ea-8bf8-34de1af975b3/roslaunch-ubuntu-CW65S-29499.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://localhost:38889/
PARAMETERS
NODES
/odom_final/
trajectory_server_loam (hector_trajectory_server/hector_trajectory_server)
/gt/
trajectory_server_loam (hector_trajectory_server/hector_trajectory_server)
/
iscloam_isc_generation_node (iscloam/iscloam_isc_generation_node)
iscloam_isc_optimization_node (iscloam/iscloam_isc_optimization_node)
iscloam_laser_processing_node (iscloam/iscloam_laser_processing_node)
iscloam_odom_estimation_node (iscloam/iscloam_odom_estimation_node)
rosbag_play (rosbag/play)
rviz (rviz/rviz)
word2map_tf (tf/static_transform_publisher)
auto-starting new master
process[master]: started with pid [29509]
ROS_MASTER_URI=http://localhost:11311
setting /run_id to c61b096c-d3b6-11ea-8bf8-34de1af975b3
process[rosout-1]: started with pid [29522]
started core service [/rosout]
process[rosbag_play-2]: started with pid [29525]
process[iscloam_odom_estimation_node-3]: started with pid [29527]
process[iscloam_laser_processing_node-4]: started with pid [29537]
process[iscloam_isc_generation_node-5]: started with pid [29554]
process[iscloam_isc_optimization_node-6]: started with pid [29561]
process[word2map_tf-7]: started with pid [29565]
process[rviz-8]: started with pid [29570]
process[gt/trajectory_server_loam-9]: started with pid [29584]
process[odom_final/trajectory_server_loam-10]: started with pid [29587]
The ISC parameters are:20
number of rings: 20
number of sectors: 60
maximum distance: 40
[ INFO] [1596259257.372484322, 1317357625.605306247]: odom inited
[ WARN] [1596259257.384661902, 1317357625.610353380]: intensity is 0.090000, if intensity showed here is integer format between 1-255, please uncomment #define INTEGER_INTENSITY in iscGenerationClass.cpp and recompile
[iscloam_odom_estimation_node-3] process has died [pid 29527, exit code -11, cmd /home/ubuntu/iscloam_ws/devel/lib/iscloam/iscloam_odom_estimation_node __name:=iscloam_odom_estimation_node __log:=/home/ubuntu/.ros/log/c61b096c-d3b6-11ea-8bf8-34de1af975b3/iscloam_odom_estimation_node-3.log].
log file: /home/ubuntu/.ros/log/c61b096c-d3b6-11ea-8bf8-34de1af975b3/iscloam_odom_estimation_node-3*.log
Dear authors, firstly I want to thanks for your code. I have tested your code on sequence 00 of Kitti odometry dataset, and the result of average translational error is around 1.17%, which is not match 0.24% published on your github page. The same problem occurs in Fast-Loam, where your result is 0.51% on sequence 00 and my result is 0.97%. Maybe I need to make some changes to the code base you released before testing on Kitti odometry? I would be very grateful if you could help me.
Hi Wang,
Really cool work! wondering what version of PCL was used by you.
Hi @wh200720041, thanks for your work!
I have a vlp-16 bag data to run the demo. The topic map
published by iscloam_laser_mapping_node
is not the whole map, right? How to see the whole map in rviz, thanks a lot!
Hi,
i tried to build the package with catkin_make but i get an endless amount of error lines.
Most of them contain something similar to this:
/usr/include/pcl-1.10/pcl/point_types.h:546:1: error: ‘plusscalar’ is not a member of ‘pcl::traits’ 546 | POINT_CLOUD_REGISTER_POINT_STRUCT (pcl::Boundary,
I am running ROS Noetic on Ubuntu 20.04
Hi @wh200720041, thanks for sharing your excellent work! I have some questions after running your code as follows:
When loopclosure was detected, the topic /final_path didn't output anymore. Red path is ground truth, Yellow path is result of iscOptimizationClassNode.cpp.
Wish to get reply from you, and thanks for work sincerely.
Hi :) @wh200720041 I keep testing your algorithm.
When I get the map from iscloam I have a poor result compared to floam.
iscloam:
floam:
I subscribe to /map and get a .pcd file. I test these two ways:
(1)
rosrun pcl_ros pointcloud_to_pcd input:=/map
(2)
rosbag record -o <name> /map
rosrun pcl_ros bag_to_pcd <rosbag_name.bag> /map pcd
Your explanation will be of great help to me.
Hi doctor wang,
When geometryConsistencyVerification()
in line 68 of iscOptimizationClass.cpp, return true, there is a true loop between history matched frame id and curr id.
Why the code is this ? Thanks for your help !
graph.push_back(
gtsam::BetweenFactor<gtsam::Pose3>(gtsam::Symbol('x', matched_frame_id[i]+1), //TODO:why not is matched_frame_id[i]
gtsam::Symbol('x', pointcloud_edge_arr.size()), //TODO: why not is pointcloud_edge_arr.size()-1
loop_temp, loopModel));
In a scenario that i tested, where a loop closure is detected (not the first loop closure), the optimization node was stuck at:
gtsam::LevenbergMarquardtOptimizer(graph, initials).optimize()
The program didn't crash, but continued without any type of exit. Do you have any insight on what might be the cause?
Thanks!
Can i save map in the mapping file, and after that, Can i localization in the saved map??
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.