# engine: processes the session and issues the seal
pip install pensenova-safety
# verifier (open, Apache-2.0): checks a seal
pip install pensenova-verify
import numpy as np
import pensenova_safety as ps
profile = ps.SafetyProfile.from_limits(
"my_robot",
joint_names=["j0", "j1", "j2"],
lo=np.array([-1.0, -1.0, -1.0]), # min angle per joint (rad)
hi=np.array([ 1.0, 1.0, 1.0]), # max angle per joint (rad)
max_vel=np.array([2.0, 2.0, 2.0]), # max speed per joint (rad/s)
)
02
from pensenova_safety import cloud
env = ps.protect(profile, operator="linha_A") # opens the protected sessionfor step inrange(n_steps):
state = robot.get_state()
cmd = policy(state)
safe, report = env.filter(cmd, state, dt) # the spine decides
robot.send(safe)
env.stop()
submission = cloud.package_session(env, robot_id="my_robot")
seal = cloud.submit_session(submission)
payload = seal["payload"]
print(payload["verdict"]) # APROVADO / REPROVADOprint(payload["seal_id"]) # verify it at verify.html
03
reset()
get_state()
get_observation()
send(cmd)
close()
04
05
from pensenova_verify import verify_seal, fetch_jwks
jwks = fetch_jwks() # fetches Pensenova's public key
ok, reason = verify_seal(seal, jwks)
print("valid"if ok elsef"invalid: {reason}")