def example_manipulation_protobuf_list(): # In protobuf, list are called repeated once they are affected to a python # variable they can be used as a normal list. # Take note that a repeated message field doesn't have an append() function, it has an # add() function that create the new message object. # For this example we will use those two messages # message Sequence { # SequenceHandle handle = 1 # string name = 2 # string application_data = 3 # repeated SequenceTask tasks = 4 # } # message SequenceTask { # uint32 group_identifier = 1; # Action action = 2; # string application_data = 3; # } # To keep a clearer example the attribute action in SequenceTask message will be keep to default value # Here's 2 way to add to a repeated message field # Create the parent message sequence = Base_pb2.Sequence() sequence.name = "Sequence" # The extend way sequence_task_1 = Base_pb2.SequenceTask() sequence_task_1.group_identifier = 10 action = sequence_task_1.action action = Base_pb2.Action() # Using Action default constructor sequence.tasks.extend([sequence_task_1]) # Extend expect an iterable # Created for the add() function unique to repeated message field sequence_task_2 = sequence.tasks.add() sequence_task_2.group_identifier = 20 action = sequence_task_2.action action = Base_pb2.Action() # Using Action default constructor # Since sequence.task is a list we can use all the python toolset to # loop, iterate, interogate and print element in that list for i in range(len(sequence.tasks)): print("sequence ID with index : {0}".format( sequence.tasks[i].group_identifier)) # The list still have the iterator proprety of python list so you can directly iterate # throught element without creating a iterator like previous example for task in sequence.tasks: print("sequence ID with object iterator : {0}".format( task.group_identifier))
def example_manipulation_protobuf_list(): # In Google Protocol Buffer, 'repeated' is used to designate a list of indeterminate length. Once affected to a Python # variable they can be used in the same way as a standard list. # Note that a repeated message field doesn't have an append() function, it has an # add() function that create the new message object. # For this example we will use the following two messages # message Sequence { # SequenceHandle handle = 1 # string name = 2 # string application_data = 3 # repeated SequenceTask tasks = 4 # } # message SequenceTask { # uint32 group_identifier = 1; # Action action = 2; # string application_data = 3; # } # For a clearer example the attribute action in SequenceTask message will be kept to default value # Here's two ways to add to a repeated message field # Create the parent message sequence = Base_pb2.Sequence() sequence.name = "Sequence" # The 'extend' way sequence_task_1 = Base_pb2.SequenceTask() sequence_task_1.group_identifier = 10 action = sequence_task_1.action action = Base_pb2.Action() # Using Action default constructor sequence.tasks.extend([sequence_task_1]) # Extend expect an iterable # Created for the add() function unique to repeated message field sequence_task_2 = sequence.tasks.add() sequence_task_2.group_identifier = 20 action = sequence_task_2.action action = Base_pb2.Action() # Using Action default constructor # Since sequence.task is a list we can use all the Python features to # loop, iterate, interogate and print elements in that list. for i in range(len(sequence.tasks)): print("sequence ID with index : {0}".format( sequence.tasks[i].group_identifier)) # Lists have the iterator property of a Python list, so you can directly iterate # throught element without creating a iterator as in the previous example for task in sequence.tasks: print("sequence ID with object iterator : {0}".format( task.group_identifier))
def create_angular_action(): print("Creating angular action") action = Base_pb2.Action() action.name = "Example angular action" action.application_data = "" angle_value = [0, 0, 0, 0, 0, 0, 0] for joint_id in range(7): joint_angle = action.reach_joint_angles.joint_angles.joint_angles.add() joint_angle.value = angle_value[joint_id] return action
def create_cartesian_action(): print("Creating cartesian action") action = Base_pb2.Action() action.name = "Example cartesian action" action.application_data = "" cartesian_pose = action.reach_pose.target_pose cartesian_pose.x = 0.80 # (meters) cartesian_pose.y = 0 # (meters) cartesian_pose.z = 0.36 # (meters) cartesian_pose.theta_x = 10 # (degrees) cartesian_pose.theta_y = 90 # (degrees) cartesian_pose.theta_z = 10 # (degrees) return action
def angular_movement(base_client_service): print("Starting angular motion ...") action = Base_pb2.Action() action.name = "Example angular motion" action.application_data = "" angle_value = [0, 0, 0, 0, 0, 0, 0] # arm straight up for joint_id in range(7): joint_angle = action.reach_joint_angles.joint_angles.joint_angles.add() joint_angle.joint_identifier = joint_id joint_angle.value = angle_value[joint_id] print("Executing action") base_client_service.ExecuteAction(action) print("Waiting 10 seconds to finish movement...") time.sleep(10) print("Angular movement finish")
def cartesian_movement(base_client_service): print("Starting Cartesian motion ...") action = Base_pb2.Action() action.name = "Example Cartesian motion" action.application_data = "" cartesian_pose = action.reach_pose.target_pose cartesian_pose.x = 0.80 # (meters) cartesian_pose.y = 0 # (meters) cartesian_pose.z = 0.36 # (meters) cartesian_pose.theta_x = 10 # (degrees) cartesian_pose.theta_y = 90 # (degrees) cartesian_pose.theta_z = 10 # (degrees) print("Executing action") base_client_service.ExecuteAction(action) print("Waiting 20 seconds for motion to finish ...") time.sleep(20) print("Cartesian motion ended")
def example_manipulation_protobuf_helpers(): # Google offers some helpers with protobuf # We will cover some of them in this section # All the module google.protobuf documentation is available here: # https://developers.google.com/protocol-buffers/docs/reference/python/ # First, the function include with message instance. We will cover the next function # Clear # MergeFrom # CopyFrom # The Clear function is strainght forward it clear all the message attribute. # MergeFrom and CopyFrom have the same purpose, To duplicate data into another object. # The difference between them is CopyFrom will do a Clear before a MergeFrom. # For it's part MergeFrom will merge data if the new field is not empty. # In case of repeated, the content receive in parameter will be append # For this example, I'll used the Ssid message # message Ssid { # string identifier = 1; # } # First I'll create 4 of them with unique string ssid_1 = Base_pb2.Ssid() ssid_1.identifier = "" ssid_2 = Base_pb2.Ssid() ssid_2.identifier = "123" ssid_3 = Base_pb2.Ssid() ssid_3.identifier = "@#$" # Now I'll Merge ssid_1 in ssid_2 and print the identifier of ssid_2 ssid_2.MergeFrom(ssid_1) print("Content ssid_2: {0}".format(ssid_2.identifier)) # output : Content ssid_2: 123 # Now I'll Copy ssid_1 in ssid_3 and print the identifier of ssid_3 ssid_3.CopyFrom(ssid_1) print("Content ssid_3: {0}".format(ssid_3.identifier)) # output : Content ssid_3: # For more function visit the Class Message documentation # https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.message.Message-class # From the protobuf library you can used the json_format module. # One useful function is the MessageToJson. # This function serialize the protobuf message to a json object it help alot when you want to print large object in # a human readable way. # Here's an example with the following two message # message Sequence { # SequenceHandle handle = 1 # string name = 2 # string application_data = 3 # repeated SequenceTask tasks = 4 # } # message SequenceTask { # uint32 group_identifier = 1; # Action action = 2; # string application_data = 3; # } # I quickly populate the message sequence = Base_pb2.Sequence() sequence.name = "A Name" for i in range(5): sequence_task = sequence.tasks.add() sequence_task.group_identifier = 10 * ( i + 1) # Some further function doesn't print if value = 0 action = sequence_task.action action = Base_pb2.Action() # Using Action default constructor # We need to import the module from google.protobuf import json_format # Now to get the json object json_object = json_format.MessageToJson(sequence) # Now you can print it print("Json object") print(json_object) # output: # Json object # { # "name": "A Name", # "tasks": [ # { # "groupIdentifier": 10 # }, # { # "groupIdentifier": 20 # }, # { # "groupIdentifier": 30 # }, # { # "groupIdentifier": 40 # }, # { # "groupIdentifier": 50 # } # ] # } # From the protobuf library you can used the text_format module # A useful function is the MessageToString. It has the same purpose of # MessageToJson convert the message to a human readable format # For the example I'll reuse the sequence object created in previous example # First import the module from google.protobuf import text_format # Now print print("Text format") print(text_format.MessageToString(sequence))