GithubHelp home page GithubHelp logo

petoicamp / opencat Goto Github PK

View Code? Open in Web Editor NEW
3.1K 86.0 395.0 30.41 MB

An open source quadruped robot pet framework for developing Boston Dynamics-style four-legged robots that are perfect for STEM, coding & robotics education, IoT robotics applications, AI-enhanced robotics application services, research, and DIY robotics kit development.

Home Page: https://www.petoi.com

License: MIT License

C++ 51.90% C 29.04% Python 19.07%
quadruped walking legged-robot arduino stem simulation quadruped-robot-gaits kit raspberry-pi robotics

opencat's People

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  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

opencat's Issues

Changing the speed of "Walk"

I'm currently working on a project with Bittle. I want to change the speed of walking but haven't found parameters for speed of this action in the skillfile. Does anyone solve this problem before?

Divide by zero

File WriteInstinct/OpenCat.h line 926:
void calibratedPWM(byte i, float angle, float speedRatio = 0) {
All active calls to calibratedPWM() only have 2 arguments, so the default value of speedRatio (0) is used unguarded on line 924:
byte steps = byte(round(abs(duty - duty0) / 1.0/degreeStep/ / speedRatio)); //default speed is 1 degree per step
triggering a divide by zero.

Unable to upload code after bluetooth connection failed

After I tried to upload the new main sketch it failed to connect to bluetooth. Now for some reason I cannot upload anything with the Arduino IDE or desktop apk.

Error from Arduino IDE

Arduino: 1.8.19 (Windows 10), Board: "Arduino Uno"

Sketch uses 24486 bytes (75%) of program storage space. Maximum is 32256 bytes.

Global variables use 1471 bytes (71%) of dynamic memory, leaving 577 bytes for local variables. Maximum is 2048 bytes.

An error occurred while uploading the sketch

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x7d

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x7d

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Application crashes when using MacOS with M1

I'm experiencing issues launching the Petoi Desktop App with a Macbook Pro with M1 CPU.

Launching from the Launchpad I only got this error message:

immagine

Launching from the terminal I got this traceback:

Traceback (most recent call last):
  File "/Applications/Petoi Desktop App.app/Contents/Resources/__boot__.py", line 89, in _recipes_pil_prescript
    import Image
ModuleNotFoundError: No module named 'Image'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Applications/Petoi Desktop App.app/Contents/Resources/__boot__.py", line 135, in <module>
    _recipes_pil_prescript(['DdsImagePlugin', 'FitsStubImagePlugin', 'EpsImagePlugin', 'WmfImagePlugin', 'PdfImagePlugin', 'JpegImagePlugin', 'DcxImagePlugin', 'GbrImagePlugin', 'FpxImagePlugin', 'PalmImagePlugin', 'IptcImagePlugin', 'PsdImagePlugin', 'SunImagePlugin', 'MpegImagePlugin', 'IcoImagePlugin', 'BmpImagePlugin', 'IcnsImagePlugin', 'TgaImagePlugin', 'GifImagePlugin', 'FliImagePlugin', 'Jpeg2KImagePlugin', 'SgiImagePlugin', 'Hdf5StubImagePlugin', 'CurImagePlugin', 'PixarImagePlugin', 'BufrStubImagePlugin', 'XpmImagePlugin', 'MicImagePlugin', 'PngImagePlugin', 'BlpImagePlugin', 'WebPImagePlugin', 'PcdImagePlugin', 'FtexImagePlugin', 'MpoImagePlugin', 'MspImagePlugin', 'ImtImagePlugin', 'PpmImagePlugin', 'SpiderImagePlugin', 'PcxImagePlugin', 'GribStubImagePlugin', 'McIdasImagePlugin', 'XbmImagePlugin', 'ImImagePlugin', 'XVThumbImagePlugin', 'TiffImagePlugin'])
  File "/Applications/Petoi Desktop App.app/Contents/Resources/__boot__.py", line 93, in _recipes_pil_prescript
    from PIL import Image
  File "<frozen zipimport>", line 259, in load_module
  File "PIL/Image.pyc", line 89, in <module>
  File "<frozen zipimport>", line 259, in load_module
  File "PIL/_imaging.pyc", line 14, in <module>
  File "PIL/_imaging.pyc", line 10, in __load
  File "imp.pyc", line 342, in load_dynamic
ImportError: dlopen(/Applications/Petoi Desktop App.app/Contents/Resources/lib/python3.9/lib-dynload/PIL/_imaging.so, 0x0002): Library not loaded: '@rpath/libtiff.5.dylib'
  Referenced from: '/Applications/Petoi Desktop App.app/Contents/Resources/lib/python3.9/lib-dynload/PIL/_imaging.so'
  Reason: tried: '/opt/anaconda3/envs/simpleUI/lib/libtiff.5.dylib' (no such file), '/opt/anaconda3/envs/simpleUI/lib/libtiff.5.dylib' (no such file), '/Applications/Petoi Desktop App.app/Contents/Resources/lib/python3.9/lib-dynload/PIL/../../../libtiff.5.dylib' (no such file), '/opt/anaconda3/envs/simpleUI/lib/libtiff.5.dylib' (no such file), '/opt/anaconda3/envs/simpleUI/lib/libtiff.5.dylib' (no such file), '/Applications/Petoi Desktop App.app/Contents/Resources/lib/python3.9/lib-dynload/PIL/../../../libtiff.5.dylib' (no such file), '/opt/anaconda3/envs/simpleUI/lib/libtiff.5.dylib' (no such file), '/Applications/Petoi Desktop App.app/Contents/Frameworks/libtiff.5.dylib' (no such file), '/Applications/Petoi Desktop App.app/Contents/MacOS/../Frameworks/libtiff.5.dylib' (no such file), '/usr/local/lib/libtiff.5.dylib' (no such file), '/usr/lib/libtiff.5.dylib' (no such file)
2022-08-29 10:16:05.365 Petoi Desktop App[7205:38695] Launch error
2022-08-29 10:16:05.365 Petoi Desktop App[7205:38695] Launch error
See the py2app website for debugging launch issues
exit

I also tried directly from source code cloning this repo and starting pyUI/UI.py after have installed pyserial and pillow packages and the application starts showing the small window with the three buttons but then, when I choose Skill Composer it crashes with a Segmentation fault error when I click on the Behavior or Export buttons.

Is there something I'm missing?

Thanks in advance for the help

very-long-line-length-in-source-file > 512

When I make deb package for this repo, Debian check tool find the some files's line is very long.

I suggest to modify them:

very-long-line-length-in-source-file 9290 > 512 [ModuleTests/ESP8266WiFiController/mainpage.h:7]
very-long-line-length-in-source-file 782 > 512 [README.md:13]
very-long-line-length-in-source-file 602 > 512 [ModuleTests/ESP8266WiFiController/calibrationpage.h:9]

Thanks!

OpenCat.ino Sketch to big to compile

Hi,

downloaded OpenCat.ino. It does not compile. Error is:

Sketch uses 33764 bytes (104%) of program storage space. Maximum is 32256 bytes.
Global variables use 1344 bytes (65%) of dynamic memory, leaving 704 bytes for local variables. Maximum is 2048 bytes.
Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it.

Updated libraries to the latest.

Any idea?

BR Heiko

MU Camera using arduino IDE error

I just got a camera module, when I uncomment // #define CAMERA //for BallTracking using Mu Vision camera I get the following error in Arduino IDE
Arduino: 1.8.19 (Windows 10), Board: "Arduino Uno"
In file included from C:\Users\alexf\Desktop\Petoi Bittle\Bittle OpenCat\OpenCat\src\OpenCat.h:443:0,

             from C:\Users\alexf\Desktop\Petoi Bittle\Bittle OpenCat\OpenCat\OpenCat.ino:81:

C:\Users\alexf\Desktop\Petoi Bittle\Bittle OpenCat\OpenCat\src\reaction.h: In function 'void reaction()':

C:\Users\alexf\Desktop\Petoi Bittle\Bittle OpenCat\OpenCat\src\reaction.h:340:24: error: expected primary-expression before ':' token

   case T_TASK_QUEUE:

                    ^

exit status 1

Error compiling for board Arduino Uno.
I tried using the bug fix recommended by Petoi camp In src/opencat.h, find #define T_TASK_QUEUE, add space and ‘q’ after it.
#define T_TASK_QUEUE ‘q’ did not work either.

Understanding the format of a behavior: trigger axis

The bf behavior is defined as:

const char bf[] PROGMEM = {
-8, 0, 0, 1,
5, 8, 1,
0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, -55, -55, -40, -40, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 30, 30, -20, -20, -55, -55, 60, 60, 0, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 5, 5, 60, 60, 40, 40, 0, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 45, 45, 60, 60, 35, 35, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 45, 45, 60, 60, 30, 30, 0, 0, 1,-10,
0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 110, 110, -55, -55, 100, 100, 0, 3, 0,127,
0, 0, 0, 0, 0, 0, 0, 0, -20, -20, 100, 100, -75, -75, -60, -60, 0, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 127, 127, 0, 0, -70, -70, 0, 3, 0, 0,
};

If I understand correctly, the fifth frame is triggered by a pitch angle of -10 degrees. The sixth frame seems to have the trigger axis set to zero (i.e. no trigger axis) but there is an angle value. It seems that the 127 will never be read because the axis is tested first and you can't trigger on yaw:

OpenCat/OpenCat.ino

Lines 740 to 742 in f1013ce

if (motion.dutyAngles[18 + c * frameSize]) {
int triggerAxis = motion.dutyAngles[18 + c * frameSize];
int triggerAngle = motion.dutyAngles[19 + c * frameSize];

Is this meant to be ignored, or an error, or do I misinterpret the format?

Sketch too big for NyBoard V0_2

When compile with #define MAIN_SKETCH uncomment, the arduino gives:
Sketch uses 31824 bytes (103%) of program storage space. Maximum is 30720 bytes.
Global variables use 1596 bytes (77%) of dynamic memory, leaving 452 bytes for local variables. Maximum is 2048 bytes.
Sketch too big; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing it.
text section exceeds available space in board

Any way can solve this?

WriteInstinct Missing Dependency

Under the WriteInstinct.ino is missing the Adafruit_PWMServoDriver.h file referenced in OpenCat.h. I was able to track down the library this is from but it should either be included or at least documentation on where to get the library would be helpful.

Bittle sometimes doesn't physically respond to Serial commands

Robot: Bittle
Hardware: NyBoard v1.0, RPi Zero 2 W
Software: Ubuntu Server 20.04, Python 3.8

Steps:

  1. Run ardSerial.py
  2. Send kbalance command
  3. Send krest command
  4. Send kbalance command
  5. Send krest command

Expected: all the commands are successfully executed, Bittle performed the requested actions.
Actual: the last krest is executed, but Bittle didn't perform any action.

Check the video to see it in action.

Note that it's not related to krest command only. I observed the same behavior for any command. Everything may work smoothly, and then in a moment, some command is just skipped.

Also note that seems like I'm not alone here. I investigated existing GitHub repos for Bittle and found this one for the gamepad teleop. There's a list of know issues at the end.

Screenshot from 2022-01-14 22-34-37

The second one seems very close to what I'm talking about. And this repo uses pyBittle library as a dependency for Serial communication.

Anyway, it seems like there's a bug. So would be greatly appreciated if you can take a look @borntoleave @JasonWong08.

Thanks,
Sergey

Source code in header files

I am trying to learn how the robot works and I noticed that the source code is in the header files. Would it not be better to have separate .cpp files for the implementation?

Getting IMU data

Hi @borntoleave,

Is it possible to retrieve IMU data from Bittle programmatically? I want to get odometry for SLAM package integration.

Thanks,
Sergey

Nybble - Adding new skill: need to move zero from EEPROM to PROGMEM

Not sure if this is a bug or not, but thought I'd mention and let you decide :)

Last night, while trying to write custom zero skill for Nybble, it didn't seem to work.

The fix was easy: in my local branch, inside InstinctNybble.h:

  1. I moved zero to progmemPointer[] array.
  2. Revised it to "zeroN" in skillNameWithType array.
  3. Re-ran WriteInstinct.ino to update the skills
  4. Ran and uploaded my OpenCat.ino copy.

And to gain a bit more space in Program memory I commented out hs, hs1, hs2 skills.

Now, I can just tweak the zero skill and upload the code... no need to re-run WriteInstinct. But I needed it the first time just to move zero out of EEPROM and into Program memory (if I understand right).

Adding to siri, but not work in siri.

It seemed that when I firts time added opencat to siri it worked well. But recently, it prompts that "chat长时间未响应”, meaning "chat not respond for a long time".

Running the Firmware Uploader on a Raspberry PI does not work

I tried to run the firmware uploader from the UI on a raspberry pi, but it isn't able to connect to the correct port (/dev/ttyS0). The calibrator however works on the raspberry pi. After looking at the code we found that the communication is established differently in the calibrator and in the firmware uploader. In the calibrator, ardSerial is used while in the firmware uploader serial.tools.list_ports is used. Is there a way in which we can use the ardSerial in the firmware uploader? Thanks for the help.

New serial code doesn't work with RPi hat

Hi @borntoleave @JasonWong08,

I noticed a recent update in serial code. Wondering if you have tested it with an RPi hat?

It doesn't work for me. First of all, it incorrectly detects a serial port: /dev/ttyAMA0 is wrong for RPi. There should always be ttyS0.

I updated it manually in code, but serial behavior still seems incorrect to me:

  • Some commands work, the others - not. E.g. I can run ksit, but further kbalance doesn't work or vice versa.
  • NyBoard is always stuck after 1 or 2 commands and requires a reset.
  • Sometimes I see response parsing exceptions for the correct commands, e.g. here when we try to extract a 0-element from empty object.
  • NyBoard is totally unstable: it may beep several times before or after the command's execution but there's no response at all.

Note that I can still control Bittle with IR until the board is stuck on serial.

I can record a video of course. But it's not really helpful when the board is stuck in 1 command and Bittle becomes unresponsive.

Any thoughts or comments on how to make the serial interface stable with an RPi hat would be greatly appreciated.

Hardware / Environment

  • Bittle / NyBoard_V1_0
  • RPi Zero 2W / model A+
  • x64 Ubuntu 20.04

Example code for Task creation

Is there a sample code which integrates the Digital / Analog pins with the base code (OpenCat.ino)

For example,
The robot should be moving forward but should stop when ultrasonic detects an object within certain range. This must be done using Arduino IDE (C++) but as per the source codes, I couldn't find an example for such integration of io pins with per-defined skills.

Is it possible to remote-control precise Bittle gaits?

I've seen examples such as pyBittle of sending pre-programmed gaits to the Bittle via WiFi or Bluetooth. I'm an AI researcher looking to instead send precise velocities and torques to the Bittle for exact joint control. I also need to capture the Bittle's accelerometer and gyroscope data.

Is there example code anywhere for how to achieve both of these goals?

  1. Send precise commands
  2. Receive Bittle metadata

Thanks for any help!

wrong-path-for-interpreter /opt/anaconda3/envs/petoi/bin/python3

Would use /usr/bin/python3 in your *.py ?

/usr/bin/python3 is the default path for python3 in most linux distribution.

E: petoi-opencat: wrong-path-for-interpreter /opt/anaconda3/envs/petoi/bin/python3 != /usr/bin/python3 [usr/share/petoi-opencat/Calibrator.py]
E: petoi-opencat: wrong-path-for-interpreter /opt/anaconda3/envs/petoi/bin/python3 != /usr/bin/python3 [usr/share/petoi-opencat/FirmwareUploader.py]
E: petoi-opencat: wrong-path-for-interpreter /opt/anaconda3/envs/petoi/bin/python3 != /usr/bin/python3 [usr/share/petoi-opencat/RgbLED.py]
E: petoi-opencat: wrong-path-for-interpreter /opt/anaconda3/envs/petoi/bin/python3 != /usr/bin/python3 [usr/share/petoi-opencat/SkillComposer.py]
E: petoi-opencat: wrong-path-for-interpreter /opt/anaconda3/envs/petoi/bin/python3 != /usr/bin/python3 [usr/share/petoi-opencat/UI.py]

pyUI/commonVar.py uses wrong paths for Linux

elif platform.system() == "Linux":    # for Linux
    sys.path.append('/usr/share/petoi-opencat/serialMaster/')
    resourcePath = '/usr/share/petoi-opencat/resources/'
    releasePath = '/usr/share/petoi-opencat/release/'

There's no reason these directories would be subdirectories of /usr/share/petoi-opencat. There's no installation procedure for Linux that would put them there. The Petoi documentation says to run python3 UI.py from a source checkout. There's no make install and there's no package (RPM, Pip, or otherwise).

After uploading the code of OpenCat.ino Robot will not accept any new code.

So I wanted to upload the OpenCat.ino Program for testing, and it worked but after doing so it's Buzzer piped and after that I was not able to upload any new code to the Bittle Bot. Be it over https://ide.tinkergen.com/ or via the Arduino IDE.

So then I tried uploading the factory code explained in the documentation. But this is the error I got:

C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\script\arduino\opencat>"C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\compilers\arduino"\contents\hardware\tools\avr\bin\avrdude -C"C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\compilers\arduino"\contents\hardware\tools\avr\etc\avrdude.conf -v -patmega328p -carduino -P"COM10" -b115200 -D -Uflash:w:"C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\buildTemp\arduino\opencat\grove_.ino.hex":i C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\script\arduino\opencat>del "C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\buildTemp\arduino\opencat\grove_.ino.hex" avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2014 Joerg Wunsch System wide configuration file is "C:\Users\jeapi\AppData\Local\Programs\cc-assistant\resources\compilers\arduino\contents\hardware\tools\avr\etc\avrdude.conf" Using Port : COM10 Using Programmer : arduino Overriding Baud Rate : 115200 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xbd avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xbd avrdude done. Thank you.

Thanks in advance.

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.