Giter Club home page Giter Club logo

Comments (26)

varunmurali1 avatar varunmurali1 commented on July 24, 2024

I am not quite sure I understand. If FG is running on aws, you shouldn't need a lot of resources on a local machine since the rendering is happening on aws. We do not specify a minimum requirement for local run, the specified GPU and RAM is the specifications of the machine we used to test and are not a minimum requirement. For local rendering, if you have a GPU with at least ~4 Gb VRAM, I would try the codebase. It might be slow, but since all the reporting is done in sim time this should not be a problem for experimental evaluation.

from flightgoggles.

PHRABAL avatar PHRABAL commented on July 24, 2024

That’s what I originally thought as well. Local machine hw is not important. I installed ROS Desktop in an Ubuntu virtual env on my Mac. Connection to ec2 p3 works. In rqt I see the time running, but no visualization, only a gray grid. Would my local machine at least need some type of GPU to render locally or would a CPU only Ubuntu setup with 16GB RAM be sufficient?

from flightgoggles.

Winter-Guerra avatar Winter-Guerra commented on July 24, 2024

Hi @PHRABAL, I would need some more information to diagnose the issue. What happens if you run the following commands on the AWS server?

  • roslaunch flightgoggles teleopExample.launch # Should have no errors. Keep it running while testing.
  • rostopic hz /uav/camera/left/image_rect_color # should return a framerate.
  • rostopic hz /tf # should be nonzero.

If these commands succeed, then FlightGoggles is rendering correctly in the AWS instance. It would narrow down the issue to some sort of AWS/ROS connection issues. Please send the results of the following commands on your local machine:

  • ROS_MASTER_URI=http://<your-ec2-ip>:11311 rostopic hz /uav/camera/left/image_rect_color
  • ROS_MASTER_URI=http://<your-ec2-ip>:11311 rostopic hz /tf

If the second batch of commands do not work, then your AWS security configs are probably to blame. Or, you could be using the internal AWS IP address that is not accessible to the outside world.

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

Hi @Winter-Guerra. I'm working with @PHRABAL on this same issue. I get framerates from your first set of commands, so looks like flightgoggles is working. I don't get anything from the second set of commands. I also suspect it is related to AWS security groups config. Currently I am allowing all TCP ports in from my IP and all ICMPv4 in from all IPs. However when I try to start the ROS server after setting ROS_MASTER_URI and ROS_IP as follows:

export ROS_MASTER_URI=http://34.xxx.xxx.xxx:11311
export ROS_IP=34.xxx.xxx.xxx

I get this error:

Unable to contact my own server at [http://34.xxx.xxx.xxx:44512/].
This usually means that the network is not configured properly.

A common cause is that the machine cannot ping itself.  Please check
for errors by running:

	ping 34.xxx.xxx.xxx

For more tips, please see

	http://www.ros.org/wiki/ROS/NetworkSetup

The traceback for the exception was written to the log file

ping 34.xxx.xxx.xxx does work to itself. Any ideas? Thanks so much for the help.

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

@Winter-Guerra Here's the results of the commands you asked about:

ubuntu@ip-172-xxx-xxx-xxx:~$ ROS_MASTER_URI=http://34.xxx.xxx.xxx:11311 rostopic hz /uav/camera/left/image_rect_color
subscribed to [/uav/camera/left/image_rect_color]
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages


ubuntu@ip-172-xxx-xxx-xxx:~$ ROS_MASTER_URI=http://34.xxx.xxx.xxx:11311 rostopic hz /tf
subscribed to [/tf]
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages
no new messages

from flightgoggles.

Winter-Guerra avatar Winter-Guerra commented on July 24, 2024

Hi all,

As a reminder, please don't post full IP addresses here. I've edited your comments and removed the IP addresses. Just to be sure, your setup looks like the following?

On AWS:
export ROS_MASTER_URI=http://ec2_public_ip:11311
export ROS_IP=ec2_public_ip

On your local machine:
export ROS_MASTER_URI=http://ec2_public_ip:11311
export ROS_IP=local_machine_public_ip

from flightgoggles.

Winter-Guerra avatar Winter-Guerra commented on July 24, 2024

You may also want to run roswtf on your local and ec2 machines after setting the environmental variables. It might be able to pick up on something that's wrong.

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

Can you provide some guidance on what needs to be open with regards to EC2 security groups? Also, is the local machine expected to have a public IP address, will the server be calling back to it? Most people will have a local IP behind a NAT, or in the case of folks running ubuntu inside a VM on their mac even a double NAT.

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

I've opened up TCP, UDP and ICMP and set the env vars per your guidelines and ROS still doesn't start up.

ubuntu@ip-172-31-61-192:~/.ros/log/cc7a0c12-2e6d-11e9-828d-0642468eebc4$ echo $ROS_MASTER_URI
http://34.xxx.xxx.xxx:11311
ubuntu@ip-172-31-61-192:~/.ros/log/cc7a0c12-2e6d-11e9-828d-0642468eebc4$ echo $ROS_IP
34.xxx.xxx.xxx
ubuntu@ip-172-31-61-192:~/.ros/log/cc7a0c12-2e6d-11e9-828d-0642468eebc4$ roslaunch flightgoggles core.launch
... logging to /home/ubuntu/.ros/log/a4729184-2e6e-11e9-828d-0642468eebc4/roslaunch-ip-172-31-61-192-2680.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:/34.xxx.xxx.xxx:43798/

SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.14
 * /uav/flightgoggles_imu/accelerometer_variance: 0.005
 * /uav/flightgoggles_imu/gyroscope_variance: 0.003
 * /uav/flightgoggles_lpf/gain_p: 35530.5758439
 * /uav/flightgoggles_lpf/gain_q: 266.57297629
 * /uav/flightgoggles_pid/gain_d_pitch: 0.3
 * /uav/flightgoggles_pid/gain_d_roll: 0.3
 * /uav/flightgoggles_pid/gain_d_yaw: 0.3
 * /uav/flightgoggles_pid/gain_i_pitch: 3.0
 * /uav/flightgoggles_pid/gain_i_roll: 3.0
 * /uav/flightgoggles_pid/gain_i_yaw: 3.0
 * /uav/flightgoggles_pid/gain_p_pitch: 9.0
 * /uav/flightgoggles_pid/gain_p_roll: 9.0
 * /uav/flightgoggles_pid/gain_p_yaw: 9.0
 * /uav/flightgoggles_pid/int_bound_pitch: 1000.0
 * /uav/flightgoggles_pid/int_bound_roll: 1000.0
 * /uav/flightgoggles_pid/int_bound_yaw: 1000.0
 * /uav/flightgoggles_uav_dynamics/angular_process_noise: 0.00025
 * /uav/flightgoggles_uav_dynamics/clockscale: 1.0
 * /uav/flightgoggles_uav_dynamics/drag_coefficient: 0.1
 * /uav/flightgoggles_uav_dynamics/ignore_collisions: False
 * /uav/flightgoggles_uav_dynamics/init_pose: [0.0, 0.0, 1.0, 0...
 * /uav/flightgoggles_uav_dynamics/linear_process_noise: 0.0005
 * /uav/flightgoggles_uav_dynamics/max_prop_speed: 2200.0
 * /uav/flightgoggles_uav_dynamics/moment_arm: 0.08
 * /uav/flightgoggles_uav_dynamics/motor_time_constant: 0.02
 * /uav/flightgoggles_uav_dynamics/thrust_coefficient: 1.91e-06
 * /uav/flightgoggles_uav_dynamics/torque_coefficient: 2.6e-07
 * /uav/flightgoggles_uav_dynamics/vehicle_inertia_xx: 0.0049
 * /uav/flightgoggles_uav_dynamics/vehicle_inertia_yy: 0.0049
 * /uav/flightgoggles_uav_dynamics/vehicle_inertia_zz: 0.0049
 * /uav/flightgoggles_uav_dynamics/vehicle_mass: 1.0

NODES
  /uav/
    camera_left_link (tf2_ros/static_transform_publisher)
    flightgogglesRenderer (flightgoggles/FlightGoggles.x86_64)
    flightgoggles_marker_visualizer (flightgoggles_marker_visualizer/flightgoggles_marker_visualizer)
    flightgoggles_ros_bridge (flightgoggles_ros_bridge/ROSClient)
    flightgoggles_uav_dynamics (flightgoggles_uav_dynamics/node)
    rviz (rviz/rviz)
    world_ned_link (tf2_ros/static_transform_publisher)

ERROR: unable to contact ROS master at [http://34.xxx.xxx.xxx:11311]
The traceback for the exception was written to the log file



ubuntu@ip-172-31-61-192:~/.ros/log/cc7a0c12-2e6d-11e9-828d-0642468eebc4$ cat roslaunch-ip-172-31-61-192-2619.log
[roslaunch][INFO] 2019-02-12 02:27:52,872: Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
...
[roslaunch.parent][INFO] 2019-02-12 02:27:52,877: starting roslaunch parent run
[roslaunch][INFO] 2019-02-12 02:27:52,877: loading roscore config file /opt/ros/kinetic/etc/ros/roscore.xml
[roslaunch][INFO] 2019-02-12 02:27:53,421: Added core node of type [rosout/rosout] in namespace [/]
[roslaunch.config][INFO] 2019-02-12 02:27:53,422: loading config file /home/ubuntu/catkin_ws/src/flightgoggles/flightgoggles/launch/core.launch
[roslaunch][INFO] 2019-02-12 02:27:53,455: Added node of type [flightgoggles_uav_dynamics/node] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,456: Added node of type [flightgoggles/FlightGoggles.x86_64] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,456: Added node of type [flightgoggles_ros_bridge/ROSClient] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,456: Added node of type [flightgoggles_marker_visualizer/flightgoggles_marker_visualizer] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,457: Added node of type [rviz/rviz] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,458: Added node of type [tf2_ros/static_transform_publisher] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,458: Added node of type [tf2_ros/static_transform_publisher] in namespace [/uav/]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [flightgoggles_uav_dynamics/node]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [flightgoggles/FlightGoggles.x86_64]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [flightgoggles_ros_bridge/ROSClient]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [flightgoggles_marker_visualizer/flightgoggles_marker_visualizer]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [rviz/rviz]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [tf2_ros/static_transform_publisher]
[roslaunch][INFO] 2019-02-12 02:27:53,458: ... selected machine [] for node of type [tf2_ros/static_transform_publisher]
[roslaunch.pmon][INFO] 2019-02-12 02:27:53,459: start_process_monitor: creating ProcessMonitor
[roslaunch.pmon][INFO] 2019-02-12 02:27:53,459: created process monitor <ProcessMonitor(ProcessMonitor-1, initial daemon)>
[roslaunch.pmon][INFO] 2019-02-12 02:27:53,460: start_process_monitor: ProcessMonitor started
[roslaunch.parent][INFO] 2019-02-12 02:27:53,460: starting parent XML-RPC server
[roslaunch.server][INFO] 2019-02-12 02:27:53,460: starting roslaunch XML-RPC server
[roslaunch.server][INFO] 2019-02-12 02:27:53,460: waiting for roslaunch XML-RPC server to initialize
[xmlrpc][INFO] 2019-02-12 02:27:53,460: XML-RPC server binding to 0.0.0.0:0
[xmlrpc][INFO] 2019-02-12 02:27:53,461: Started XML-RPC server [http://34.xxx.xxx.xxx:33967/]
[xmlrpc][INFO] 2019-02-12 02:27:53,461: xml rpc node: starting XML-RPC server
[roslaunch][INFO] 2019-02-12 02:27:53,472: started roslaunch server http://34.xxx.xxx.xxx:33967/
[roslaunch.parent][INFO] 2019-02-12 02:27:53,472: ... parent XML-RPC server started
[roslaunch][INFO] 2019-02-12 02:27:53,473: master.is_running[http://34.xxx.xxx.xxx:11311]
[roslaunch][ERROR] 2019-02-12 02:27:53,473: ERROR: unable to contact ROS master at [http://34.xxx.xxx.xxx:11311]
[roslaunch][ERROR] 2019-02-12 02:27:53,474: The traceback for the exception was written to the log file
[roslaunch][ERROR] 2019-02-12 02:27:53,474: Traceback (most recent call last):
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/__init__.py", line 306, in main
    p.start()
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/parent.py", line 279, in start
    self.runner.launch()
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/launch.py", line 657, in launch
    self._setup()
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/launch.py", line 632, in _setup
    launched = self._launch_master()
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/launch.py", line 397, in _launch_master
    validate_master_launch(m, self.is_core, self.is_rostest)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/launch.py", line 105, in validate_master_launch
    raise RLException("ERROR: unable to contact ROS master at [%s]"%(m.uri))
RLException: ERROR: unable to contact ROS master at [http:/34.xxx.xxx.xxx:11311]

[rospy.core][INFO] 2019-02-12 02:27:53,474: signal_shutdown [atexit]

from flightgoggles.

Winter-Guerra avatar Winter-Guerra commented on July 24, 2024

I think that there is a rosmaster/roscore already running that is badly configured. roslaunch should say something about autostarting a new rosmaster. Perhaps try rosnode kill -a; killall -9 rosmaster; killall -9 roscore and try again? Also try roswtf because that provides lots of debug data.

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

No, there were no other ps running. Also, interestingly roswtf (love that name BTW) outputs:

ubuntu@ip-172-31-81-64:~$ roswtf
Loaded plugin tf.tfwtf
No package or stack in context
================================================================================
Static checks summary:

Found 1 warning(s).
Warnings are things that may be just fine, but are sometimes at fault

WARNING ROS_IP may be incorrect: ROS_IP [18.xxx.xxx.xxx] does not appear to be a local IP address ['127.0.0.1', '172.31.81.64', '172.17.0.1'].

Found 1 error(s).

ERROR Not all paths in PYTHONPATH [/home/ubuntu/catkin_ws/devel/lib/python3/dist-packages:/opt/ros/kinetic/lib/python2.7/dist-packages:/home/ubuntu/src/cntk/bindings/python] point to a directory:
 * /home/ubuntu/src/cntk/bindings/python

================================================================================

ROS Master does not appear to be running.
Online graph checks will not be run.
ROS_MASTER_URI is [http://18.xxx.xxx.xxx:11311]

Seems like it actually wants an internal IP?

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

Or maybe it's because the external IP doesn't show up in ifconfig on EC2 instances.

ubuntu@ip-172-31-81-64:~$ ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:30:01:d2:0b
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ens3      Link encap:Ethernet  HWaddr 16:f8:3f:bc:41:dc
          inet addr:172.31.81.64  Bcast:172.31.95.255  Mask:255.255.240.0
          inet6 addr: fe80::14f8:3fff:febc:41dc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:1631 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1221 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:196478 (196.4 KB)  TX bytes:187149 (187.1 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:6095 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6095 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:717137 (717.1 KB)  TX bytes:717137 (717.1 KB)

from flightgoggles.

squilter avatar squilter commented on July 24, 2024

@danielnbarbosa the external IP is inet addr: under the ens3 entry

I agree that it probably has to do with the local machine being hidden behind a NAT. Can you try setting up a VPN and reporting back? https://answers.ros.org/question/11045/how-to-set-up-vpn-between-ros-machines/

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

Well, things are looking better after setting up the VPN. I no longer get errors when running roswtf on both client and server. Also these commands now work on the client:

  • rostopic hz /uav/camera/left/image_rect_color
  • rostopic hz /tf

Still not able to get a GUI visualization of the drone when running rqt but this may just be my own ignorance, I'm not familiar with ROS. Is there something I need to do after starting rqt locally?

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

Also FWIW, I see an error: Fixed Frame [map] does not exist when running rviz.

from flightgoggles.

varunmurali1 avatar varunmurali1 commented on July 24, 2024

In rviz, under the displays pane, there is a drop down for fixed frame in the global options. Could you please set that to world instead of map?

from flightgoggles.

Winter-Guerra avatar Winter-Guerra commented on July 24, 2024

@danielnbarbosa you could also run rviz -d "$(rospack find flightgoggles)/rviz/third_person_drone_follower.rviz". That will spawn an rviz window with the correct configs and should start showing an image.

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

@varunmurali1 that fixed the error, but still no image. @Winter-Guerra it's loading the config but still no image. here's what i see after running your command, this is after running roslaunch flightgoggles core.launch on the server:

screen shot 2019-02-12 at 2 47 08 pm
screen shot 2019-02-12 at 2 47 33 pm

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

FWIW, here's the output of roswtf on the client after running rviz -d "$(rospack find flightgoggles)/rviz/third_person_drone_follower.rviz"

Loaded plugin tf.tfwtf
No package or stack in context
================================================================================
Static checks summary:

No errors or warnings
================================================================================
Beginning tests of your ROS graph. These may take awhile...
analyzing graph...
... done analyzing graph
running graph rules...
... done running graph rules
running tf checks, this will take a second...
... tf checks complete

Online checks summary:

Found 3 warning(s).
Warnings are things that may be just fine, but are sometimes at fault

WARNING The following node subscriptions are unconnected:
 * /uav/flightgoggles_uav_dynamics:
   * /uav/input/rateThrust

WARNING The following nodes are unexpectedly connected:
 * /uav/flightgoggles_uav_dynamics->/roswtf_4643_1550011978950 (/tf)
 * /uav/flightgoggles_uav_dynamics->/roswtf_4551_1550011895918 (/tf)

WARNING No tf messages

from flightgoggles.

varunmurali1 avatar varunmurali1 commented on July 24, 2024

What is the output of rostopic hz /uav/camera/left/image_rect_color and rostopic hz /uav/camera/left/ir_beacons? Could you check in rviz while running our config, if the image topic under Image in the displays pane is set to /bounding_box_camera/RGB just to ensure it is pointed to the right topic?

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

@varunmurali1 Those two rostopic commands both keep returning no new messages, which is strange because they were working prior. The image topic is indeed set to /bounding_box_camera/RGB.

from flightgoggles.

Winter-Guerra avatar Winter-Guerra commented on July 24, 2024

Hi @danielnbarbosa, it looks like the dynamics and render engine were waiting for control input before starting. Sorry about that, I've pushed a patch that fixes this issue. Here are some commands that should get you up and running.

On AWS:

export ROS_MASTER_URI=http://ec2_public_ip:11311
export ROS_IP=ec2_public_ip

cd ~/catkin_ws/src
wstool update
roslaunch flightgoggles core.launch

On your local machine:

export ROS_MASTER_URI=http://ec2_public_ip:11311
export ROS_IP=local_machine_public_ip

# Requires that FlightGoggles is also installed locally
cd ~/catkin_ws/src
wstool update
# This will run teleop and rviz
roslaunch flightgoggles teleopAWSFromLocalMachine.launch 

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

That did the trick. Thanks!

screen shot 2019-02-12 at 7 02 08 pm

from flightgoggles.

varunmurali1 avatar varunmurali1 commented on July 24, 2024

@danielnbarbosa glad it now works for you!

from flightgoggles.

danielnbarbosa avatar danielnbarbosa commented on July 24, 2024

Thanks for being so proactive @Winter-Guerra @varunmurali1 @squilter.

from flightgoggles.

mhaboali avatar mhaboali commented on July 24, 2024

Well, things are looking better after setting up the VPN. I no longer get errors when running roswtf on both client and server. Also these commands now work on the client:

  • rostopic hz /uav/camera/left/image_rect_color
  • rostopic hz /tf

Still not able to get a GUI visualization of the drone when running rqt but this may just be my own ignorance, I'm not familiar with ROS. Is there something I need to do after starting rqt locally?

Hi @danielnbarbosa,

Could you explain in some details how did you manage to establish the VPN connection between your robot and the AWS instance? when I followed the steps described here, I managed to see the topics but all topics are empty and I'm completely stuck.

Thanks!

from flightgoggles.

Related Issues (20)

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.