From 51a12dd611247ecd42ff88ac4057c794fe03d8d8 Mon Sep 17 00:00:00 2001 From: Wolfgang Hoenig Date: Wed, 10 Jan 2024 07:38:18 +0100 Subject: [PATCH] sim - backend - add neuralswarm Implements a new simulation backend "neuralswarm", that is based on the existing np backend but uses the NeuralSwarm2 interaction force prediction between UAVs in the system model. --- crazyflie_examples/crazyflie_examples/swap.py | 43 +++++ crazyflie_examples/setup.cfg | 1 + .../backend/data/neuralswarm2/phi_G.pth | Bin 0 -> 17207 bytes .../backend/data/neuralswarm2/phi_L.pth | Bin 0 -> 17399 bytes .../backend/data/neuralswarm2/phi_S.pth | Bin 0 -> 17399 bytes .../backend/data/neuralswarm2/rho_L.pth | Bin 0 -> 19383 bytes .../backend/data/neuralswarm2/rho_S.pth | Bin 0 -> 19383 bytes .../crazyflie_sim/backend/neuralswarm.py | 170 ++++++++++++++++++ crazyflie_sim/crazyflie_sim/backend/np.py | 6 +- 9 files changed, 217 insertions(+), 3 deletions(-) create mode 100644 crazyflie_examples/crazyflie_examples/swap.py create mode 100644 crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_G.pth create mode 100644 crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_L.pth create mode 100644 crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_S.pth create mode 100644 crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/rho_L.pth create mode 100644 crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/rho_S.pth create mode 100644 crazyflie_sim/crazyflie_sim/backend/neuralswarm.py diff --git a/crazyflie_examples/crazyflie_examples/swap.py b/crazyflie_examples/crazyflie_examples/swap.py new file mode 100644 index 000000000..7f2f041fd --- /dev/null +++ b/crazyflie_examples/crazyflie_examples/swap.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +from crazyflie_py import Crazyswarm +import numpy as np + + +def main(): + Id2 = 231 + Id1 = 5 + Pos1 = np.array([0.0, -0.2, 0.0]) + Pos2 = np.array([0.0, 0.2, 0.0]) + Height1 = 0.4 + Height2 = 0.5 + swapTime = 3 + + swarm = Crazyswarm() + timeHelper = swarm.timeHelper + allcfs = swarm.allcfs + + allcfs.takeoff(targetHeight=Height1, duration=3.0) + timeHelper.sleep(3.5) + + # go to initial positions + allcfs.crazyfliesById[Id1].goTo(Pos1 + np.array([0, 0, Height1]), 0, 3.0) + allcfs.crazyfliesById[Id2].goTo(Pos2 + np.array([0, 0, Height2]), 0, 3.0) + timeHelper.sleep(3.5) + + # swap 1 + allcfs.crazyfliesById[Id1].goTo(Pos2 + np.array([0, 0, Height1]), 0, swapTime) + allcfs.crazyfliesById[Id2].goTo(Pos1 + np.array([0, 0, Height2]), 0, swapTime) + timeHelper.sleep(swapTime + 1.5) + + # swap 2 + allcfs.crazyfliesById[Id1].goTo(Pos1 + np.array([0, 0, Height1]), 0, swapTime) + allcfs.crazyfliesById[Id2].goTo(Pos2 + np.array([0, 0, Height2]), 0, swapTime) + timeHelper.sleep(swapTime + 1.5) + + allcfs.land(targetHeight=0.02, duration=3.0) + timeHelper.sleep(3.5) + + +if __name__ == '__main__': + main() diff --git a/crazyflie_examples/setup.cfg b/crazyflie_examples/setup.cfg index b1b614c9e..0c0238812 100644 --- a/crazyflie_examples/setup.cfg +++ b/crazyflie_examples/setup.cfg @@ -7,3 +7,4 @@ console_scripts = multi_trajectory = crazyflie_examples.multi_trajectory:main cmd_full_state = crazyflie_examples.cmd_full_state:main set_param = crazyflie_examples.set_param:main + swap = crazyflie_examples.swap:main diff --git a/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_G.pth b/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_G.pth new file mode 100644 index 0000000000000000000000000000000000000000..855955e0a045a2a6393116682eb0f15ab029c923 GIT binary patch literal 17207 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 literal 0 HcmV?d00001 diff --git a/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_S.pth b/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/phi_S.pth new file mode 100644 index 0000000000000000000000000000000000000000..ba8c848d21cc4fc0952c035c3fc824907d7b8db7 GIT binary patch literal 17399 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 bZ5jLLZ*kGh-9=g?U%%SOi~V~3&u9M+bRv#O literal 0 HcmV?d00001 diff --git a/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/rho_L.pth b/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/rho_L.pth new file mode 100644 index 0000000000000000000000000000000000000000..a22dab4903176d22c32523947e366c9ec32e4750 GIT binary patch literal 19383 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 XaAg=7-&2x2`L`*=C>de?KXd;A?Yat- literal 0 HcmV?d00001 diff --git a/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/rho_S.pth b/crazyflie_sim/crazyflie_sim/backend/data/neuralswarm2/rho_S.pth new file mode 100644 index 0000000000000000000000000000000000000000..2d1bece6e1e0635385121ee1607a6d34be02fdd4 GIT binary patch literal 19383 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 PBUHk(nq9*Dzvuo1`MbaF literal 0 HcmV?d00001 diff --git a/crazyflie_sim/crazyflie_sim/backend/neuralswarm.py b/crazyflie_sim/crazyflie_sim/backend/neuralswarm.py new file mode 100644 index 000000000..d3bea12d6 --- /dev/null +++ b/crazyflie_sim/crazyflie_sim/backend/neuralswarm.py @@ -0,0 +1,170 @@ +""" +This implementes interaction force prediction using NeuralSwarm(2). + +See https://github.com/aerorobotics/neural-swarm + +Logic copied from https://github.com/aerorobotics/neural-swarm/blob/master/planning/robots.py +""" + +from pathlib import Path + +import numpy as np +from rclpy.node import Node +from rclpy.time import Time +from rosgraph_msgs.msg import Clock +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .np import Quadrotor +from ..sim_data_types import Action, State + + +# H is the dimension of the hidden state +class phi_Net(nn.Module): + + def __init__(self, inputdim=6, hiddendim=40): + super(phi_Net, self).__init__() + self.fc1 = nn.Linear(inputdim, 25) + self.fc2 = nn.Linear(25, 40) + self.fc3 = nn.Linear(40, 40) + self.fc4 = nn.Linear(40, hiddendim) + + def forward(self, x): + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = F.relu(self.fc3(x)) + x = self.fc4(x) + return x + + +class rho_Net(nn.Module): + + def __init__(self, hiddendim=40): + super(rho_Net, self).__init__() + self.fc1 = nn.Linear(hiddendim, 40) + self.fc2 = nn.Linear(40, 40) + self.fc3 = nn.Linear(40, 40) + self.fc4 = nn.Linear(40, 1) + + def forward(self, x): + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = F.relu(self.fc3(x)) + x = self.fc4(x) + return x + + +class NeuralSwarm: + + def __init__(self, model_folder): + self.H = 20 + self.rho_L_net = rho_Net(hiddendim=self.H) + self.phi_L_net = phi_Net(inputdim=6, hiddendim=self.H) # x,y,z,vx,vy,vz + self.rho_L_net.load_state_dict(torch.load('{}/rho_L.pth'.format(model_folder))) + self.phi_L_net.load_state_dict(torch.load('{}/phi_L.pth'.format(model_folder))) + self.rho_S_net = rho_Net(hiddendim=self.H) + self.phi_S_net = phi_Net(inputdim=6, hiddendim=self.H) # x,y,z,vx,vy,vz + self.rho_S_net.load_state_dict(torch.load('{}/rho_S.pth'.format(model_folder))) + self.phi_S_net.load_state_dict(torch.load('{}/phi_S.pth'.format(model_folder))) + self.phi_G_net = phi_Net(inputdim=4, hiddendim=self.H) # z,vx,vy,vz + self.phi_G_net.load_state_dict(torch.load('{}/phi_G.pth'.format(model_folder))) + + def compute_Fa(self, data_self, data_neighbors): + rho_input = torch.zeros(self.H) + cftype, x = data_self + for cftype_neighbor, x_neighbor in data_neighbors: + x_12 = torch.zeros(6) + x_12 = (x_neighbor - x).float() + if abs(x_12[0]) < 0.2 and abs(x_12[1]) < 0.2 and abs(x_12[3]) < 1.5: + if cftype_neighbor == 'small' or cftype_neighbor == 'small_powerful_motors': + rho_input += self.phi_S_net(x_12) + elif cftype_neighbor == 'large': + rho_input += self.phi_L_net(x_12) + else: + raise Exception('Unknown cftype!') + + # interaction with the ground + x_12 = torch.zeros(4) + x_12[0] = 0 - x[2] + x_12[1:4] = -x[3:6] + rho_input += self.phi_G_net(x_12) + + if cftype == 'small' or cftype == 'small_powerful_motors': + faz = self.rho_S_net(rho_input) + elif cftype == 'large': + faz = self.rho_L_net(rho_input) + else: + raise Exception('Unknown cftype!') + + return np.array([0, 0, faz[0].item()]) + + +class Backend: + """Backend that is based on the one defined in np.py.""" + + def __init__(self, node: Node, names: list[str], states: list[State]): + self.node = node + self.names = names + self.clock_publisher = node.create_publisher(Clock, 'clock', 10) + self.t = 0 + self.dt = 0.0005 + + self.uavs = [] + for state in states: + uav = Quadrotor(state) + self.uavs.append(uav) + self.neuralswarm = NeuralSwarm(Path(__file__).parent / 'data/neuralswarm2') + + def time(self) -> float: + return self.t + + def step(self, states_desired: list[State], actions: list[Action]) -> list[State]: + # advance the time + self.t += self.dt + + fa_data = [] + for uav in self.uavs: + fa_data.append(('small', torch.hstack( + (torch.tensor(uav.state.pos), torch.tensor(uav.state.vel))))) + + next_states = [] + for k, (uav, action) in enumerate(zip(self.uavs, actions)): + # estimate F_a + # print(k, fa_data[k], fa_data[0:k] + fa_data[k+1:]) + f_a = self.neuralswarm.compute_Fa(fa_data[k], fa_data[0:k] + fa_data[k+1:]) + # convert grams to Newtons + f_a = f_a / 1000 * 9.81 + # print(f_a) + uav.step(action, self.dt, f_a) + next_states.append(uav.state) + + # print(states_desired, actions, next_states) + # publish the current clock + clock_message = Clock() + clock_message.clock = Time(seconds=self.time()).to_msg() + self.clock_publisher.publish(clock_message) + + return next_states + + def shutdown(self): + pass + + +if __name__ == '__main__': + + # test case, see Fig 5g in NeuralSwarm2 paper + ns = NeuralSwarm(Path(__file__).parent / 'data/neuralswarm2') + + # x, y, z, vx, vy, vz + states = torch.tensor([ + [0, 0, 0.6, 0, 0, 0], + [0, -0.1, 0.5, 0, 0, 0], + [0, 0.1, 0.5, 0, 0, 0], + [0, 0, 0.3, 0, 0, 0], + ]) + + print(ns.compute_Fa(('small', states[3]), + [('small', states[0]), + ('small', states[1]), + ('small', states[2])])) diff --git a/crazyflie_sim/crazyflie_sim/backend/np.py b/crazyflie_sim/crazyflie_sim/backend/np.py index 92d35528c..fa3b6c2ef 100644 --- a/crazyflie_sim/crazyflie_sim/backend/np.py +++ b/crazyflie_sim/crazyflie_sim/backend/np.py @@ -81,7 +81,7 @@ def __init__(self, state): self.state = state - def step(self, action, dt): + def step(self, action, dt, f_a=np.zeros(3)): # convert RPM -> Force def rpm_to_force(rpm): @@ -101,10 +101,10 @@ def rpm_to_force(rpm): # dynamics # dot{p} = v pos_next = self.state.pos + self.state.vel * dt - # mv = mg + R f_u + # mv = mg + R f_u + f_a vel_next = self.state.vel + ( np.array([0, 0, -self.g]) + - rowan.rotate(self.state.quat, f_u) / self.mass) * dt + (rowan.rotate(self.state.quat, f_u) + f_a) / self.mass) * dt # dot{R} = R S(w) # to integrate the dynamics, see