My blog post is a little late this week…
Good progress was made this week, with lots of code added to the kinematics file, starting a tests file, and starting the inertias file. I think most of the kinematics classes are done…. but more tests need to be implemented, and then the code corrected if there are any errors. It’s looking like the inertias file will be pretty easy to fill out, as those classes are extending a lot of what has already been written. The next code that will be a challenge to figure out is the algorithm implementations (e.g. Kane’s Method, Lagrange’s Method, etc.). In forming the equations of motion, expressions can get very big very fast, so we will have to take care here.
I think the best piece of news was from yesterday. Throughout the week, I had been trying to figure out how to be able to take the partial derivative of a SymPy expression with respect to a generalized speed, without using any substituions (that the user would see, at least). The problem was that SymPy’s diff can only take in symbols, and for an undefined function (say, x(t)), you get a Derivative object returned (say, D(x(t), t)).
At first I tried extending Symbol, unsuccessfully, to return a new symbol when its derivative was taken. This didn’t work once my extended Symbol was inside a Add or Mul, as the new methods I had written weren’t called. I posted this to the mailing list (http://groups.google.com/group/sympy/browse_thread/thread/b9c8e3fc3d3d379b), and after some discussion, someone suggested that I add Symbol(‘t’) to the free_symbols property of my extended Symbol class. I also got the name for the class, DynamicSymbol, from this discussion. Basically, now when you take the time derivative of a DynamicSymbol object, even if it is within other SymPy objects, it’s _eval_derivative() method is called, and now it will return what you want. Here’s a little example:
In [1]: run kinematics.py
In [2]: x = TVS(‘x’)
In [3]: y = TVS(‘y’)
In [4]: t = Symbol(‘t’)
In [5]: diff(2 * x**2 + 4 + y,t)
Out[5]: 4*x*xdt + ydt
In [7]: diff(diff(2 * x**2 + 4 + y,t),TVS(‘xdt’))
Out[7]: 4*x
This is pretty exciting, as now things will work fairly intuitively, when it comes to derivatives and partial derivatives for generalized coordinates and speeds. Also, if you have time-varying symbols (maybe some specified position), it will now be identified as such, and when the final equations of motion are formed with the output code, it can be treated as a variable defined by a user-specified function.
Next is filling out the inertia classes, adding more tests and ensuring correct functionality, and starting on the algorithm implementations.