Basic info about topics and their usage with python.
Hello! I installed on my pc pygazebo that provides python bindings for Gazebo. Pygazebo communicates with Gazebo through sockets using the Google Protobufs. I have some problems in understanding how a message must be structured, if I want to send it to Gazebo topic. For example I can apply a force on a revolute joint using the JointCmd topic, but when I try to use any other topic ( such as, for example , JointAnimation ) , I get a lot of errors like this :
Traceback (most recent call last):
File "Joint_Animation.py", line 24, in <module>
loop.run_until_complete(publish_loop())
File "/usr/local/lib/python2.7/dist-packages/trollius-1.0.2-py2.7.egg/trollius/base_events.py", line 281, in run_until_complete
return future.result()
File "/usr/local/lib/python2.7/dist-packages/trollius-1.0.2-py2.7.egg/trollius/futures.py", line 277, in result
raise self._exception
AttributeError: Assignment not allowed to repeated field "time" in protocol message object.
So, I'm a beginner and I need some basic info. I understood that every topic has a particular function and it need a particular message to work. So where can I learn how to use the topics through the sockets? For example where can I understeand how works the JointAnimation topic? In the JointAnimation topic what is the 'magic' attribute time? Long story short.... Where can I find the basic info to use the socket with pygazebo?
Every little info will be very helpful! Thanks in advance!
P.S.: This is the script that returns the error above:
import trollius
from trollius import From
import pygazebo
import pygazebo.msg.joint_animation_pb2
@trollius.coroutine
def publish_loop():
manager = yield From(pygazebo.connect())
publisher = yield From(manager.advertise('/gazebo/default/3gl_robot/joint_animation','gazebo.msgs.JointAnimation'))
message = pygazebo.msg.joint_animation_pb2.JointAnimation()
message.model_name = '3gl_robot::collo_hinge'
message.time=1
i=0
while True:
yield From(publisher.publish(message))
yield From(trollius.sleep(0.50))
i=i+1
loop = trollius.get_event_loop()
loop.run_until_complete(publish_loop())
Asked by Formigola on 2015-01-06 06:51:18 UTC
Answers
When working with python objects, it can be useful to use them from an interactive shell, this lets you tell what operations are possible. Here, you are trying to perform an operation on the JointAnimation object's time member which isn't possible.
If you open up an interactive python shell and do:
import pygazebo
import pygazebo.msg.joint_animation_pb2
ja = pygazebo.msg.joint_animation_pb2.JointAnimation()
help(ja.time)
You can see what things you can do with the time member. In particular, it is a protobuf repeated field, which means you can call "add(1)" on it to add a single time member. Thus the following code would work:
ja.time.add(1) # note, ja.time = 1 won't work
A good rule of thumb is if you are using a new message in pygazebo, you should find some sample C++ code which uses that and mimic it. Another good option is to look in the gazebo source code to figure out how the message is being used.
Asked by jpieper on 2015-01-06 08:36:00 UTC
Comments