morse-simulator/morse

Simulating wind force

tomazela opened this issue · 2 comments

Hi all,

I am working in a simulation where I have a quadcopter which grabs an object, goes to a waypoint and releases it. In order to turning this simulation closer to real word, I am trying to simulate how wind can influence object falling (so wind force would be only applied on object after quad releases it), but I have not been succeed :(
Is there someone who can help me?

Thanks,
Lucas

--
Server

from morse.builder import *

# Dynamic quadrotor
quad = Quadrotor()
quad.translate(x=0, y=0, z=0.5)
quad.add_default_interface('socket')

# Gripper
gripper = Gripper()
gripper.translate(z=-0.2)
gripper.properties(Angle=360.0, Distance=2.0)
quad.append(gripper)

# Waypoint
waypoint = RotorcraftWaypoint()
quad.append(waypoint)

# Wind
wind = ExternalForce()

# Object
cupObject = PassiveObject('props/kitchen_objects', 'Cup_Blue')
cupObject.translate(x=0, y=0, z=0)
cupObject.properties(Object=True)
cupObject.setgraspable()
cupRobot = FakeRobot()
cupObject.append(cupRobot)
poseCup = Pose()
cupRobot.append(poseCup)
cupRobot.append(wind)
cupRobot.add_default_interface('socket')

environment = Environment('land-1/trees')

Client:

from pymorse import Morse

with Morse() as morse:
    # Grabbing object
    morse.quad.gripper.grab()

    # Moving quad to another point
    morse.quad.waypoint.setdest(1.0, 1.0, 4.0, 0.0, 0.1)

    # Setting external force on object
    morse.cupRobot.wind.applyForce([100.0, 0.0, 0.0])

    # Releasing object
    morse.quad.gripper.release()

Obs: I have modified externalForce.py, in order to be able to modify force data. So, 'applyForce' method is like:

    @service
    def applyForce(self, force):
        robot = self.robot_parent.bge_object

        # Setting new forces value
        add_data('force', force, "vec3<float>", "force along x, y, z")	
        
        # Applying force
        robot.applyForce(self.local_data['force'], False)

  • MORSE version: morse 1.4
  • Blender version: Blender 2.79 (sub 0)
  • Python version: Python 2.7.12

as far as I remind, FakeRobot do not have physics, so you cannot apply "force" on it. You need to create an object at least "dynamic" (in Blender terminology).

You could also create your own actuator that makes your PassiveObject move according to the force you set