Code Monkey home page Code Monkey logo

vision_locomotion's Introduction

Continual Learning for Locomotion with Cross-Modal Supervision

This repo contains the code associated with the paper Learning Visual Locomotion with Cross-Modal Supervision. For more information, please check the project webpage.

Paper, Video, and Datasets

If you use this code in an academic context, please cite the following publication:

Paper: Learning Visual Locomotion With Cross-Modal Supervision

Video (Narrated): YouTube

@inproceedings{loquercio2023learning,
  title={Learning visual locomotion with cross-modal supervision},
  author={Loquercio, Antonio and Kumar, Ashish and Malik, Jitendra},
  booktitle={2023 IEEE International Conference on Robotics and Automation (ICRA)},
  pages={7295--7302},
  year={2023},
  organization={IEEE}
}

Usage

This code is divided in two parts. The first is for training and running the vision models, which generally runs on a workstation. The second instead runs on the legged robot (Unitree A1). You can use this code also for the Go1 robot, but you might have to change some part of the code to adapt to the new SDK. Note that we don't provide support for problems related to the robot.

Workspace Installation (On a Desktop)

The code was tested with Ubuntu 20.04 and ROS Noetic. Different OS and ROS versions are possible but not supported. In particular, we don't support virtual machines or docker. Use the following commands to create a new catkin workspace and a virtual environment with all the required dependencies. Note that a slightly different version of this will be need to be installed on the Robot.

sudo apt-get install python3-catkin-tools
cd
export ROS_VERSION=noetic
mkdir cms_ws
cd cms_ws
export CATKIN_WS=./catkin_cms
mkdir -p $CATKIN_WS/src
cd $CATKIN_WS
catkin init
catkin config --extend /opt/ros/$ROS_VERSION
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-fdiagnostics-color
cd src

conda create --name cms python=3.8
conda activate cms
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip install rospkg opencv-python vcstool empy scikit-learn matplotlib pandas wandb plotly

You should now export Torch_DIR to be where libtorch is. To find the folder use the following command: find . -type f| grep libtorch, should be a sitepackage under python 3.8. An example of the command you need to run export Torch_DIR=/home/antonio/aa/lib/python3.8/site-packages/torch/. Be sure to adapt it to your path. Now you're ready to build.

cd $CATKIN_WS/src
git clone https://github.com/antonilo/vision_locomotion
mv vision_locomotion agile_locomotion
vcs-import < agile_locomotion/dependencies.yaml

catkin build
source CATKIN_WS/devel/setup.bash

Train a vision predictor

We provide a pre-trained vision module, but the beauty of cross-modal supervision is that you can continuously train a model on the data that your robot collects. We added a small dummy dataset in the "data" folder. However, you should use the data collected from your robot (see this section for seeing how to do so) for training. You can either start from scratch or finetune the model we provide.

Please edit the file train_config.yaml for adapting configs to your case. Configs name should be self-explanatory.

cd cms_ws
source catkin_cms/devel/setup.bash
conda activate cms
cd catkin_cms/src/cms/visual_locomotion/learning
python train.py --config_file=config/train_config.yaml

Workspace installation (Robot)

We now need to install the catkin workspace on the robot. Note that this is a standalone part, and you can run this code without any installation on your desktop or running any vision predictor. However, in this case, the robot will be completely blind. This code was tested on an A1 robot with an Intel Upboard as compute. If you have a different version, you might need some adaptation to the code.

Use the following commands to create a new catkin workspace and a virtual environment with all the required dependencies. ROS should already be installed on the robot. If not, install it first using this guide. You should install the ros-base version of it, since you only need very limited functionalities.

sudo apt-get install python3-catkin-tools
cd
export ROS_VERSION=noetic 
mkdir cms_ws
cd cms_ws
export CATKIN_WS=./catkin_cms
mkdir -p $CATKIN_WS/src
cd $CATKIN_WS
catkin init
catkin config --extend /opt/ros/$ROS_VERSION
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-fdiagnostics-color
cd src

# Consider to global or virtual environment installation if you encouter problems with conda installation. If you don't have a GPU, consider installing only the CPU version. Finally, ofter pytorch is already installed, so you can skip its installation.

conda create --name cms python=3.8
conda activate cms
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip install rospkg opencv-python vcstool empy

You should now export Torch_DIR to be where libtorch is. To find the folder use the following command: find . -type f| grep libtorch, should be a sitepackage under python 3.8. An example of the command you need to run export Torch_DIR=/home/antonio/aa/lib/python3.8/site-packages/torch/. Be sure to adapt it to your path. Now you're ready to build.

cd $CATKIN_WS/src
git clone https://github.com/antonilo/vision_locomotion
mv vision_locomotion agile_locomotion
vcs-import < agile_locomotion/dependencies.yaml

catkin build
source CATKIN_WS/devel/setup.bash

# adding the following to your bash file to automatically source the workspace (optional)

echo 'source /home/unitree/cms_ws/catkin_cms/devel/setup.sh' >> ~/.bashrc

Since the Unitree SDK requires memory locking and high-priority process, which is not usually granted without sudo, add the following lines to /etc/security/limits.conf (reboot the robot afterwards):

unitree soft memlock unlimited
unitree hard memlock unlimited
unitree soft nice eip
unitree hard nice eip 
unitree soft rtprio 99
unitree hard rtprio 99

Running the (blind) policy

Assuming everything worked, you can now launch a blind policy and control the robot with the joystick. You can control the forward speed (only positive) and angular speed (yaw rate) with the left controller. Remember to press L2+B on the robot to put it in sport mode before starting.

Note that this policy can go up and downstairs, but it is blind, so be very careful! It works upstairs for stairs of up 19cm of stairs height, downstairs up to 13cm of step height. When you try a staircase for the first time, hold the robot to be sure it can do it.

To start the policy, connect to the robot and run the following commands in different terminals:

# On terminal 1, run the following to start the policy
roslaunch agile_locomotion cms_ros.launch

# On terminal 2, run the following to start the robot
rostopic pub /agile_locomotion/walk std_msgs/Empty "{}" -1

Collecting data with the blind policy

To collect data, you need to install the realsense package in your workspace. Since this is a ROS1 package, I installed this version, but feel free to upgrade. You can use this mount for mounting the realsense on the robot camera. You might want to tune the camera parameters to your case (for example adding depth images) editing this file.

To start the policy, connect to the robot and run the following commands in different terminals:

# On terminal 1, run the following to start the blind policy
roslaunch agile_locomotion cms_ros.launch

# On terminal 2, run the realsense camera
roslaunch agile_locomotion d435_only.launch

# On terminal 3, run the following to start the robot
rostopic pub /agile_locomotion/walk std_msgs/Empty "{}" -1

Now, while walking, the robot will save multi-modal data in the data folder. Get the data from the robot to your workstation and use the commands from the previous sections to train a visual predictor using your model.

Walk with Vision

The vision model runs on a separate compute with GPU which is connected through WIFI or Ethernet to the robot. The connection happens via ROS. You can follow this tutorial to connect the robot to the workstation. In short, the thing to do is adding these lines on the bashrc of your external compute.

my_ip=$(hostname -i | sed 's/\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/g')
#my_ip=128.32.175.236 # lab
#my_ip=10.0.0.233 # home

#roscore_ip=$my_ip
roscore_ip=192.168.123.161 #wifi intelup is running the roscore
#roscore_ip=192.168.123.12 #wifi rasperry

export ROS_IP=$my_ip
export ROS_HOSTNAME=$my_ip
export ROS_MASTER_URI=http://${roscore_ip}:11311

# allow ssh to launch remote nodes
export ROSLAUNCH_SSH_UNKNOWN=1

## enable connection (necessary if your firewall blocks connection). Note that this can be dangerous :)
alias allow_connections='sudo systemctl stop firewalld.service'

Assuming the connection works, you can run the following command on the external compute to start inference. Please edit the file test_config.yaml for adapting configs to your case. There is a default network you can use, but you should consider finetuning on your own real world data for optimal performance!

cd cms_ws
source catkin_cms/devel/setup.bash
conda activate cms
cd catkin_cms/src/cms/visual_locomotion/learning/nodes
python tester_node.py --config_file ../config/test_config.yaml

Now that the vision predictor is ready, start the robot and walk with it using the following commands!

# On terminal 1, run the following to start the blind policy
roslaunch agile_locomotion cms_ros.launch

# On terminal 2, run the realsense camera
roslaunch realsense2_camera rs_camera.launch

# On terminal 3, run the following to start the robot
rostopic pub /agile_locomotion/walk std_msgs/Empty "{}" -1

Policy Training

In case you would like to train different control policies using reinforcement learning please follow the instructions from this repository.

Trouble-shooting

If you encouter the following error "Lock memory failed", try two things. First, before launching the code, run the su command to enter in superuser mode and then launch again the code. If this does not work check the sdk version that you're using. This project uses version 3.3.1. If you are using another sdk, put the lib files in this folder. Make sure to be able to launch examples with your sdk before using the code in this repository. Some users reported that when using an older version of the SDK (version 3.2), you need to comment out the InitEnvironment() function from the code.

Acknowledgements

We would like to thank Raven Huang for the help with the camera mount. In addition, we would like to thank Zipeng Fu for the helpful discussion on training a locomotion policy. Finally, we would like to thank Noemi Aepli for the help with recording multimedia material during the experiments.

vision_locomotion's People

Contributors

antonilo 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

Watchers

 avatar  avatar

vision_locomotion's Issues

Unitree Legged SDK Version

Hi Antonilo,

Thank you for the impressive work first, and I do really appreciate it! Here I have a question regarding the Unitree Legged SDK version. I noticed that you implement the low level controller with the official library. Actually there're quite different versions for A1. May I know which version you used for the implementation? Many thanks!

Run on go1

hi! @antonilo
i had finished all settings, but i got a error when i try to roslaunch
i had run with roslaunch agile_locomotion cms_ros.launch
but when i want run next command
rostopic pub /agile_locomotion/walk std_msgs/Empty "{}" -1
i got this.:
process[agile_locomotion-1]: started with pid [3849] [ INFO] [1691047835.232579541]: Loading parameters... [ INFO] [1691047835.241519694]: [/agile_locomotion] base_path = /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind [ INFO] [1691047835.244527230]: [/agile_locomotion] vision_path = /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/vision [ INFO] [1691047835.248558267]: [/agile_locomotion] general/policy_id = 1200 [ INFO] [1691047835.251827438]: [/agile_locomotion] general/Kp = 46 [ INFO] [1691047835.256704960]: [/agile_locomotion] general/Kd = 0.8 [ INFO] [1691047835.259685091]: [/agile_locomotion] general/force_threshold = 25 [ INFO] [1691047835.262763905]: [/agile_locomotion] general/hip_joint_angle = 0.45 [ INFO] [1691047835.266439505]: [/agile_locomotion] general/lin_speed = 0 [ INFO] [1691047835.270164803]: [/agile_locomotion] general/max_lin_speed = 0.5 [ INFO] [1691047835.273675256]: [/agile_locomotion] general/ang_speed = 0 [ INFO] [1691047835.278020437]: [/agile_locomotion] general/max_ang_speed = 0.4 [ INFO] [1691047835.281052126]: [/agile_locomotion] general/tsteps = 50 [ INFO] [1691047835.284004734]: [/agile_locomotion] general/init_steps = 0 [ INFO] [1691047835.287700917]: [/agile_locomotion] general/testing = 0 [ INFO] [1691047835.290427720]: [/agile_locomotion] general/log = 0 [ INFO] [1691047835.293465994]: [/agile_locomotion] general/latent_size = 10 [ INFO] [1691047835.297873048]: [/agile_locomotion] general/obDim = 42 [ INFO] [1691047835.301422716]: [/agile_locomotion] visual_pred/n_g1 = 1 [ INFO] [1691047835.304696850]: [/agile_locomotion] visual_pred/using_vision = 1 [ INFO] [1691047835.304771820]: Parameters Loaded [ INFO] [1691047835.371162025]: Ros is Ready UDP Initialized. socketfd: 11 Port: 8080 /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/mlp_1200.pt /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/mean1200.csv /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/var1200.csv Model loaded from /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/mlp_1200.pt read 2170 elements -0.0239535 0.0439375 -0.12916 0.758832 -1.66217 0.0613242 0.842654 -1.70348 -0.0228252 1.0097 -1.61146 0.0425482 0.926225 -1.63034 -0.034175 -0.00407411 -0.0600386 0.0178517 0.00547594 -0.0474542 -0.00861305 0.0663182 -0.0694604 0.0182749 0.0531053 -0.0878771 -0.398974 -0.169958 -0.319639 0.254109 0.00548921 -0.370061 -0.121593 0.459505 -0.31236 0.168439 0.309663 -0.331397 -0.0870205 0.000291746 -0.0870205 0.000291746 -0.0239535 0.0439375 -0.12916 0.758832 -1.66217 0.0613242 0.842654 -1.70348 -0.0228252 1.0097 -1.61146 0.0425482 0.926225 -1.63034 -0.034175 -0.00407411 -0.0600386 0.0178517 0.00547594 -0.0474542 -0.00861305 0.0663182 -0.0694604 0.0182749 0.0531053 -0.0878771 -0.398974 -0.169958 -0.319639 0.254109 0.00548921 -0.370061 -0.121593 0.459505 -0.31236 0.168439 0.309663 -0.331397 -0.0870205 0.000291746 -0.0870205 0.000291746 -0.0239535 0.0439375 -0.12916 0.758832 -1.66217 0.0613242 0.842654 -1.70348 -0.0228252 1.0097 -1.61146 0.0425482 0.926225 -1.63034 -0.034175 -0.00407411 ... read 2170 elements 0.0154548 0.0116776 0.0184138 0.049594 0.0278942 0.0181977 0.0558888 0.0309958 0.0225005 0.0418531 0.0228641 0.0146581 0.0493584 0.0201657 9.36695 9.56942 17.3742 9.20628 8.86184 16.3252 9.10493 8.82635 13.4025 8.22132 10.5601 12.9502 0.155069 0.308698 0.310683 0.15197 0.308596 0.304845 0.177323 0.208968 0.188846 0.141731 0.282548 0.225084 0.0130294 0.0251278 0.0130294 0.0251278 0.0154548 0.0116776 0.0184138 0.049594 0.0278942 0.0181977 0.0558888 0.0309958 0.0225005 0.0418531 0.0228641 0.0146581 0.0493584 0.0201657 9.36695 9.56942 17.3742 9.20628 8.86184 16.3252 9.10493 8.82635 13.4025 8.22132 10.5601 12.9502 0.155069 0.308698 0.310683 0.15197 0.308596 0.304845 0.177323 0.208968 0.188846 0.141731 0.282548 0.225084 0.0130294 0.0251278 0.0130294 0.0251278 0.0154548 0.0116776 0.0184138 0.049594 0.0278942 0.0181977 0.0558888 0.0309958 0.0225005 0.0418531 0.0228641 0.0146581 0.0493584 0.0201657 9.36695 9.56942 ... /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/vision/mlp_1200.pt /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/vision/mean1200.csv /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/vision/var1200.csv Model loaded from /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/vision/mlp_1200.pt read 2170 elements -0.0324568 0.0626056 -0.131 0.758529 -1.62647 0.0651591 0.874964 -1.63657 -0.0282134 0.982228 -1.59791 0.0457578 0.935868 -1.62761 -0.0470667 0.0010261 -0.087897 0.0269814 0.0194737 -0.0693525 -0.0140214 0.0800436 -0.0956743 0.0292944 0.0643533 -0.0960237 -0.418023 -0.208554 -0.306892 0.266959 0.0304787 -0.302846 -0.131643 0.419291 -0.289692 0.190893 0.348675 -0.253107 -0.0678066 0.000747435 -0.0678066 0.000747435 -0.0324568 0.0626056 -0.131 0.758529 -1.62647 0.0651591 0.874964 -1.63657 -0.0282134 0.982228 -1.59791 0.0457578 0.935868 -1.62761 -0.0470667 0.0010261 -0.087897 0.0269814 0.0194737 -0.0693525 -0.0140214 0.0800436 -0.0956743 0.0292944 0.0643533 -0.0960237 -0.418023 -0.208554 -0.306892 0.266959 0.0304787 -0.302846 -0.131643 0.419291 -0.289692 0.190893 0.348675 -0.253107 -0.0678066 0.000747435 -0.0678066 0.000747435 -0.0324568 0.0626056 -0.131 0.758529 -1.62647 0.0651591 0.874964 -1.63657 -0.0282134 0.982228 -1.59791 0.0457578 0.935868 -1.62761 -0.0470667 0.0010261 ... read 2170 elements 0.0190809 0.0259078 0.0207875 0.0494777 0.0357764 0.0196531 0.058697 0.0405954 0.0255469 0.0490561 0.0229684 0.019187 0.0502801 0.0277285 10.2164 10.5676 19.035 9.78872 9.99721 19.3128 10.1362 9.79533 14.7176 9.48268 12.1181 15.7794 0.161398 0.329998 0.339974 0.157455 0.323308 0.340018 0.193207 0.26286 0.202941 0.171694 0.297858 0.294014 0.00741218 0.0200035 0.00741218 0.0200035 0.0190809 0.0259078 0.0207875 0.0494777 0.0357764 0.0196531 0.058697 0.0405954 0.0255469 0.0490561 0.0229684 0.019187 0.0502801 0.0277285 10.2164 10.5676 19.035 9.78872 9.99721 19.3128 10.1362 9.79533 14.7176 9.48268 12.1181 15.7794 0.161398 0.329998 0.339974 0.157455 0.323308 0.340018 0.193207 0.26286 0.202941 0.171694 0.297858 0.294014 0.00741218 0.0200035 0.00741218 0.0200035 0.0190809 0.0259078 0.0207875 0.0494777 0.0357764 0.0196531 0.058697 0.0405954 0.0255469 0.0490561 0.0229684 0.019187 0.0502801 0.0277285 10.2164 10.5676 ... /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/prop_encoder_1200.pt /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/mean1200.csv /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/var1200.csv Model loaded from /home/ubuntu/cms_ws/catkin_cms/src/agile_locomotion/controller/models/blind/prop_encoder_1200.pt read 2170 elements -0.0239535 0.0439375 -0.12916 0.758832 -1.66217 0.0613242 0.842654 -1.70348 -0.0228252 1.0097 -1.61146 0.0425482 0.926225 -1.63034 -0.034175 -0.00407411 -0.0600386 0.0178517 0.00547594 -0.0474542 -0.00861305 0.0663182 -0.0694604 0.0182749 0.0531053 -0.0878771 -0.398974 -0.169958 -0.319639 0.254109 0.00548921 -0.370061 -0.121593 0.459505 -0.31236 0.168439 0.309663 -0.331397 -0.0870205 0.000291746 -0.0870205 0.000291746 -0.0239535 0.0439375 -0.12916 0.758832 -1.66217 0.0613242 0.842654 -1.70348 -0.0228252 1.0097 -1.61146 0.0425482 0.926225 -1.63034 -0.034175 -0.00407411 -0.0600386 0.0178517 0.00547594 -0.0474542 -0.00861305 0.0663182 -0.0694604 0.0182749 0.0531053 -0.0878771 -0.398974 -0.169958 -0.319639 0.254109 0.00548921 -0.370061 -0.121593 0.459505 -0.31236 0.168439 0.309663 -0.331397 -0.0870205 0.000291746 -0.0870205 0.000291746 -0.0239535 0.0439375 -0.12916 0.758832 -1.66217 0.0613242 0.842654 -1.70348 -0.0228252 1.0097 -1.61146 0.0425482 0.926225 -1.63034 -0.034175 -0.00407411 ... read 2170 elements 0.0154548 0.0116776 0.0184138 0.049594 0.0278942 0.0181977 0.0558888 0.0309958 0.0225005 0.0418531 0.0228641 0.0146581 0.0493584 0.0201657 9.36695 9.56942 17.3742 9.20628 8.86184 16.3252 9.10493 8.82635 13.4025 8.22132 10.5601 12.9502 0.155069 0.308698 0.310683 0.15197 0.308596 0.304845 0.177323 0.208968 0.188846 0.141731 0.282548 0.225084 0.0130294 0.0251278 0.0130294 0.0251278 0.0154548 0.0116776 0.0184138 0.049594 0.0278942 0.0181977 0.0558888 0.0309958 0.0225005 0.0418531 0.0228641 0.0146581 0.0493584 0.0201657 9.36695 9.56942 17.3742 9.20628 8.86184 16.3252 9.10493 8.82635 13.4025 8.22132 10.5601 12.9502 0.155069 0.308698 0.310683 0.15197 0.308596 0.304845 0.177323 0.208968 0.188846 0.141731 0.282548 0.225084 0.0130294 0.0251278 0.0130294 0.0251278 0.0154548 0.0116776 0.0184138 0.049594 0.0278942 0.0181977 0.0558888 0.0309958 0.0225005 0.0418531 0.0228641 0.0146581 0.0493584 0.0201657 9.36695 9.56942 ... [ INFO] [1691047839.430245843]: Received startExecutionCallback message! [Loop Start] named: udp_send period: 2(ms) run at cpu: 3 [Loop Start] named: udp_recv period: 2(ms) run at cpu: 3 agile_locomotion: ../nptl/pthread_mutex_lock.c:81: __pthread_mutex_lock: Assertion mutex->__data.__owner == 0' failed. [agile_locomotion-1] process has died [pid 3849, exit code -6, cmd /home/ubuntu/cms_ws/catkin_cms/devel/lib/agile_locomotion/agile_locomotion __name:=agile_locomotion __log:=/home/ubuntu/.ros/log/ac1a1ae2-8feb-11ec-b887-e45f01ce12ec/agile_locomotion-1.log]. log file: /home/ubuntu/.ros/log/ac1a1ae2-8feb-11ec-b887-e45f01ce12ec/agile_locomotion-1*.log all processes on machine have died, roslaunch will exit shutting down processing monitor... ... shutting down processing monitor complete

i guess it caused by memory lock, but i have changed /etc/security/limis.conf
my `/etc/security/limis.conf is here:

ubuntu soft memlock unlimited ubuntu hard memlock unlimited ubuntu soft nice eip ubuntu hard nice eip ubuntu soft rtprio 99 ubuntu hard rtprio 99

Testing on GO1

Hi,

Thank you for sharing the code. I'm currently testing the blind policy on my Unitree Go1 robot, and I made a few modifications to get it up and running. However, I have a couple of questions:

  1. I noticed that I can only remote control the robot to move forward or turn left, but I cannot move it in reverse. Is this normal, or is it an issue of a difference between A1 and Go1?

  2. If I want to retrain the policy on the Go1, could you advise me on the major adaptations I would need to make?

Thank you!

Falling down when deployed in Go1

I tried to retrain the RMA algorithm using go1 urdf, but found that the robot would tend to lean forward or fall over. Do you have any suggestions for this?
The parameter "rl_coeff" is set to 1.
Below are the visual results of the two stages.
Trained 24,000 rounds in the first phase:

6f954b7720ad3b17d1f64b7566288f9e.mp4

Trained 1200 rounds in the second stage:

c50d966779255e6e5c0ae68f60f9954d.mp4

result graph:

teacher
student

By the way, what does the parameter "jt_mean_pos" in "Environment.hpp" mean? Will this affect go1's training?
And why do the hip joints of robots trained by the RMA algorithm tend to expand? This seems to make the gait appear unnatural.

Hi @D-jojo

          Hi @D-jojo 

As it is written in the readme, you need to follow these steps to avoid memory locking:

Since the Unitree SDK requires memory locking and high-priority process, which is not usually granted without sudo, add the following lines to /etc/security/limits.conf (reboot the robot afterwards):

unitree soft memlock unlimited
unitree hard memlock unlimited
unitree soft nice eip
unitree hard nice eip 
unitree soft rtprio 99
unitree hard rtprio 99

If that does not work for you, do these steps

su
source /PATH/TO/WORKSPACE/devel/setup.sh
roslaunch agile_locomotion cms_ros.launch

Originally posted by @antonilo in #2 (comment)

deploy in A1

Hi,
Thank you very much for sharing the code. I want to deploy the policy to the A1 robot now, but I have encountered a problem. After running the following two commands:
roslaunch agile_locomotion cms_ros.launch
rostopic pub /agile_locomotion/walk std_msgs/Empty "{}" -1
I encountered an error as follows:lock memory failed.
What's going on here? I look forward to your reply.
Thank you again!

catkin build error

hello! antonilo, amazing work for this repo!
but when i try to catkin build in my laptop, an error occur...
rrors << agile_locomotion:make /home/ubuntu/cms_ws/catkin_cms/logs/agile_locomotion/build.make.013.log /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::loadParameters()':
agile_locomotion.cpp:(.text+0x751): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)' /usr/bin/ld: agile_locomotion.cpp:(.text+0x852): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::lessstd::string, std::allocator<std::pair<std::string const, std::string> > > const&)'
/usr/bin/ld: agile_locomotion.cpp:(.text+0x913): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)' /usr/bin/ld: agile_locomotion.cpp:(.text+0x9d4): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::lessstd::string, std::allocator<std::pair<std::string const, std::string> > > const&)'
/usr/bin/ld: agile_locomotion.cpp:(.text+0xa95): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)' /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o:agile_locomotion.cpp:(.text+0xb56): more undefined references to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::lessstd::string, std::allocator<std::pair<std::string const, std::string> > > const&)' follow
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::loadParameters()': agile_locomotion.cpp:(.text+0x172a): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text+0x195c): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text+0x19ce): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::lessstd::string, std::allocator<std::pair<std::string const, std::string> > > const&)'
/usr/bin/ld: agile_locomotion.cpp:(.text+0x1a76): undefined reference to ros::NodeHandle::getParam(std::string const&, std::string&) const' /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::AgileLocomotion(ros::NodeHandle const&, ros::NodeHandle const&)':
agile_locomotion.cpp:(.text+0x37da): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text+0x3863): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text+0x38e8): undefined reference to ros::this_node::getName()' /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::updateState()':
agile_locomotion.cpp:(.text+0x4d56): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::startWalking()':
agile_locomotion.cpp:(.text+0x6377): undefined reference to logging::Logging::createDirectories(std::string, std::string*)' /usr/bin/ld: agile_locomotion.cpp:(.text+0x63bd): undefined reference to logging::Logging::newLog(std::string const&)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::startExecutionCallback(boost::shared_ptr<std_msgs::Empty_<std::allocator<void> > const> const&)': agile_locomotion.cpp:(.text+0x6864): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function void ros::Publisher::publish<visualoco_msgs::Proprioception_<std::allocator<void> > >(visualoco_msgs::Proprioception_<std::allocator<void> > const&) const': agile_locomotion.cpp:(.text._ZNK3ros9Publisher7publishIN14visualoco_msgs15Proprioception_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN14visualoco_msgs15Proprioception_ISaIvEEEEEvRKT_]+0x2e1): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function bool quadrotor_common::getParam<std::string>(std::string const&, std::string&, ros::NodeHandle const&)': agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE]+0x3e): undefined reference to ros::NodeHandle::getParam(std::string const&, std::string&) const'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE]+0x13e): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE]+0x1f5): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE]+0x265): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamISsEEbRKSsRT_RKN3ros10NodeHandleE]+0x37b): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits, std::allocator > const&, char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function bool quadrotor_common::getParam<float>(std::string const&, float&, ros::NodeHandle const&)': agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE]+0x3e): undefined reference to ros::NodeHandle::getParam(std::string const&, float&) const'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE]+0x140): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE]+0x1f5): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE]+0x265): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIfEEbRKSsRT_RKN3ros10NodeHandleE]+0x37b): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits, std::allocator > const&, char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function bool quadrotor_common::getParam<double>(std::string const&, double&, double const&, ros::NodeHandle const&)': agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x3d): undefined reference to ros::NodeHandle::getParam(std::string const&, double&) const'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x12c): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x1e5): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x255): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIdEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x36e): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits, std::allocator > const&, char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function bool quadrotor_common::getParam<int>(std::string const&, int&, int const&, ros::NodeHandle const&)': agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x3d): undefined reference to ros::NodeHandle::getParam(std::string const&, int&) const'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x12a): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x1e5): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x255): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIiEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x36c): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits, std::allocator > const&, char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function bool quadrotor_common::getParam<bool>(std::string const&, bool&, bool const&, ros::NodeHandle const&)': agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x3d): undefined reference to ros::NodeHandle::getParam(std::string const&, bool&) const'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x12b): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x1e5): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x255): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' /usr/bin/ld: agile_locomotion.cpp:(.text._ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE[_ZN16quadrotor_common8getParamIbEEbRKSsRT_RKS3_RKN3ros10NodeHandleE]+0x372): undefined reference to ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits, std::allocator > const&, char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function ros::SubscriptionCallbackHelperT<boost::shared_ptr<std_msgs::Empty_<std::allocator<void> > const> const&, void>::deserialize(ros::SubscriptionCallbackHelperDeserializeParams const&)': agile_locomotion.cpp:(.text._ZN3ros27SubscriptionCallbackHelperTIRKN5boost10shared_ptrIKN8std_msgs6Empty_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE[_ZN3ros27SubscriptionCallbackHelperTIRKN5boost10shared_ptrIKN8std_msgs6Empty_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE]+0x1e4): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
/usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function agile_locomotion::AgileLocomotion::AgileLocomotion()': agile_locomotion.cpp:(.text._ZN16agile_locomotion15AgileLocomotionC2Ev[_ZN16agile_locomotion15AgileLocomotionC5Ev]+0x84): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::lessstd::string, std::allocator<std::pair<std::string const, std::string> > > const&)'
/usr/bin/ld: agile_locomotion.cpp:(.text._ZN16agile_locomotion15AgileLocomotionC2Ev[ZN16agile_locomotion15AgileLocomotionC5Ev]+0xd6): undefined reference to ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)' /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function main':
agile_locomotion.cpp:(.text.startup+0x4f): undefined reference to ros::init(int&, char**, std::string const&, unsigned int)' /usr/bin/ld: CMakeFiles/agile_locomotion.dir/src/agile_locomotion.cpp.o: in function ros::SubscriptionCallbackHelperT<boost::shared_ptr<visualoco_msgs::VisuaLatent
<std::allocator > const> const&, void>::deserialize(ros::SubscriptionCallbackHelperDeserializeParams const&)':
agile_locomotion.cpp:(.text._ZN3ros27SubscriptionCallbackHelperTIRKN5boost10shared_ptrIKN14visualoco_msgs12VisuaLatent_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE[_ZN3ros27SubscriptionCallbackHelperTIRKN5boost10shared_ptrIKN14visualoco_msgs12VisuaLatent_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE]+0x44c): undefined reference to ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/agile_locomotion.dir/build.make:423: /home/ubuntu/cms_ws/catkin_cms/devel/lib/agile_locomotion/agile_locomotion] Error 1 make[1]: *** [CMakeFiles/Makefile2:320: CMakeFiles/agile_locomotion.dir/all] Error 2 make: *** [Makefile:141: all] Error 2

i guess it can not find ros package...but i am rookie for use catkin_simple, i just know a little knowledge in catkin_make...

i tried find_package(catkin_simple REQUIRED COMPONENTS roscpp std_msg...) and test add find_package(catkin REQUIRED COMPONENTS roscpp std_msg...) in controller/CMakeLists.txt, but not work, and i also use message("catkin_LIBRARIES: ${catkin_LIBRARIES}") print catkin_LIBRARIES, but $catkin_LIBRARIES is none!
so could you help me? thanks a lot!

Lock memory failed

@antonilo @ashish-kmr
Hi,
Thank you for sharing the code. However, I encountered a problem when deploying and would like to ask for your advice. The error message is “lock memory failed”, I have added the permissions as you said, and also tried “sudo su”, but it still doesn’t work. I traced it back to line 311 in “src/agile_locomotion/controller/src/agile_locomotion.cpp” where “InitEnvironment();” is called.

  1. However, I can only trace back to “quadruped.h” and can’t find the definition of “InitEnvironment()”. Do you have it?
  2. I suspect it may be a version issue with “Unitree_legged_sdk”. May I ask which version you’re using?

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.