Up:[[Tutorial]]     Previous:[[Samples of the dynamics simulations]]     Next:[[Exchange of messages between agents]]

----
#contents

*Operations on the movement of agents  [#v2485f29]

Describes how to operate the joints of agents or anthropomorphic robots.

** Operations of joints of robots[#f5cb7768]

Here is  the sample code to change the angle of joint of human hand.

***Creating the Controller [#oc032119]
NewWorld is the directory in which we create AgentController.cpp

 $ cd ~/sigverse-<version>/bin/NewWorld
Let's create a controller file AgentController.cpp in the MyWorld workspace.

 $ emacs AgentController.cpp

AgentController.cpp

#highlight(cpp){{
#include "Controller.h"
#include "Logger.h"

#define PI 3.141592

//Coverts angles to radians
#define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 ) 

class AgentController : public Controller
{
public:
  double onAction(ActionEvent &evt);
}; 


//This function is called on regular basis
double AgentController::onAction(ActionEvent &evt)
{
  try {
    // get handle for the agent
    SimObj *my = getObj(myname());
    if (!my->dynamics()) { 

     // "LARM_JOINT2" is set to 45 degrees
      my->setJointAngle("LARM_JOINT2", DEG2RAD(45));

   }

 } catch(SimObj::Exception &) {
   ;
 }

 return 5.0;
}


extern "C"  Controller * createController ()
{
  return new AgentController;
}
}}
Sample at the start of the simulation
my->setJointAngle  is used to set the angle to 45 degree for left arm of robot.

***Compiling [#o78ee00f]
In this controller, the avatar agent bend the left arm to 45 degree by the my->setJointAngle function.

Lets change the Makefile.

 $ emacs Makefile
*** Compilation [#p15fd2cd]

 #The object is modified to incorporate the changes due to new agent controller
 OBJS = AgentController.so
The same script sigmake.sh should be used for the compilation as well as the previous example.

Makefile
 $ ./sigmake.sh AgentController.cpp

 #The location of the source of header files for SIGVerse
 SIG_SRC  = /home/<username>/sigverse-<version>/include/sigverse
 
 #The object 
 OBJS     = AgentController.so 
 
 all: $(OBJS)
 
 #Compile
 ./%.so: ./%.cpp
         g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I$(SIG_SRC) -I$(SIG_SRC)/comm/controller  -fPIC -shared -o $@   $<
*** Creating world files [#l5dd7972]

Then create a world file in the same workspace.

Compile
 $ emacs AgentWorld.xml

 $ make

***Creating world files [#l5dd7972]
Then create a world file


 $ cd ~/sigverse-<version>/bin
 $ ln -s ../share/sigverse/data/xml/ xml

This glues the link to the directory where the xml file is located

 $ emacs xml/AgentWorld.xml

AgentWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
 <world name="myworld2">
 <world name="AgentWorld">
 
 <!--Set gravity-->
   <gravity x="0.0" y="-9.8" z="0.0"/>  
 
 <!--object of agent Man-nii-->
   <instanciate class="Man-nii.xml"> 
 
 <!--Agent Name-->
         <set-attr-value name="name" value="man_000"/> 
 
 <!--C++ is the programming language-->
         <set-attr-value name="language" value="c++"/> 
 
 <!--Name and relative path of the object AgentController.so-->
         <set-attr-value name="implementation"
 value="./NewWorld/AgentController.so"/> 
 <!--Controller file for the object-->
         <set-attr-value name="implementation" value="./AgentController.so"/> 
 
 <!--put the flag of dynamics to false-->
         <set-attr-value name="dynamics" value="false"/> 
 
 <!--setting the initial position of agent (x,y,z)-->
        <set-attr-value name="x" value="0.0"/>
        <set-attr-value name="y" value="50.0"/>
        <set-attr-value name="z" value="0.0"/>
         <set-attr-value name="x" value="0.0"/>
         <set-attr-value name="y" value="50.0"/>
         <set-attr-value name="z" value="0.0"/>
 
  </instanciate>
</world>
}}

The file being read is Man-nii.xml, dynamics is set to false.
The file specifies Man-nii.xml as humanoid avatar. Dynamics mode is set to false to specify concrete joint angle value to change the posture of the avatar.
Please be careful that you cannot specify such concrete joint angle values in dynamics On mode.

***Starting Sigverse  [#g6cf60e0]
*** Starting SIGVerse  [#g6cf60e0]

So let's start SIGVerse.

 $ ./sigserver.sh -w AgentWorld.xml -p 9001
 $ sigserver.sh -w ./AgentWorld.xml

Upon connecting to the SimServer in SIGViewer and starting the simulation  , the agent's left arm expands with an increased angle of 45 degree .
Connect to the SIGServer and push the "START" button to start the simulator.
You can see that the agent holds the left arm to 45 degree. 

#ref(man_1.jpg)
#ref(./man_1.PNG,40%)


We use setJointAngle to set the angle of "LARM_JOINT2" to 45 degree."LARM_JOINT2" is the name of the joint defined for rotation of the left shoulder on Z axis.

Joint names of these files are defined in sigverse-x3d <version> / share / sigverse / data / shape / (nii_man.x3d) .

Joint names and join definitions of the sample model described in current Agentworld.xml file are read from file Man_nii.xml which in turn is reading the file nii_man.x3d describing the shape of a human-type agent. 

**Agent Attributes [#nb731d79]
***Checking Attributes [#g984fed9]

Click the Attributes tab . You can check the attributes of the agent as a whole and also part attributes by clicking on the part of agent model . The general attributes are location of the agent in SIGViewer (x, y, z), the orientation of the agent (qw, qx, qy, qz), the position of the viewpoint (epx, epy, epz) etc . The value of these attributes are set in the xml file.


#ref(attr_1.jpg)

Man-nii humanoid agent is an object that inherits from the Agent class. The default value of the Agent class attribute is set in Agent.xml. Let's see the file Agent.xml

 $ less xml/Agent.xml

#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
 
 <define-class name="Agent" inherit="Entity.xml">
 
 <attr name="language" type="string" group="model"/>
 <attr name="implementation" type="string" group="model"/>
 
 
    <!-- view point(agent coordinate) -->
 <attr name="vpx" type="double" group="viewpoint" value="0.0"/>
 <attr name="vpy" type="double" group="viewpoint" value="0.0"/>
 <attr name="vpz" type="double" group="viewpoint" value="0.0"/>
 
    <!-- view vector(view coordinate) -->
 <attr name="vvx" type="double" group="viewvector" value="0.0"/>
 <attr name="vvy" type="double" group="viewvector" value="0.0"/>
 <attr name="vvz" type="double" group="viewvector" value="-1.0"/>
}}

Furthermore, Agent class has inherited the Entity class. Entity class is the class of objects that do not behave autonomously.

***Agents, basic attributes of an entity[#g14c1ee2]

Entities introduces the basic properties of the agent.

Attribute of an entity

| Attribute Name | Meaning | Remarks |
| x, y, z | position of the entity | global coordinates. green arrow from the origin for x-axis, yellow arrow for y-axis red arrow is shown for  z-axis |
| fx, fy, fz | force on the entity | |
| vx, vy, vz | speed of the entity | |
| qw, qx, qy, qz | direction of the entity | Quaternion notation |
| scalex, scaley, scalez | the size of the entity | |

Agent attributes
| Attribute Name | Meaning | Remarks |
| vpx, vpy, vpz | position of the viewpoint of the agent (non-humanoid) | agents coordinate origin is the position of the agent |
| vvx, vvy, vvz | gaze direction (non-humanoid) | vector notation |
| elnk1, elnk2, ... elnk9 | viewpoint (camera) to establish a link name (humanoid only) | elnk1 HEAD_LINK are installed by default. |
| epx1, epy1, epz1, ... epx9, epy9, epz9 | viewpoint (camera) position (humanoid only) | origin is specified by the position of the link elnk |
| evx1, evy1, evz1, ... evx9, evy9, evz9 | viewpoint (camera) direction (humanoid only) | |
| FOV | Agent viewing angle (height) | |
| voiceReachRadius | Agent voices reach | |

These attributes can be set in all the world files.


** Operating agents with a Command [# ta077379] [#z4a13466]

Last time we introduced the sample code that calls function onAction to raise the hands of agent hands regularly. The following provides sample code to bow to the agent by sending a message from SIGViewer.
** Operating agents with a Command [#t5a2daa5]

In the above example, a function onAction was used to raise the hands of the agent. Next sample code uses message sending function in order to control the avatar from SIGViewer.

Introducing changes to AgentController.cpp
 $ cd NewWorld
 $ emacs AgentController.cpp
Let's create another controller file named AgentController2.cpp

AgetnController.cpp
 $ emacs AgentController2.cpp

AgetnController2.cpp

#highlight(cpp){{
#include <string>  //include string header files
#include "Controller.h"
#include "Logger.h"
#include "ControllerEvent.h"


#define PI 3.141592
#define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 ) 

using namespace std;  //Using namespace definitions

class AgentController : public Controller
{
public:
  double onAction(ActionEvent &evt);

  // Declare the use of onRecvMessage function when it receives a message

  void onRecvMessage(RecvMessageEvent &evt);
  void AgentController::onRecvMsg(RecvMsgEvent &evt)
};

double AgentController::onAction(ActionEvent &evt)
{
  try {
    SimObj *my = getObj(myname());
    if (!my->dynamics()) { 

      // Lower down the left.
      my->setJointAngle("LARM_JOINT2", DEG2RAD(-90));

      // Lower down the right
     my->setJointAngle("RARM_JOINT2", DEG2RAD(90));

    }
  } catch(SimObj::Exception &) {
    ;
  }
  return 5.0;
}


void AgentController::onRecvMessage(RecvMessageEvent &evt)
void AgentController::onRecvMsg(RecvMsgEvent &evt)
{

  //get an handle to agent
  SimObj *my = getObj(myname());

  //string message is received 
  string value(evt.getString(0)); 

  // string message is received 
  std::string value(evt.getMsg()); 
  if (value =="Hello"){

    //bend the hip joint to 45°
    //bend the hip joint to 45[deg]
    my->setJointAngle("WAIST_JOINT1", DEG2RAD(45));
  } 

}

extern "C"  Controller * createController ()
{
  return new AgentController;
}
}}

agent puts its hands down when onAction function is called , onRecvMessage  function is to be called when a message is received. The message "Hello" is passed which triggers the function that makes the agent  to the bow.
agent puts its hands down when onAction function is called ,
The onRecvMessage function will be called when a message is sent to the controller. In this example, the agent will bows when a message "Hello" comes.

Compile.
Compile the new controller file.

 $ make
 $ ./sigmake.sh AgentController2.cpp

**Run  [#d5c0a11e]
*** World file [#md72d91d]

Edit the attributes of the Agent.
So let's run. 
You should modify the world file to use the new controller file.

 $ cd ..
 $ ./sigserver.sh -w AgentWorld.xml -p 9001
#highlight(xml:firstline[16]){{
  <!--Controller file for the object-->
         <set-attr-value name="implementation"
                         value="./AgentController.so"/> 
}}
       ↓

Connect with SIGViewer, and start the simulation by clicking the send button, lower left and right hands  go down as the funcion onAction is called first.
#highlight(xml:firstline[16]){{
  <!--Controller file for the object-->
         <set-attr-value name="implementation"
                         value="./AgentController2.so"/> 
}}

#ref(man_2.jpg)
***Send a message [#hb68ba23]
*** Execute the server [#p73b3ced]

Click the "Command" tab on the right side of GUI and select "General" .
Type the name of agent as "man_000" , and write "Hello" , without strings .
Input the following command to execute the SIGVerse server.

#ref(man_3.jpg)
 $ sigserver.sh -w ./AgentWorld.xml

Click the "Execute" button and check the behavior.
#ref(man_4.jpg)
Start the SIGViewer, and connect to the SIGServer. When you push the start button, the avatar agent down its both hands with onAction function.

I bowed.
#ref(./man_2.PNG,40%)

**Joint rotation with quaternion [#ecbdc67b]
*** Sending a message [#hb68ba23]

Click the "Message" button on the right bottom of the SIGViewer. A new subwindow "SendMessage" will appear.
Select the target agent "man_000" in the TargetEntity field. Next, input a message "Hello" in the following Message: field as shown in the figure.

#ref(./man_3.PNG,70%)

Click the "Send" button if you input the message.

#ref(./man_4.PNG,40%)

You can see the avator bows.


** Joint rotation with quaternion [#ecbdc67b]

Rotation of the joint can also be set by the quaternion.


AgentController.cpp
AgentController2.cpp

#highlight(cpp:firstline[51]){{
     //Bend the Hip joint to 45 degree
#highlight(cpp:firstline[52]){{
     //Bend the Hip joint to 45[deg]
     my->setJointAngle("WAIST_JOINT1", DEG2RAD(45));
}}
   ↓
#highlight(cpp:firstline[51]){{
#highlight(cpp:firstline[52]){{
    //Rotate 90 degree around X axis for the hip joint
    my->setJointQuaternion("WAIST_JOINT1", 0.707, 0.707, 0.0, 0.0);
}}

setJointquaternion  function is called  to set the joint using quaternions. Then the joint names of the quaternion are specified in argument w, x, y,z.
setJointquaternion function sets the joint angle using quaternions. The joint names of the quaternion are specified in argument w, x, y, z.

Please try to make sure the joint is rotated correctly. 

Up:[[Tutorial]]     Previous:[[Samples of the dynamics simulations]]     Next:[[Exchange of messages between agents]]

#highlight(end)

#counter


Front page   New List of pages Search Recent changes   Help   RSS of recent changes