Vehicle script stops after about 5 secs

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Vehicle script stops after about 5 secs

Marco Otte
Hi everyone,
 
I've got a simple car (works fine in SL).
I've created a small LSL script (see below) that listens to channel 9 for information about speed and direction. The script inputs this into the standard physics commands to move and turn the car.
Because I want outside (of OpenSIM) control of the car, I've created a small C# program that simply types the speed and direction into the chat box (/9 speed_direction). This because a HTTPrequest from LSL is limited to about 1 call per second and that is too slow.
The whole setup seems to work. The car moves and turns smoothly, BUT after about 5 secs (give or take) moving the script stops responding and the vehicle stops. After StandUp-Sit it resumes for another 5 secs.
If the vehicle does not move, the script keeps running.

----- script -----
//This car uses a C# program that send keypresses containing the speed and direction.
//A Listen() event picks up these numbers and pushes these into the VEHICLE
string sit_message = "Ride"; //Sit message
string not_owner_message = "You are not the owner of this vehicle ..."; //Not owner message
key requestid; //Used for the HTTPREQUEST
float SpeedSet = 0; //Translated speed from bike speed
float TurnRatioSet = 0; //Calculated turn adjustment
integer TurnLeftThreshold = 1070; //Upper bound for straight ahead from bike
integer TurnRightThreshold = 1050; //Lower bound for straight ahead from bike
integer TurnLeftMax = 1243; //Maximum value from bike at full left steering
integer TurnRightMin = 809; //Minimum value from bike at full right steering
integer Handle = 0;

default
{
    state_entry()
    {
        llSetSitText(sit_message);
        llSitTarget(<0.2,0.2,0.5>, ZERO_ROTATION ); // forward-back,left-right,updown, ZERO_ROTATION
        
        llSetCameraEyeOffset(<-0.2, 0.0, 1.0>);
        llSetCameraAtOffset(<5.0, 0.0, 0.0>);
        
        //car
        llSetVehicleType(VEHICLE_TYPE_CAR);

        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.8);//0.8
        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);//0.1
        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.1);//1.0 Lower is more responsive
        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.1);//0.2
        llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <20.0, 20.0, 10.0>);//1000,2,1000

        llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);//0.2 - not much difference on its own
        llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);//0.1
        llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);//0.1 Low is better, less after turning
        llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1);//0.5
        llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <20.0, 20.0, 20.0>);//20,20,1000

        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.10);//0.5
        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.50);//0.5
    }
    
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key agent = llAvatarOnSitTarget();
            if (llKey2Name(agent) == "Blithe Crosswater")
            {
                if (agent != llGetOwner())
                {
                    llSay(0, not_owner_message);
                    llUnSit(agent);
                    llPushObject(agent, <0,0,50>, ZERO_VECTOR, FALSE);
                }
                else
                {
                    llListenRemove(Handle);
                    llSetStatus(STATUS_PHYSICS, TRUE);
                    llSleep(.1);
                    llListen(9,"","","");
                    requestid = llHTTPRequest("
<A href='http://127.0.0.1:8002/?1",[HTTP_METHOD,"GET"],"");'>http://127.0.0.1:8002/?1",[HTTP_METHOD,"GET"],""); [<A href='http://127.0.0.1:8002/?1",[HTTP_METHOD,"GET"],"");' target=_blank>^] //This is to start the C# program inputting Speed and Direction
                    llSleep(.4);
                }
            }
            else
            {
                llListenRemove(Handle);
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSleep(.4);
                llTargetOmega(<0,0,0>,PI,0);
                requestid = llHTTPRequest("
<A href='http://127.0.0.1:8002/?0",[HTTP_METHOD,"GET"],"");'>http://127.0.0.1:8002/?0",[HTTP_METHOD,"GET"],""); [<A href='http://127.0.0.1:8002/?0",[HTTP_METHOD,"GET"],"");' target=_blank>^] //Stops the C# program
                llResetScript();
            }
        }
        
    }

    http_response(key request_id, integer status, list metadata, string body)
    {
        //Catch the response of the C# program, a dummy method
    }

    listen(integer chan, string name, key id, string message)
    {
        //llSay(0,message);
        integer Separator = llSubStringIndex(message,"-");
        float speed = llGetSubString(message, 0, Separator - 1); //Extract speed
        float direction = llGetSubString(message, Separator + 1, llStringLength(message)); //Extract DIRECTION
        
            SpeedSet = (30 * speed) / 7000; //Transform to [0-30] range
        
            if (direction > TurnRightThreshold && direction < TurnLeftThreshold) //Is steering in the middle?
            {
                //Straight ahead
                TurnRatioSet = 0;
            }
            if (direction > TurnLeftThreshold) //Steering left?
            {
                //Set steering in VR to [0-1.65]
                TurnRatioSet = (direction - TurnLeftThreshold) / ((TurnLeftMax - TurnLeftThreshold)/1.65);
            }
            if (direction < TurnRightThreshold) //Steering right?
            {
                TurnRatioSet = (TurnRightThreshold - direction) / ((TurnRightThreshold - TurnRightMin)/1.65);
            }
            
            if(SpeedSet < 0.5) {TurnRatioSet = 0;} //Low speed then no steering
            
            vector angular_motor; //use vector

            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <SpeedSet,0,0>); //Set speed
            
            if (direction > TurnLeftThreshold) //If left
            {
                angular_motor.z += TurnRatioSet; //then increase rotation angle
            }
            if (direction < TurnRightThreshold) //If right
            {
                angular_motor.z -= TurnRatioSet; //decrease rotation angle
            }

            //llSay(0,(string)SpeedSet + " --- " + (string)angular_motor.z); //Diagnostic

            llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor); //Set rotation
    }

---- end script ---
 
With kind regards, 

Marco Otte
CAMeRA @ VU University Amsterdam
De Boelelaan 1081
1081 HV  AMSTERDAM
Netherlands

Visiting address: 
Metropolitan Building
Buitenveldertselaan 3
1082 VA Amsterdam (room Z539)
T +31 (0)20 598 6807
M +31 (0)6 46025037
E [hidden email] 


_______________________________________________
Opensim-users mailing list
[hidden email]
https://lists.berlios.de/mailman/listinfo/opensim-users
Reply | Threaded
Open this post in threaded view
|

Re: Vehicle script stops after about 5 secs

M.E. Verhagen
could it be the sleep function ?

2009/12/8 Marco Otte <[hidden email]>
Hi everyone,
 
I've got a simple car (works fine in SL).
I've created a small LSL script (see below) that listens to channel 9 for information about speed and direction. The script inputs this into the standard physics commands to move and turn the car.
Because I want outside (of OpenSIM) control of the car, I've created a small C# program that simply types the speed and direction into the chat box (/9 speed_direction). This because a HTTPrequest from LSL is limited to about 1 call per second and that is too slow.
The whole setup seems to work. The car moves and turns smoothly, BUT after about 5 secs (give or take) moving the script stops responding and the vehicle stops. After StandUp-Sit it resumes for another 5 secs.
If the vehicle does not move, the script keeps running.

----- script -----
//This car uses a C# program that send keypresses containing the speed and direction.
//A Listen() event picks up these numbers and pushes these into the VEHICLE
string sit_message = "Ride"; //Sit message
string not_owner_message = "You are not the owner of this vehicle ..."; //Not owner message
key requestid; //Used for the HTTPREQUEST
float SpeedSet = 0; //Translated speed from bike speed
float TurnRatioSet = 0; //Calculated turn adjustment
integer TurnLeftThreshold = 1070; //Upper bound for straight ahead from bike
integer TurnRightThreshold = 1050; //Lower bound for straight ahead from bike
integer TurnLeftMax = 1243; //Maximum value from bike at full left steering
integer TurnRightMin = 809; //Minimum value from bike at full right steering
integer Handle = 0;

default
{
    state_entry()
    {
        llSetSitText(sit_message);
        llSitTarget(<0.2,0.2,0.5>, ZERO_ROTATION ); // forward-back,left-right,updown, ZERO_ROTATION
        
        llSetCameraEyeOffset(<-0.2, 0.0, 1.0>);
        llSetCameraAtOffset(<5.0, 0.0, 0.0>);
        
        //car
        llSetVehicleType(VEHICLE_TYPE_CAR);

        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.8);//0.8
        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);//0.1
        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.1);//1.0 Lower is more responsive
        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.1);//0.2
        llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <20.0, 20.0, 10.0>);//1000,2,1000

        llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);//0.2 - not much difference on its own
        llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);//0.1
        llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);//0.1 Low is better, less after turning
        llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1);//0.5
        llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <20.0, 20.0, 20.0>);//20,20,1000

        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.10);//0.5
        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.50);//0.5
    }
    
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key agent = llAvatarOnSitTarget();
            if (llKey2Name(agent) == "Blithe Crosswater")
            {
                if (agent != llGetOwner())
                {
                    llSay(0, not_owner_message);
                    llUnSit(agent);
                    llPushObject(agent, <0,0,50>, ZERO_VECTOR, FALSE);
                }
                else
                {
                    llListenRemove(Handle);
                    llSetStatus(STATUS_PHYSICS, TRUE);
                    llSleep(.1);
                    llListen(9,"","","");
                    requestid = llHTTPRequest("
http://127.0.0.1:8002/?1",[HTTP_METHOD,"GET"],""); [^] //This is to start the C# program inputting Speed and Direction
                    llSleep(.4);
                }
            }
            else
            {
                llListenRemove(Handle);
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSleep(.4);
                llTargetOmega(<0,0,0>,PI,0);
                requestid = llHTTPRequest("
http://127.0.0.1:8002/?0",[HTTP_METHOD,"GET"],""); [^] //Stops the C# program
                llResetScript();
            }
        }
        
    }

    http_response(key request_id, integer status, list metadata, string body)
    {
        //Catch the response of the C# program, a dummy method
    }

    listen(integer chan, string name, key id, string message)
    {
        //llSay(0,message);
        integer Separator = llSubStringIndex(message,"-");
        float speed = llGetSubString(message, 0, Separator - 1); //Extract speed
        float direction = llGetSubString(message, Separator + 1, llStringLength(message)); //Extract DIRECTION
        
            SpeedSet = (30 * speed) / 7000; //Transform to [0-30] range
        
            if (direction > TurnRightThreshold && direction < TurnLeftThreshold) //Is steering in the middle?
            {
                //Straight ahead
                TurnRatioSet = 0;
            }
            if (direction > TurnLeftThreshold) //Steering left?
            {
                //Set steering in VR to [0-1.65]
                TurnRatioSet = (direction - TurnLeftThreshold) / ((TurnLeftMax - TurnLeftThreshold)/1.65);
            }
            if (direction < TurnRightThreshold) //Steering right?
            {
                TurnRatioSet = (TurnRightThreshold - direction) / ((TurnRightThreshold - TurnRightMin)/1.65);
            }
            
            if(SpeedSet < 0.5) {TurnRatioSet = 0;} //Low speed then no steering
            
            vector angular_motor; //use vector

            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <SpeedSet,0,0>); //Set speed
            
            if (direction > TurnLeftThreshold) //If left
            {
                angular_motor.z += TurnRatioSet; //then increase rotation angle
            }
            if (direction < TurnRightThreshold) //If right
            {
                angular_motor.z -= TurnRatioSet; //decrease rotation angle
            }

            //llSay(0,(string)SpeedSet + " --- " + (string)angular_motor.z); //Diagnostic

            llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor); //Set rotation
    }

---- end script ---
 
With kind regards, 

Marco Otte
CAMeRA @ VU University Amsterdam
De Boelelaan 1081
1081 HV  AMSTERDAM
Netherlands

Visiting address: 
Metropolitan Building
Buitenveldertselaan 3
1082 VA Amsterdam (room Z539)
T +31 (0)20 598 6807
M +31 (0)6 46025037
E [hidden email] 


_______________________________________________
Opensim-users mailing list
[hidden email]
https://lists.berlios.de/mailman/listinfo/opensim-users



_______________________________________________
Opensim-users mailing list
[hidden email]
https://lists.berlios.de/mailman/listinfo/opensim-users
Reply | Threaded
Open this post in threaded view
|

Re: Vehicle script stops after about 5 secs

Marco Otte
Hi Marcel,
 
Mm, the Sleep is only called when the avatar takes place in the vehicle not otherwise.
So before any movement over the vehicle the code that contains the Sleep commands has already been executed.
And of course you would expect the script to continue after a small delay and that does not happen.
 
Thx,
 
Marco

 


From: [hidden email] on behalf of marcel verhagen
Sent: Wed 9-12-2009 12:25
To: [hidden email]
Subject: Re: [Opensim-users] Vehicle script stops after about 5 secs

could it be the sleep function ?

2009/12/8 Marco Otte <[hidden email]>
Hi everyone,
 
I've got a simple car (works fine in SL).
I've created a small LSL script (see below) that listens to channel 9 for information about speed and direction. The script inputs this into the standard physics commands to move and turn the car.
Because I want outside (of OpenSIM) control of the car, I've created a small C# program that simply types the speed and direction into the chat box (/9 speed_direction). This because a HTTPrequest from LSL is limited to about 1 call per second and that is too slow.
The whole setup seems to work. The car moves and turns smoothly, BUT after about 5 secs (give or take) moving the script stops responding and the vehicle stops. After StandUp-Sit it resumes for another 5 secs.
If the vehicle does not move, the script keeps running.

----- script -----
//This car uses a C# program that send keypresses containing the speed and direction.
//A Listen() event picks up these numbers and pushes these into the VEHICLE
string sit_message = "Ride"; //Sit message
string not_owner_message = "You are not the owner of this vehicle ..."; //Not owner message
key requestid; //Used for the HTTPREQUEST
float SpeedSet = 0; //Translated speed from bike speed
float TurnRatioSet = 0; //Calculated turn adjustment
integer TurnLeftThreshold = 1070; //Upper bound for straight ahead from bike
integer TurnRightThreshold = 1050; //Lower bound for straight ahead from bike
integer TurnLeftMax = 1243; //Maximum value from bike at full left steering
integer TurnRightMin = 809; //Minimum value from bike at full right steering
integer Handle = 0;

default
{
    state_entry()
    {
        llSetSitText(sit_message);
        llSitTarget(<0.2,0.2,0.5>, ZERO_ROTATION ); // forward-back,left-right,updown, ZERO_ROTATION
        
        llSetCameraEyeOffset(<-0.2, 0.0, 1.0>);
        llSetCameraAtOffset(<5.0, 0.0, 0.0>);
        
        //car
        llSetVehicleType(VEHICLE_TYPE_CAR);

        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.8);//0.8
        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);//0.1
        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.1);//1.0 Lower is more responsive
        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.1);//0.2
        llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <20.0, 20.0, 10.0>);//1000,2,1000

        llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);//0.2 - not much difference on its own
        llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);//0.1
        llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);//0.1 Low is better, less after turning
        llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1);//0.5
        llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <20.0, 20.0, 20.0>);//20,20,1000

        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.10);//0.5
        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.50);//0.5
    }
    
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key agent = llAvatarOnSitTarget();
            if (llKey2Name(agent) == "Blithe Crosswater")
            {
                if (agent != llGetOwner())
                {
                    llSay(0, not_owner_message);
                    llUnSit(agent);
                    llPushObject(agent, <0,0,50>, ZERO_VECTOR, FALSE);
                }
                else
                {
                    llListenRemove(Handle);
                    llSetStatus(STATUS_PHYSICS, TRUE);
                    llSleep(.1);
                    llListen(9,"","","");
                    requestid = llHTTPRequest("
http://127.0.0.1:8002/?1",[HTTP_METHOD,"GET"],""); [^] //This is to start the C# program inputting Speed and Direction
                    llSleep(.4);
                }
            }
            else
            {
                llListenRemove(Handle);
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSleep(.4);
                llTargetOmega(<0,0,0>,PI,0);
                requestid = llHTTPRequest("
http://127.0.0.1:8002/?0",[HTTP_METHOD,"GET"],""); [^] //Stops the C# program
                llResetScript();
            }
        }
        
    }

    http_response(key request_id, integer status, list metadata, string body)
    {
        //Catch the response of the C# program, a dummy method
    }

    listen(integer chan, string name, key id, string message)
    {
        //llSay(0,message);
        integer Separator = llSubStringIndex(message,"-");
        float speed = llGetSubString(message, 0, Separator - 1); //Extract speed
        float direction = llGetSubString(message, Separator + 1, llStringLength(message)); //Extract DIRECTION
        
            SpeedSet = (30 * speed) / 7000; //Transform to [0-30] range
        
            if (direction > TurnRightThreshold && direction < TurnLeftThreshold) //Is steering in the middle?
            {
                //Straight ahead
                TurnRatioSet = 0;
            }
            if (direction > TurnLeftThreshold) //Steering left?
            {
                //Set steering in VR to [0-1.65]
                TurnRatioSet = (direction - TurnLeftThreshold) / ((TurnLeftMax - TurnLeftThreshold)/1.65);
            }
            if (direction < TurnRightThreshold) //Steering right?
            {
                TurnRatioSet = (TurnRightThreshold - direction) / ((TurnRightThreshold - TurnRightMin)/1.65);
            }
            
            if(SpeedSet < 0.5) {TurnRatioSet = 0;} //Low speed then no steering
            
            vector angular_motor; //use vector

            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <SpeedSet,0,0>); //Set speed
            
            if (direction > TurnLeftThreshold) //If left
            {
                angular_motor.z += TurnRatioSet; //then increase rotation angle
            }
            if (direction < TurnRightThreshold) //If right
            {
                angular_motor.z -= TurnRatioSet; //decrease rotation angle
            }

            //llSay(0,(string)SpeedSet + " --- " + (string)angular_motor.z); //Diagnostic

            llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor); //Set rotation
    }

---- end script ---
 
With kind regards, 

Marco Otte
CAMeRA @ VU University Amsterdam
De Boelelaan 1081
1081 HV  AMSTERDAM
Netherlands

Visiting address: 
Metropolitan Building
Buitenveldertselaan 3
1082 VA Amsterdam (room Z539)
T +31 (0)20 598 6807
M +31 (0)6 46025037
E [hidden email] 


_______________________________________________
Opensim-users mailing list
[hidden email]
https://lists.berlios.de/mailman/listinfo/opensim-users



_______________________________________________
Opensim-users mailing list
[hidden email]
https://lists.berlios.de/mailman/listinfo/opensim-users