Giter Club home page Giter Club logo

m-explore's Introduction

m-explore

Build Status

ROS packages for multi robot exploration.

Installing

Packages are released for ROS Kinetic and ROS Lunar.

	sudo apt install ros-${ROS_DISTRO}-multirobot-map-merge ros-${ROS_DISTRO}-explore-lite

Building

Build as standard catkin packages. There are no special dependencies needed (use rosdep to resolve dependencies in ROS). You should use brach specific for your release i.e. kinetic-devel for kinetic. Master branch is for latest ROS.

WIKI

Packages are documented at ROS wiki.

COPYRIGHT

Packages are licensed under BSD license. See respective files for details.

m-explore's People

Contributors

hrnr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

m-explore's Issues

Merged map origin is off the centre

Hi,
I am using kinetic version of this package. It is discovering all robots and map topics perfectly but not able to merge the maps. the empty (no data) merged map is coming at the rate approx 4.
I have tried in both cases, known and unknown initial poses but it seems map_merge node is unable to compute the transforms.
In known case, for each robot it is getting initial poses but transform looks only NAN values.

Thanks for any help!...

Could not find nearby clear cell to start search

I have built this package from source in its own workspace and am able to launch it. Below is a screenshot from rviz. There are several frontiers that are unknown that I would expect the robot to explore. However, within seconds of launching the node, it reports "could not find nearby clear cell to start search" followed by "exploration stopped". Any ideas on what I may be doing wrong?

A few notes about my setup:

  • I am using ROS kinetic.
  • I use the cartographer package to create a map.
  • I have move_base running properly (i.e. using the map from cartographer, I can give my robot a 2D nav goal in rviz, and the robot will properly navigate to the destination).
  • I am using the out-of-the-box explore.launch file. (I have topics of type nav_msgs/OccupancyGrid at /map and /move_base/global_costmap/costmap. Using either of these for the <param name="costmap_topic" value="<one of the above>"/> in the launch file results in the same behavior.)
  • My tf tree looks like this: map -> odom -> base_link. In short, I think I have the correct transforms/frames.

explore_lite

Merge multiple maps into one map

Hi, we have a problem merging three maps from thre turtlebots into one, i have in the tf tree the connection between the maps into the map merge, but when i try to visualize in Rviz, the map merge just take the values of one of the maps, and not a map like it should be. First we have problems to get the transform between the maps, we did what it said in some commits that appears in https://github.com/hrnr/m-explore/pull/30/commits but, the problem continues. the configuration of map_merge.launch is .

<launch>
<group ns="map_merge">
<node pkg="multirobot_map_merge" type="map_merge" respawn="false" name="map_merge" output="screen">
<param name="robot_map_topic" value="map"/>
<param name="robot_map_updates_topic" value="map_updates"/>
<param name="robot_namespace" value="robot_"/>
<param name="merged_map_topic" value="/map"/>
<param name="world_frame" value="/map"/>
<param name="known_init_poses" value="false"/>
<param name="merging_rate" value="4.0"/>
<param name="discovery_rate" value="0.05"/>
<param name="estimation_rate" value="0.5"/>
<param name="publish_rate" value="1.0"/>
<param name="estimation_confidence" value="1.0"/>
</node>
</group>
</launch>

Frames tree it's like this.

frames (23).pdf

the map that should be the merge between other maps

Map merge

the map 1 is like this
map 1

the map 2 is like this.

map2

the map 3 is like this.
map3

the map that should be merge is like this ( visualizing the three maps at the same time).
all_maps_without_merge

how to get the trasformation to map merger

I noticed that you can get transformations from the different maps (input maps)
but I can't see where is the transformation from all the maps to the merge map.
I want to know this for place all the robots on the merge map.
I also noticed that if there is more than one map , merge map's dimension is different and also and offset

No frontiers even though many unknown spaces

When I launch the explore_lite, it starts settting some goals and explore the area but after a minute or so, no frontiers are left but from the map, the area is large and the robot is surrounded by unknown spaces. Have a look at the screenshot:

whatsapp image 2019-02-18 at 11 20 47

Also, my Lidar is a solid state with FOV of 90 degrees.

issue when exploring the large open area

when I tried to use explore_lite in a large open area, the robot sometimes stuck in place and never moved again. There are available frontiers that can be visualized viaMarkerArray with rviz but the exlor_lite doesn't send any of them to move_base goal action. Also when I manually set the goal point, the robot can move toward the point but shortly after will be drag back to the stuck location where explore_lite sent. This also happens when robot spawns in a position where facing walls and no frontier explored.

error

the above image shows the robot stuck in an open area. But shortly after the frontier will become red (assume as goal in blacklist), then it will become normal again. There is a goal sending to move base but the goal locates at same spot where robot stuck.
erro2
error3

opencv not always installed in "/usr/include/opencv-3.1.0-dev/opencv"

Using jade:

git clone https://github.com/hrnr/m-explore
catkin_make only found Opencv2.4 your package reqires opencv3

used this fix
sudo apt-get install ros-jade-opencv3

Now I receive this message.

CMake Error in m-explore/map_merge/CMakeLists.txt:
Imported target "opencv_xphoto" includes non-existent path

"/usr/include/opencv-3.1.0-dev/opencv"

in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include:

  • The path was deleted, renamed, or moved to another location.
  • An install or uninstall procedure did not complete successfully.
  • The installation package was faulty and references files it does not
    provide.

CMake Error in m-explore/map_merge/CMakeLists.txt:
Imported target "opencv_xphoto" includes non-existent path

"/usr/include/opencv-3.1.0-dev/opencv"

in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include:

  • The path was deleted, renamed, or moved to another location.
  • An install or uninstall procedure did not complete successfully.
  • The installation package was faulty and references files it does not
    provide.

dims of the result map does not match with the input

Hi,

I am using 2 robots that produce 160x160 maps and the initial positions are provided. The resultant map I get is 164x161. Why wouldn't the merged map match with the input maps? is there a configuration param that could restrict the size of the maps?

indigo

hello!The package can be worked on the indgo??? I have a turtlebot but I don't know how to use the package! Can you give me A detailed tutorial?

Pausing and Restarting Exploration

Working with a version built for Melodic and it goes well.

What I need to do is stop the exploration at certain times even when a goal is incomplete. This when another sensor detects something of interest. After the processing of the sensor data I need to restart the exploration.

Can I do this? Or would changes be needed?

AKAZE

Hi Jiří, is it possible to get in touch with you? I would like to ask you something about your work related to the A-KAZE algorithm. Do you have an email address or any other address? :)

multimap merge problem

when i set know_init_poses ='false',it just show last robot map under the topic 'map',the 'merge node 'subsciber every 'robot/map',why did it occur? @hrnr

explore_lite does not work with google cartographer

Hello,

I have this unique issue where I am running cartographer and both gmapping as my SLAM methods. However, when i run Gmapping, m-explore works fine and it can find frontiers to send navigation goals to my robot. However, when I run Cartographer, I cannot seem to find frontiers with m-explore. I have checked and the robot is not stuck or anything. Is there anything that I can do from M-explore's end?
I'm using Melodic on Linux 18.04 if that helps.
Thank you!

The second robot map seems not in the right position

Thank you for the package. It is discovering all robots and map topics perfectly. But there was some problem when it merged the maps. The two maps were published through two rosbag. When I used the “known_init_poses” mode, it seems the transform between the two maps is not right. I call the two maps “/robot1/map” and “/robot2/map”. And I set the world_frame to “/robot2/map”. The maps published by map_server are as follows. The starting point of both maps in the ground is the same.

map1.pgm:
qq 20180504102225

map1.yaml:
image
map2.pgm:
qq 20180504102801

map2.yaml:
image
Here is the map_merge.launch file and I add the initial poses in it.

<launch>
<group ns="map_merge">
  <node pkg="multirobot_map_merge" type="map_merge" respawn="false" name="map_merge" output="screen">
    <param name="robot_map_topic" value="map"/>
    <param name="robot_namespace" value=""/>
    <param name="merged_map_topic" value="map"/>
    <param name="world_frame" value="/robot2/map"/>
    <param name="known_init_poses" value="true"/>
    <param name="merging_rate" value="0.5"/>
    <param name="discovery_rate" value="0.05"/>
    <param name="estimation_rate" value="0.1"/>
    <param name="estimation_confidence" value="1.0"/>
  </node>
</group>

<group ns="/robot1/map_merge">
  <param name="init_pose_x" value="-122.356226"/>
  <param name="init_pose_y" value="-97.080847"/>
  <param name="init_pose_z" value="0.0"/>
  <param name="init_pose_yaw" value="0.0"/>
</group>
<group ns="/robot2/map_merge">
  <param name="init_pose_x" value="0.0"/>
  <param name="init_pose_y" value="0.0"/>
  <param name="init_pose_z" value="0.0"/>
  <param name="init_pose_yaw" value="0.0"/>
</group>

</launch>

Here is the merged map and I set the world_frame to “/robot2/map”. But the “/robot1/map” is not in the right position.
qq 20180504103857

I don't know if the parameters I set are correct. Could you please give me some help? Thank you!

Some code questions

Currently, I'm reading my way through the source code to understand how everything is working and adept maybe some parts, but there are parts I don't understand.

  1. Why are there 2 ros::NodeHandle's in class Explore?

  2. How does the while (ros::ok() && ...) loop in the constructor of class Costmap2DClient work. I would think this blocks everything and I can't see any threads being used. (explore.cpp includes thread but never uses it?) So can updateFullMap ever be called? And even if a loop in the constructor?

  3. Is there any reason why you nest your ros callback function in a lambda?

costmap_updates_sub_ =
      subscription_nh.subscribe<map_msgs::OccupancyGridUpdate>(
          costmap_updates_topic, 1000,
          [this](const map_msgs::OccupancyGridUpdate::ConstPtr& msg) {
            updatePartialMap(msg);
          });

Isn't this much more straigt forward:

costmap_updates_sub_ = 
      subscription_nh.subscribe<nav_msgs::OccupancyGrid>(
            costmap_topic, 1000, &Costmap2DClient::updateFullMap, this);

Setting up initial positions

Started two robots, both maps recognized by the merger running in "initial pose not known" mode, but the merged map that is output seems to only be a slightly distorted version of the second robot's map.

robot 1's map
tbot0

robot 2's map
tbot1

merged map
odd merge

robot setup shown in gazebo
gazebo modified robot setup

I've also tried setting up the robots in "initial pose known mode", though the map merger doesn't seem to recognize the ros topics I setup shown below (worth noting I did change "known_init_poses" to true when trying this).

rostopic pub /tbot0/map_merge/init_pose_x std_msgs/Float64 -- -0.75
rostopic pub /tbot0/map_merge/init_pose_y std_msgs/Float64 -- 0.5
rostopic pub /tbot0/map_merge/init_pose_z std_msgs/Float64 -- 0.0
rostopic pub /tbot0/map_merge/init_pose_yaw std_msgs/Float64 -- -1.5708

rostopic pub /tbot1/map_merge/init_pose_x std_msgs/Float64 -- 0.75
rostopic pub /tbot1/map_merge/init_pose_y std_msgs/Float64 -- -0.5
rostopic pub /tbot1/map_merge/init_pose_z std_msgs/Float64 -- 0.0
rostopic pub /tbot1/map_merge/init_pose_yaw std_msgs/Float64 -- 1.5708

Ends exploration early when boundary is on static map edge

explorer_lite seems to ignore frontier when it's on the edge of the static map. It's a problem with mappers like iris_lama_ros which uses dynamic sized static map and makes ir bigger when new obstacles are detected outside current map but in case of exploration with explorer_lite it won't make map bigger because robot turns around before it can be done. It has effect of mapping only the small part of the map. But not all parts of potential frontier are at the edge of the static map so there might be another problem. In image included I drawn red boxes where it should explore but doesn't. At this point robot think it has explored everything and stopped even though some frontiers are still visualized

image

Problem with map-merging without initial pose.

Hi,
Thanks for the package, it's very helpful but I met some problems when running some tests.
I used two turtlebot3 burgers in gazebo to do some sim tests. When the package knew their initial pose, it worked very well, but when I set the parameter to False, the world map provided by the package became to only the local map of robot1.
I thought maybe it needed more overlap to calculate the transformation, so I ran the simulation for another several times. But even when the map of robot1 was included in the map of robot2 totally, the world map(i.e. the merged map) was still same as the map of robot1.
This was strange because according to the log info, everything worked fine and maps were "merged successfully".
Do you have any suggestions? Thank you very much, looking forward to your reply.

Best,
Hui.

Map merging without initial pose only publishing one of the maps

Hello
We are having a group project in ROS using P3AT robots and Gmapping.
We wanted to use your package to merge the maps published by each of the robots but we have faced some problems.
I have read the previous issue on this project where you changed the estimation confidence to merge the maps properly but no matter how much I change it, the only thing that happens it that the merged map changes from robot0 to robot1's map and keeps switching between them, so that we can't manage to get the merged map of both at the same time.

I have attached the image and YAML files of our maps.

Could you please help me out with this?
files and pictures of project.zip

frontiers update issue

Hi,
I ran this package on ros indigo. There is more than one frontier goal and trajectory planner plans a path to one of them and robot starts moving through this path. After "planner_frequency" time outs, the frontier goals update but before arriving to the previous goal the trajectory planner choose another one. How I can optimize the frontier goals (get fewer frontier)? and what should I do in order to stop frontiers from updating before the robot has arrived to it's previous goal?
Thanks

Problem with applying your map merging package on the two provided modes

Hi,
I tried to use your package to merge two maps, generated by cartographer. I use as setup, the gazebo simulation to localize inside a map and to provide laser scan and odomety data in combination with ROS kinetic. Therefore I visualize the generated maps with rviz. I recorded a bag file, wrote a launch file and a rviz config file, see launch.zip. I hope this will help to solve this issue.

I tried your two merging modes with and without initial pose. I observed that without initial pose, the two generated maps aren't merged. Only the map of robot_1 is published to the /map_merge/map topic.

With initial pose, the maps aren't relating with each other, but they lie on top of each other.

Maybe you have some advice or is this intended behaviour?

Costmap is not generated properly

The thing is, I don't have a real turtle and I'm publishing the TF and Scan data from Unity3D. The connection is fine. I now use your explore.launch to determine the locations to explore with "rosrun move_base move_base" running in another terminal. The problem is that the costmap is not set properly.

unnamed

As you can see, the costmap (visualized like a map) is not well set up.

First, I launch the explore.launch in a terminal. When it awaits for move_base node, I run rosrun move_base move_base on another terminal. The terminal outputs are as follows:

roslaunch explore.launch: https://gist.github.com/egemenertugrul/92fc3f2ec23efc5c789d16af23ccf383
rosrun move_base move_base: https://gist.github.com/egemenertugrul/c8224e5653dc23acb0da98a22c89be4c

I'm kinda lost to solve this problem. Only if I could set my costmap properly, I'm guessing that the move_base would work properly.

I don't need to publish Twist command from move_base. I only need a pathfinding algorithm to find the path to the goal published by your explore.cpp, outputting a Pose array. I will be sending this array back to Unity.

Any ideas?

Save map after merging

Hi everyone,

I could run well the code for merging the map.

However, I could not save the map after merging.

Could you tell me how to save the merging-map, please.

Yours sincerely,
Tran

When giving known positions assertion error occurs

Hi,

If I provide the following the launch file

<launch>
  <group ns="/robot1/map_merge">
    <param name="init_pose_x" value="0.068853"/>
    <param name="init_pose_y" value="-0.708363"/>
    <param name="init_pose_z" value="0.035003"/>
    <param name="init_pose_yaw" value="-0.031117"/>
  </group>
  <group ns="/robot2/map_merge">
    <param name="init_pose_x" value="-0.206623"/>
    <param name="init_pose_y" value="1.092293"/>
    <param name="init_pose_z" value="0.034994"/>
    <param name="init_pose_yaw" value="-0.340292"/>
  </group>
    <group ns="map_merge">
      <node pkg="multirobot_map_merge" type="map_merge" respawn="false" name="map_merge" output="screen">
        <param name="robot_map_topic" value="map"/>
        <param name="robot_namespace" value=""/>
        <param name="merged_map_topic" value="map"/>
        <param name="world_frame" value="map"/>
        <param name="known_init_poses" value="true"/>
        <param name="merging_rate" value="0.5"/>
        <param name="discovery_rate" value="0.05"/>
        <param name="estimation_rate" value="0.1"/>
        <param name="estimation_confidence" value="1.0"/>
      </node>
    </group>
</launch>

and set known_init_poses to false then it will work fine, but if I set it to true then I get the following assertion error:
screenshot

And I'm not sure what this means.

The map is not completely explored

Hello,

My problem is the following, after a little while I get this message "Done exploring with 41 goals left that could not be reached.There are 44 goals on our blacklist, and 41 of the frontier goals are too close tothem to pursue. The rest had global planning fail to them" from the explore_lite node. However when I look at the map created in rviz, there is a huge part missing and as far as I can tell it would have not been so difficult to compute a path from my robot's position (at the end of the exploration) and a potentially interesting goal. Do you have any idea of what the problem could be ?

Thank you

PS: ROS version: kinetic

Issues while exploring large area with many unreachable frontiers.

Hello everyone,

I've been having issues whenever I am exploring a large area with many unreachable frontiers (robot won't fit). The issue is it takes forever to realize (if at all) there are no more new frontiers to explore. Sometimes it just keeps rotating in place forever, as if trying to go somewhere but no path is ever found. Otherwise everything works great. Any pointers as to where to look at to avoid this behaviour?

Cheers

map_merger subscribes two map topics, but only displaying one

@hrnr @yzrobot
① I use the following bag(including two robots) and a multi-robots-framework to process and publish two maps, meanwhile I use m-explore to merge them online but I just see three maps with rviz, and the merged map is the same as one of original maps.
② I see some similar issues here
https://github.com/hrnr/m-explore/issues/13
but m-explore works well, and I think the overlap area is big enough. It just could not show the merged map with rviz(one of two original maps instead).
③ I also set the estimation confidence to 0.5
Data set:
2robots-hospital.bag
Commands:

roslaunch multirobot_map_merge map_merge.launch

Results:
robot0(g2o format):
2019_11_17_robot0_1

robot1(g2o format):
2019_11_17_robot1_1

the merged map using offline tool g2o_viewer:
2019_11_17_map1

pgm
robot0:
robot0_1
robot1
2019_11_18_robot1_1
merged_map
2019_11_18_map_1

Termiante:
Snipaste_2019-11-18_14-47-35
2019_11_18_merge

Topic

robot0/map
robot1/map

Question:

  1. As the figure shown above, the merged map is the same as one of two(As shown in pgms above), I cannot find out the reason.
  2. I find that the status in rviz about the merged map is error(No transform from world to robot_0/map), but I can still see the graph. I don‘t know whether it matters.
  3. I doubt that maybe there is some problems in data format, but the figure above in terminate shows it works well, so maybe not the data format?

About source code

Hello, I have a question when reading the source code. I wonder why you just use compose to merge them rather that apply stitch to merge in mapMerging thread. Is the result better?

map merging using explore_ lite costmaps method

I am able to visualise all the maps seperately generated by all the bots using explore_lite costmap.launch, but when i try to merge it i am not able to merge into a common topic. Also my robot is not getting discovered by the map_merging package

About custom the algorithm

Hi,
Thank you for sharing the frontier exploration algorithm. It works nicely. However, i would like ask that if i want the robot come to the closest frontier near the robot or go to where the map has much frontiers points, where is in your code would i need to change more? would you give me a brief recommendation please?
Thank you

suscribe to topic but does not merge

Hello,
First thanks for this package, if I can make it work that's a great program :).
Here is the issue though, I can see my node suscribing to /big_robot/map and /big_robot/map_updates

[ INFO] [1481613140.774543296]: adding robot [/big_robot] to system
[ INFO] [1481613140.774571931]: Subscribing to MAP topic: /big_robot/map.
[ INFO] [1481613140.777035675]: Subscribing to MAP updates topic: /big_robot/map_updates.

But after that it's not merging anything, I had it to work for like 5 min it was merging one grid but now I don't have anything anymore. rostopic echo /map_merge/map gives data: []

My ROS version is Jade.

Do you have any idea where my problem might come from ? Thank you

Cartographer and Explore_Lite

Hello,

I was wondering if I have to make any adjustments to make this package compatible with Google's cartographer slam?

Assertion error when merging with four robots' map

Hello, when I try to merge the 2d occupancy grid maps with the ros package you provide(That's a nice work!).
It works wll when I publish two robots' maps. But when I try to merge four robots' data with it, I find it reports an error shown as below:

image

I have tried to solve it in many ways but failed. It seems that the Assertion error should not have happened for roi.size() must equals to warped_grid.size()
I can't understand why it throws this error. Do you have any idea about it? @hrnr

uninitialised variables mx, my inside the function FrontierSearch::searchFrom(geometry_msgs::Point position) in frontier_search.cpp

I am pasting a code snippet from frontier_search.cpp file.

std::vector<Frontier> FrontierSearch::searchFrom(geometry_msgs::Point position)
{
  std::vector<Frontier> frontier_list;

  // Sanity check that robot is inside costmap bounds before searching
  unsigned int mx, my;

  ROS_INFO("Inside the FrontierSearch::searchFrom function.");  

  ROS_INFO("mx: %u my: %u", mx ,my);

  if (!costmap_->worldToMap(position.x, position.y, mx, my)) {
    ROS_ERROR("Robot out of costmap bounds, cannot search for frontiers");
    return frontier_list;
  }

Here the variables mx and my are uninitialised. I got the following values for mx and my - mx: 0 my: 3227058176. Do these values make sense or are they garbage values?

map_merger is subscribing to two map topics, but only displaying one

I took a look at the other post on this type of issue, but it does not seem to apply in this case. I pulled the latest version of the Master, but the issue still remains.

I am trying to run map_merger from two bag files using two namespaces, let's say robot1 and robot2. Each bag file (robot1.bag and robot2.bag) contains a map topic under their unique namespace (i.e. /robot1/map). This is our process:

  1. run roscore
  2. set use_sim_time true
  3. run the robot1 bag file with clock "rosbag play robot1.bag --clock"
  4. run the robot2 bag file "rosbag play robot2.bag"
  5. run map_merger "roslaunch multirobot_map_merge map_merge.launch"

When viewing in rviz, the output from map_merger (map_merge/map) appears to be a copy of robot1/map (updating at a slower rate), but does not merge any part of robot2/map. However, map_merger subscribes to both and prints to the terminal that it has identified matches (~15-20).

I'm also having trouble running the provided test files. Is there a document outlining how to run these correctly? Maybe that would help our issue?

Is there any advance in publishing the transform from world to robotX/map?

Hi,

I have been checking your package and I thought that it will be producing the transform between the maps that are published by the robots and the map published by the map_merger. I found that issue where you said that it was in your roadmap. Is there any advance on this feature?
If not, any hint on where you think that the enhancement should be?

Thanks.

  1. What I mean by world -> robotX is transform from world frame to robots map frame. SLAM usually publishes map -> odom transform, your odometry odom -> base_link. map_merge would publish world -> map for each robot (I call here map frame robotX, to distinguish between robots). Maybe I should call that mapX frame to avoid confusion.

  2. Interesting. My experience with GPS was that it is too imprecise for map merging. Sure, it is usable for initially navigating robots towards themselves to create a overlapping space (if you want), but the error is usually too high (esp. in rotation) for creating a usable map. In my experience it was better to use feature-based merging in that scenario.

Originally posted by @hrnr in #12 (comment)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.