utexas-bwi / bwi_common Goto Github PK
View Code? Open in Web Editor NEWCommon packages and data for BWI projects
Home Page: http://wiki.ros.org/bwi_common
License: Other
Common packages and data for BWI projects
Home Page: http://wiki.ros.org/bwi_common
License: Other
That does not work with binary packages, which are installed read-only.
The usual recommendation for things like this is something like $ROS_HOME/bwi_logging
, and if $ROS_HOME is not defined, use ~/.ros
instead. The program must check the existence of that directory and create it, if necessary.
Unfortunately, that will cause problems on the robots, with all the users saving log files under their own home directories. I think we'd prefer a single global system directory for them. Relying on every user to define $ROS_HOME appropriately does not seem feasible. So, we probably want to create a directory like /etc/bwi
, writeable by the bwi
group, in which to store per-robot configuration and logs.
@shiqizhang6: I think you have more important things to do. I'll work on this if you like, although I would need some of your time for explaining how it all fits together. I see the record.launch
file that automatically saves the bags, but not when and where frame_recording
and get_distance.py
are used. There is also an empty src/trajectory_following.cpp
, which I plan to delete.
I was having this issue on the fork so I cloned a new bwi common and got this same error
/opt/ros/indigo/share/catkin/cmake/catkin_package.cmake:296 (message):
catkin_package() include dir 'ledcomm' does not exist relative to
'/home/users/nathanforyou/segbot_ws/src/segbot/segbot_led'
Call Stack (most recent call first):
/opt/ros/indigo/share/catkin/cmake/catkin_package.cmake:98 (_catkin_package)
segbot/segbot_led/CMakeLists.txt:14 (catkin_package)
xref: utexas-bwi/bwi#44
The first step is porting bwi_common to the new distro.
The initial problem seems to be a missing dependency, so I'll work on that:
$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
bwi_virtour: Cannot locate rosdep definition for [web_video_server]
Since, web_video_server is not yet released to Kinetic, I'll request that they do that.
Here are the current errors and warnings (ignoring notices):
$ catkin_lint . -W1
bwi_kr_execution: warning: target 'state_tracker' is not installed
bwi_logging: error: build include path 'include' does not exist
bwi_logging: error: unconfigured build_depend on 'nav_msgs'
bwi_logging: error: unconfigured build_depend on 'roscpp'
bwi_logging: error: unconfigured build_depend on 'message_filters'
bwi_logging: error: unconfigured build_depend on 'cv_bridge'
bwi_logging: error: unconfigured build_depend on 'sensor_msgs'
bwi_logging: error: unconfigured build_depend on 'geometry_msgs'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'roscpp'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'sensor_msgs'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'cv_bridge'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'image_transport'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'message_filters'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'nav_msgs'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'geometry_msgs'
bwi_msgs: error: message dependency 'std_msgs' is not listed in catkin_package()
bwi_msgs: error: message dependency 'std_msgs' is not listed as run_depend
bwi_rqt_plugins: error: find_package(class_loader) has no REQUIRED option
bwi_rqt_plugins: error: rqt_gui plugin file 'python_plugins.xml' is not installed to ${CATKIN_PACKAGE_SHARE_DESTINATION}
bwi_rqt_plugins: error: rqt_gui plugin file 'cpp_plugins.xml' is not installed to ${CATKIN_PACKAGE_SHARE_DESTINATION}
bwi_rqt_plugins: CMakeLists.txt(31): error: duplicate catkin_package()
bwi_scavenger: CMakeLists.txt(16): warning: use of link_directories() is strongly discouraged
bwi_tasks: warning: target 'simulator_learning_tasks_node' is not installed
bwi_tasks: warning: target 'learning_tasks_node' is not installed
bwi_tools: CMakeLists.txt(15): error: catkin_package() exports non-package include path
stop_base: error: unconfigured build_depend on 'geometry_msgs'
stop_base: error: unconfigured build_depend on 'bwi_msgs'
stop_base: tests/CMakeLists.txt(9): error: duplicate find_package(catkin)
stop_base: tests/CMakeLists.txt(9): error: catkin_package() is called before find_package()
catkin_lint: checked 14 packages and found 29 problems
catkin_lint: 27 notices have been ignored. Use -W2 to see them
It should go here:
/opt/ros/hydro/include/bwi_planning_common/structures.h
instead of:
/opt/ros/hydro/include/bwi_planning_common/bwi_planning_common/structures.h
Fixing this now. All the domain directories and the launch directory need to be installed for now. This will require a new release.
It would be useful if we can add the ability to log extra (experimental and potentially large) topics. Ie: have another parameter to bwi_logging launch file where you can specify an extra set of topics to log, which will be logged with an "extra" prefix, which the upload script can handle accordingly.
This creates a good divide between the small essential logs and any others which may be run on an experiment-basis.
Will also need to update bwi_scripts accordingly
[ 27%] Building CXX object bwi_common/bwi_kr_execution/CMakeFiles/kractions.dir/src/actions/LogicalNavigation.cpp.o
In file included from /tmp/test_repositories/src_repository/bwi_common/bwi_kr_execution/src/actions/LogicalNavigation.cpp:1:0:
/tmp/test_repositories/src_repository/bwi_common/bwi_kr_execution/src/actions/LogicalNavigation.h:7:63: fatal error: segbot_logical_translator/LogicalNavigationAction.h: No such file or directory
compilation terminated.
Looks like an add_dependencies()
problem.
The currently-released version is so down-level that it is causing build errors in higher-level components.
see: utexas-bwi/segbot#61
xref: 72d660d
When you compile bwi_scavanger you get the following warning message:
WARNING: Target "scavenger" requests linking to directory "/usr/lib". Targets may link only to libraries. CMake is dropping the item.
We don't actually care about Saucy, but it is still supported for ROS Indigo, so the build farm fails as a result. The problem seems to be an incompatible version of yaml-cpp:
/usr/lib/ccache/c++ -DEIGEN_USE_NEW_STDVECTOR -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET -DFLANN_STATIC -DROSCONSOLE_BACKEND_LOG4CXX -DROS_PACKAGE_NAME=\"bwi_scavenger\" -Dqh_QHpointer -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -DNDEBUG -D_FORTIFY_SOURCE=2 -Wno-deprecated -O2 -g -DNDEBUG -I/usr/include/vtk-5.8 -I/usr/include/opencv -I/opt/ros/indigo/include -I/usr/include/eigen3 -I/usr/include/pcl-1.7 -I/usr/include/ni -I/usr/include/qhull -o CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o -c /tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp: In constructor 'SearchPlanner::SearchPlanner(ros::NodeHandle*, std::string, float)':
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:60:57: error: 'const class YAML::Node' has no member named 'as'
tmp_pose.pose.position.x = yaml_positions[i][0].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:60:60: error: expected primary-expression before 'double'
tmp_pose.pose.position.x = yaml_positions[i][0].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:60:60: error: expected ';' before 'double'
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:61:57: error: 'const class YAML::Node' has no member named 'as'
tmp_pose.pose.position.y = yaml_positions[i][1].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:61:60: error: expected primary-expression before 'double'
tmp_pose.pose.position.y = yaml_positions[i][1].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:61:60: error: expected ';' before 'double'
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:62:60: error: 'const class YAML::Node' has no member named 'as'
tmp_pose.pose.orientation.z = yaml_positions[i][2].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:62:63: error: expected primary-expression before 'double'
tmp_pose.pose.orientation.z = yaml_positions[i][2].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:62:63: error: expected ';' before 'double'
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:63:60: error: 'const class YAML::Node' has no member named 'as'
tmp_pose.pose.orientation.w = yaml_positions[i][3].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:63:63: error: expected primary-expression before 'double'
tmp_pose.pose.orientation.w = yaml_positions[i][3].as<double>();
^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:63:63: error: expected ';' before 'double'
make[4]: *** [CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o] Error 1
Ubuntu Trusty has yaml-cpp 0.5.1, which works. I am still trying to figure out what the problem is with Saucy. It must have an earlier version, but I don't yet know which one.
$ rosdep install bwi_kr_execution
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
bwi_kr_execution: Cannot locate rosdep definition for [clingo]
Should this be gringo
, instead?
Now that utexas-bwi/bwi_lab#1 is finally working, we can add an automatic way to run bwi bags
and bwilab upload
at the end of each run.
To start with, I'll try running it when the record node receives its shutdown signal. That is the simplest solution, and I think it will be fast enough.
It is installed from the scripts
subdirectory, but is actually in a C++ library, which is already installed.
Unfortunately, joystick_teleop_node
is almost unusable with a PS4 controller because axis 3 maps to the left trigger. Also, the emergency stop button maps to X on PS4 controller, although from the comments it seems like it should map to O which is generally PS4's equivalent to Xbox's B button.
I can implement this quickly and easily with an additional ~mapping
parameter or such, defaulting to "xbox"
, but would also accept "ps4"
.
Robot needs to turn a bit or spin so as to actively look for humans nearby. Now, the robot sometimes gets stuck near a wall while facing it.
The task of "take_human_input" needs to switch the service name from "segbot_gui" to "bwi_msgs". Also the task of "take_human_input.py" is not needed anymore.
add missing component packages
add export tag
When you subscribe to a camera output produced by libgazebo_ros_camera, it does successfully produce an image, but then the image stream gets permanently frozen.
Building the current master on Indigo/Trusty fails:
Linking CXX executable /home/joq/ros/ws/devel/lib/bwi_scavenger/scavenger
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `SearchPlanner::SearchPlanner(ros::NodeHandle*, std::string, float)':
SearchPlanner.cpp:(.text+0xf9): undefined reference to `YAML::LoadFile(std::string const&)'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::memory_holder::create_node()':
SearchPlanner.cpp:(.text._ZN4YAML6detail13memory_holder11create_nodeEv[_ZN4YAML6detail13memory_holder11create_nodeEv]+0x1c): undefined reference to `YAML::detail::memory::create_node()'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::mark_defined()':
SearchPlanner.cpp:(.text._ZN4YAML6detail8node_ref12mark_definedEv[_ZN4YAML6detail8node_ref12mark_definedEv]+0x1c): undefined reference to `YAML::detail::node_data::mark_defined()'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::set_null()':
SearchPlanner.cpp:(.text._ZN4YAML6detail8node_ref8set_nullEv[_ZN4YAML6detail8node_ref8set_nullEv]+0x1c): undefined reference to `YAML::detail::node_data::set_null()'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::set_scalar(std::string const&)':
SearchPlanner.cpp:(.text._ZN4YAML6detail8node_ref10set_scalarERKSs[_ZN4YAML6detail8node_ref10set_scalarERKSs]+0x27): undefined reference to `YAML::detail::node_data::set_scalar(std::string const&)'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::size() const':
SearchPlanner.cpp:(.text._ZNK4YAML6detail8node_ref4sizeEv[_ZNK4YAML6detail8node_ref4sizeEv]+0x1c): undefined reference to `YAML::detail::node_data::size() const'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::Node::Scalar() const':
SearchPlanner.cpp:(.text._ZNK4YAML4Node6ScalarEv[_ZNK4YAML4Node6ScalarEv]+0x64): undefined reference to `YAML::detail::node_data::empty_scalar'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node& YAML::detail::node_data::get<int>(int const&, boost::shared_ptr<YAML::detail::memory_holder>)':
SearchPlanner.cpp:(.text._ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0xae): undefined reference to `YAML::detail::node_data::convert_to_map(boost::shared_ptr<YAML::detail::memory_holder>)'
SearchPlanner.cpp:(.text._ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0x21c): undefined reference to `YAML::detail::node_data::insert_map_pair(YAML::detail::node&, YAML::detail::node&)'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node& YAML::detail::node_data::convert_to_node<int>(int const&, boost::shared_ptr<YAML::detail::memory_holder>)':
SearchPlanner.cpp:(.text._ZN4YAML6detail9node_data15convert_to_nodeIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data15convert_to_nodeIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0x56): undefined reference to `YAML::detail::memory_holder::merge(YAML::detail::memory_holder&)'
collect2: error: ld returned 1 exit status
make[2]: *** [/home/joq/ros/ws/devel/lib/bwi_scavenger/scavenger] Error 1
make[1]: *** [CMakeFiles/scavenger.dir/all] Error 2
make: *** [all] Error 2
I believe it needs both build and run dependencies in the package.xml:
<build_depend>yaml-cpp</build_depend>
<run_depend>yaml-cpp</run_depend>
In addition, I believe it needs something like this in its CMakeLists.txt:
# Resolve system dependency on yaml-cpp, which apparently does not
# provide a CMake find_package() module.
find_package(PkgConfig REQUIRED)
pkg_check_modules(YAML_CPP REQUIRED yaml-cpp)
find_path(YAML_CPP_INCLUDE_DIR
NAMES yaml_cpp.h
PATHS ${YAML_CPP_INCLUDE_DIRS})
find_library(YAML_CPP_LIBRARY
NAMES YAML_CPP
PATHS ${YAML_CPP_LIBRARY_DIRS})
I am not absolutely certain about all this. But, the build does fail.
@shiqizhang6, @piyushk: Do you want me to try coming up with a fix?
The current bag saving interface is documented here. The robot launch scripts will save a few ROS topics (odom, amcl_pose, and diagnostics) to ~/.ros/bwi/bwi_logging
for the user running the launch.
These files can get quite large for long runs, which are the ones we are most interested in capturing. Shiqi and I uploaded one yesterday from bender. It was 56MB and had run for only about 12 minutes:
$ rosbag info bwi_2015-12-03-00-00-00.bag
path: bwi_2015-12-03-00-00-00.bag
version: 2.0
duration: 12:10s (730s)
start: Oct 28 2015 15:15:51.96 (1446063351.96)
end: Oct 28 2015 15:28:02.77 (1446064082.77)
size: 55.9 MB
messages: 76193
compression: none [74/74 chunks]
types: diagnostic_msgs/DiagnosticArray [60810da900de1dd6ddd437c3503511da]
geometry_msgs/PoseWithCovarianceStamped [953b798c0f514ff060a53a3498ce6246]
nav_msgs/Odometry [cd5e73d190d741a2f92e81eda573aca7]
topics: /diagnostics 2913 msgs : diagnostic_msgs/DiagnosticArray (4 connections)
amcl_pose 195 msgs : geometry_msgs/PoseWithCovarianceStamped
odom 73085 msgs : nav_msgs/Odometry
Most of that is odometry, which is quite a large message published at 100 Hz. I didn't realize it was so frequent. Maybe the amcl_pose, which is a much smaller message at only 0.25 Hz, would suffice for the data we want to gather. That should at least tell us how far the robot went, though maybe not where. If we really need odometry data, we should probably write a node that republishes it on a separate topic once a second or so.
The current upload script copies all the saved bags from its current directory to the ~bwilab/robot/$HOSTNAME
directory on nixons-head. By default, it deletes all the files it successfully uploads.
I am somewhat inclined to leave that script alone, and supplement it with tools to remove or mark files as not worth saving on the server. Criteria could include: eliminating data from extremely short runs, checking whether or not the robot actually moved, etc. Changing a file's name prefix from bwi_
to something else would automatically cause the upload script to skip it.
I can think of several ways to go about this, but requirements will probably vary for different users.
@shiqizhang6, @piyushk, @jsinapov, @maxsvetlik: Comments and suggestions?
This will simplify the package dependency graph, and make the messages and services easy to document on the ROS wiki.
See: #30
The setup.py apparently declares segbot_gui as its package name. That is causing build failures.
I am guessing this code may have migrated from there at some point.
see: utexas-bwi/multi_level_map#9
Some debugging output slipped through to stdout. remove it.
This will prevent the package from being released. current.asp should also be written into a temporary directory.
If someone will tell me the correct URL, I'll add it to the README and maybe create a ROS wiki page, too.
The migration guide recommends using cv_bridge or image_geometry instead for common source supporting both Hydro and Indigo. As they say, cv_bridge has clearer intent.
Errors similar to utexas-bwi/bwi_planning#4 still exist. Resolve them before the next release.
xref: utexas-bwi/segbot#41, 4ca76a6
bwi_kr_execution/launch/bwi_kr_execution_simulation.launch
There are still undeclared dependencies:
$ grep -R segbot_gui bwi_common/
bwi_common/bwi_kr_execution/launch/bwi_turtlebot.launch: <node name="segbot_gui" pkg="segbot_gui" type="question_dialog_plugin" />
bwi_common/bwi_kr_execution/launch/robot.launch: <node name="segbot_gui" pkg="segbot_gui" type="question_dialog_plugin" />
bwi_common/bwi_scavenger/src/take_human_input.py:import segbot_gui.srv
bwi_common/bwi_scavenger/src/take_human_input.py: segbot_gui.srv.QuestionDialog)
bwi_common/bwi_scavenger/src/take_human_input.py: segbot_gui.srv.QuestionDialog)
These bwi_common packages cannot depend on the segbot repository, because it is packaged at a higher level. Maybe segbot_gui could be moved here (hopefully, with a different name. But, the current packaging is broken.
Related problem, already fixed I think: #29
@piyushk, @shiqizhang6: I am leaving town in the morning and have no more time to work on this. I had already released our four main repositories, but the binary debs are broken until this gets repaired.
The Ubuntu Trusty version of clingo no longer supports the --imin
and --imax
command arguments. That prevents bwi_kr_execution
from working on flexo.
There are several possible solutions. Let's use this issue to track work-arounds and solutions.
For example: serveCertificates.sh
assumes the existence of a workspace named ~/catkin_ws_scavenger/
and then goes to a nonexistent subdirectory of bwi_logging, where it attempts to run a python module.
Does that module expect to write files into its current directory? If so, it should be using something like ~/.ros/bwi/bwi_virtour
(which it must create, if necessary), similar to the way bwi_logging saves its files.
Also, I have some doubts that startKrExecution.sh
is an appropriate way to launch other system components, except maybe as a convenience during development.
When ascending the elevator from downstairs, it stops right in front of that door, too close for it to swing open.
I was able to back up the robot with teleop_keyboard
, so the door could open, but the approach point should be moved farther away.
cc: @piyushk, @FernandezR
/home/travis/catkin_ws/src/bwi_common/bwi_virtour/src/go_to_location_service.cpp:7:32: fatal error: bwi_virtour/Rotate.h: No such file or directory
#include "bwi_virtour/Rotate.h"
^
compilation terminated.
This looks like an add_dependencies()
error. We've been seeing a lot of those.
xref: #63
These are launch file dependencies. They would be caught if the package had a launch check unit test, but it does not. The references are in: bwi_turtlebot_launch and robot.launch.
@piyushk: the segbot_logical_translator appears to be a pure BWI component with no dependency on anything specific to the segbot platform. If so, I recommend moving it to bwi_common and renaming it bwi_logical_translator. The only references I can find are in bwi_launch and here in bwi_kr_execution.
If we are going to maintain this metapackage, it should depend on everything in this repository.
Or, we can delete the metapackage, since it isn't particularly useful.
@piyushk: what do you think?
In doing the human following task, the robot sets the detected human's position as the goal. This goal turns out to be unreachable until the human moves.
Instead of copying the logs to the ~bwilab/robot/$HOSTNAME
directory on nixons-head, it copies the bag file to the directory name if a directory for that robot does not already exist. It needs to create the directory in that case, then copy the files into it.
Also, the README documentation for that script erroneously calls that directory ~bwilab/host/$HOSTNAME
instead of ~bwilab/robot/$HOSTNAME
.
cc: @shiqizhang6
This is a problem with the released version, causing utexas-bwi/bwi#45 to fail. Fixing that will require a new bwi_common release.
@pato: see:
On Indigo, I see the following failure:
checking /home/joq/ros/ws/src/bwi_common/bwi_web/launch/webserver.launch
...writing test results to /home/joq/ros/ws/build/bwi_web/test_results/bwi_web/roslaunch-check_launch.xml
FAILURE:
[/home/joq/ros/ws/src/bwi_common/bwi_web/launch/webserver.launch]:
cannot find node [rosapi] in package [rosapi]
Looks like the node name should be rosapi_node
instead of rosapi
. That's easy to fix, but I don't know how to test this package.
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.