<jupyter_start><jupyter_text>Quadruped Walking<jupyter_code>import gtdynamics as gtd
from gtsam import Pose3, Point3
import plotly.express as px
# Load the vision 60 quadruped by Ghost robotics: https://youtu.be/wrBNJKZKg10
robot = gtd.CreateRobotFromFile(gtd.URDF_PATH + "/vision60.urdf");
# Let's print
link_names = [(link.id(), link.name()) for link in robot.links()]
link_names.sort()
print(link_names)
# Figure out which feet are front, back:
for name in ["lower0","lower1","lower2","lower3"]:
    print(name, robot.link(name).wTcom().translation())
mapping = {
    "LH":robot.link("lower1"),
    "LF":robot.link("lower0"),
    "RF":robot.link("lower2"),
    "RH":robot.link("lower3"),
    }
print([(key,link.id()) for key,link in mapping.items()])
# Create walking phases
stationary = gtd.Phase(1)
stationary.addContactPoint("lower0", Point3(1, 1, 1));
print(stationary)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16777041942604856, 'fraction_numerical': 0.024282560706401765, 'mean_word_length': 6.0310077519379846, 'pattern_counts': {'":': 4, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '193587', 'license': 'BSD-2-Clause', 'n_tokens_mistral': 345, 'n_tokens_neox': 332, 'n_words': 70, 'path': 'python/notebooks/quadruped.ipynb', 'repo_name': 'danbarla/GTDynamics', 'size': '906'}