Difference between revisions of "Program Examples:Visualization with RoboDK"

From SoftMC-Wiki
Jump to: navigation, search
(Test)
 
Line 1: Line 1:
Test
+
Here is an example of the programs that can be used in order to visualize the PUMA Soft-MC group in RoboDK software.
 +
These programs can be used to visualize 1 or more PUMA robots.
 +
These programs can be modified to allow the visualization of other types of groups/robots.
 +
 
 +
----------------------------------------------------------------------------------------------------------------------------------------------
 +
 
 +
The first program is the server side, hosted by the MC.
 +
This program opens a TCP/IP server, waits for the connection of the client (RoboDK) and sends the robot's joints values to the client in an infinite loop.
 +
 
 +
<syntaxhighlight lang="vb">
 +
'------------------------------------------------------------------------------
 +
' File:        server.prg
 +
' Purpose:    open a TCP/IP server, allow connection of client, and send data to client
 +
' Version:    1.00
 +
' Author:      Ron Danon
 +
' Description:
 +
' History:    2016-09-08  server.prg  V1.00
 +
'              Created
 +
'------------------------------------------------------------------------------
 +
dim shared numOfRobots as long = 1
 +
 
 +
program
 +
 
 +
dim index as long
 +
dim sockNum as long = 1
 +
dim cPort as long = 7132
 +
dim jointStr as string
 +
dim robotGroups[1] as generic group 'same as size of numOfRobots
 +
  dim robotNames[1] as string 'same as size of numOfRobots
 +
 
 +
'---------------Define robot groups and names---------------' 
 +
robotGroups[1] = PUMA
 +
robotNames[1] = "robot1"
 +
'robotGroups[2] = PUMA2
 +
'robotNames[2] = robot2
 +
 
 +
'---------------Opening new socket---------------'
 +
call openNewSocket(sockNum,cPort)
 +
 
 +
'---------------Connecting to client---------------' 
 +
call connectClient(sockNum,cPort,0)
 +
 
 +
'---------------Main Loop---------------' 
 +
while True
 +
call createJsonStr(robotNames,robotGroups,jointStr)
 +
call checkIfReady(sockNum,cPort)
 +
print #sockNum,jointStr   
 +
end while
 +
 
 +
'---------------Close sockets and exit---------------'
 +
print #sockNum,"finish"
 +
sleep 1000
 +
close #sockNum
 +
Print "Server Closed Sockets. Server Exits"
 +
 +
end program ' server.prg
 +
 
 +
 
 +
'---------------------------------------'
 +
'---------------Functions---------------'
 +
'---------------------------------------'
 +
 
 +
sub openNewSocket(sockNum as long,cPort as Long)
 +
dim opened as long = 0
 +
while not opened
 +
Try
 +
OpenSocket Options=1 as #sockNum
 +
opened = 1
 +
catch 5043 'socket is already open
 +
print "socket", sockNum, "is already open. trying next socket"
 +
sockNum = sockNum + 1
 +
end Try
 +
end while
 +
print "socket", sockNum, "is set"
 +
end sub
 +
 
 +
 
 +
sub connectClient(sockNum as long, cPort as Long, ByVal sockIsOpen as long)
 +
dim str1 as string
 +
if sockIsOpen then
 +
close #sockNum
 +
OpenSocket Options=1 as #sockNum
 +
end if
 +
Accept(#sockNum, cPort)
 +
sleep 500
 +
str1=input$(loc(sockNum),#sockNum) 'receive data to check if connected
 +
?"client is connected"
 +
sleep 200
 +
end sub
 +
 
 +
 
 +
sub checkIfReady(sockNum as long,cPort as Long)
 +
'Waits for a 'ready' input from roboDK before sending the next JSON string
 +
dim ready as long = 0
 +
while not ready
 +
Try
 +
while loc(sockNum) = 0  'while no data is available
 +
sleep 10
 +
end while   
 +
catch 5041 'client disconnected
 +
print "client disconnected, waiting for connection"
 +
call connectClient(sockNum,cPort,1)
 +
end Try
 +
ready = (input$(loc(sockNum),#sockNum) = "ready") 'check if the input is "ready"
 +
end while
 +
end sub
 +
 
 +
 
 +
sub createJsonStr(robotNames[*] as string, robotGroups[*] as generic group, jointStr as string)
 +
'FORMAT --> '{"robotName": [double-a1, double-a2, double-a3, double-a4, double-a5, double-a6]}' <---
 +
'double is in precision of 2 digits after the point, i.e.: '0.12', '179.12'
 +
dim index1 as long
 +
dim index2 as long
 +
dim jointValues as generic joint
 +
 +
jointStr = "{"
 +
for index1 = 1 to numOfRobots
 +
jointValues = robotGroups[index1].PFb
 +
jointStr = jointStr + chr$(34) + robotNames[index1] + chr$(34) + ": ["
 +
for index2 = 1 to 6
 +
jointStr = jointStr + STRD$(jointValues{index2}, "%.2f") + ", "
 +
next
 +
jointStr = LEFT$(jointStr,LEN(jointStr)-2) + "], "
 +
next
 +
jointStr = LEFT$(jointStr,LEN(jointStr)-2) + "}"
 +
end sub
 +
 
 +
'---------------End of functions---------------'
 +
 
 +
</syntaxhighlight>
 +
 
 +
 
 +
----------------------------------------------------------------------------------------------------------------------------------------------
 +
 
 +
The second program is the client side, running in RoboDK (in python language).
 +
This program uses the class MCenv which inherits from the robolink class of RoboDK.
 +
With this class one can set the puma robots to use, to read the data from the MC and to move the robots in the scene.
 +
 
 +
<syntaxhighlight lang="python">
 +
import mcEnv
 +
   
 +
host, port = "10.4.20.66", 7132
 +
finsihedTransmit = False
 +
 
 +
MCE = mcEnv.MCenv()
 +
MCE.setSimulationSpeed(500)
 +
MCE.connectClient(host,port)
 +
MCE.setRobot("robot1", "hsr_jr612")
 +
 
 +
robotList = ["robot1"]
 +
 
 +
while not finsihedTransmit:
 +
    MCE.writeStr("ready")
 +
    jsonStr = MCE.readJsonStr()
 +
    MCE.moveRobots(robotList, jsonStr)
 +
   
 +
raise Exception('Finished')
 +
</syntaxhighlight>

Revision as of 14:11, 10 November 2016

Here is an example of the programs that can be used in order to visualize the PUMA Soft-MC group in RoboDK software. These programs can be used to visualize 1 or more PUMA robots. These programs can be modified to allow the visualization of other types of groups/robots.


The first program is the server side, hosted by the MC. This program opens a TCP/IP server, waits for the connection of the client (RoboDK) and sends the robot's joints values to the client in an infinite loop.

'------------------------------------------------------------------------------
' File:        server.prg
' Purpose:     open a TCP/IP server, allow connection of client, and send data to client
' Version:     1.00
' Author:      Ron Danon
' Description:
' History:     2016-09-08  server.prg  V1.00
'              Created
'------------------------------------------------------------------------------
dim shared numOfRobots as long = 1

program

	dim index as long
	dim sockNum as long = 1
	dim cPort as long = 7132
	dim jointStr as string
	dim robotGroups[1] as generic group 'same as size of numOfRobots
  	dim robotNames[1] as string 'same as size of numOfRobots
  	
'---------------Define robot groups and names---------------'  	
robotGroups[1] = PUMA
robotNames[1] = "robot1"
'robotGroups[2] = PUMA2
'robotNames[2] = robot2
  	
'---------------Opening new socket---------------'
	call openNewSocket(sockNum,cPort)
  
'---------------Connecting to client---------------'  
	call connectClient(sockNum,cPort,0)

'---------------Main Loop---------------'  
	while True
		call createJsonStr(robotNames,robotGroups,jointStr)
		call checkIfReady(sockNum,cPort) 
		print #sockNum,jointStr     
	end while

'---------------Close sockets and exit---------------' 
	print #sockNum,"finish"
	sleep 1000
	close #sockNum
	Print "Server Closed Sockets. Server Exits"
	
end program ' server.prg


'---------------------------------------'
'---------------Functions---------------' 
'---------------------------------------'

sub openNewSocket(sockNum as long,cPort as Long)
	dim opened as long = 0
	while not opened 
		Try
			OpenSocket Options=1 as #sockNum
			opened = 1
		catch 5043 'socket is already open
			print "socket", sockNum, "is already open. trying next socket"
			sockNum = sockNum + 1
		end Try
	end while
	print "socket", sockNum, "is set"
end sub


sub connectClient(sockNum as long, cPort as Long, ByVal sockIsOpen as long)
	dim str1 as string
	if sockIsOpen then
		close #sockNum
		OpenSocket Options=1 as #sockNum
	end if
	Accept(#sockNum, cPort)
	sleep 500
	str1=input$(loc(sockNum),#sockNum) 'receive data to check if connected
	?"client is connected"
	sleep 200
end sub


sub checkIfReady(sockNum as long,cPort as Long)
	'Waits for a 'ready' input from roboDK before sending the next JSON string
	dim ready as long = 0
	while not ready
		Try
			while loc(sockNum) = 0   'while no data is available
				sleep 10
			end while    
		catch 5041 'client disconnected
			print "client disconnected, waiting for connection"
			call connectClient(sockNum,cPort,1)
		end Try
		ready = (input$(loc(sockNum),#sockNum) = "ready") 'check if the input is "ready"
	end while
end sub


sub createJsonStr(robotNames[*] as string, robotGroups[*] as generic group, jointStr as string)
'FORMAT --> '{"robotName": [double-a1, double-a2, double-a3, double-a4, double-a5, double-a6]}' <---
'double is in precision of 2 digits after the point, i.e.: '0.12', '179.12' 
	dim index1 as long
	dim index2 as long
	dim jointValues as generic joint
	
	jointStr = "{"
	for index1 = 1 to numOfRobots
		jointValues = robotGroups[index1].PFb
		jointStr = jointStr + chr$(34) + robotNames[index1] + chr$(34) + ": ["
		for index2 = 1 to 6
			jointStr = jointStr + STRD$(jointValues{index2}, "%.2f") + ", "	
		next
		jointStr = LEFT$(jointStr,LEN(jointStr)-2) + "], "
	next
	jointStr = LEFT$(jointStr,LEN(jointStr)-2) + "}"
end sub

'---------------End of functions---------------'



The second program is the client side, running in RoboDK (in python language). This program uses the class MCenv which inherits from the robolink class of RoboDK. With this class one can set the puma robots to use, to read the data from the MC and to move the robots in the scene.

import mcEnv
    
host, port = "10.4.20.66", 7132
finsihedTransmit = False

MCE = mcEnv.MCenv()
MCE.setSimulationSpeed(500)
MCE.connectClient(host,port)
MCE.setRobot("robot1", "hsr_jr612")

robotList = ["robot1"]

while not finsihedTransmit:
    MCE.writeStr("ready")
    jsonStr = MCE.readJsonStr()
    MCE.moveRobots(robotList, jsonStr)
    
raise Exception('Finished')