Thank you very much for that. I’m not sure that what you’ve posted there is quite what I’m looking for, but it has helped by pointing out some avenues for investigation that seem to have allowed me to make some progress. 
I discovered a few things that I was doing incorrectly, I believe:
- I had been using the “pose” method under the impression that its parameter specified a keyframe, not just a frame, which in retrospect was silly. Since my keyframes–my poses, essentially–are spaced about ten frames apart, a simple multiplier solved that issue.
- I had been clipping off the last keyframe from my list by ending the animation at that frame; this was a minor issue, however (and easily rectified by extending the animation).
I also discovered this post, which looks as thought it’s addressing a similar idea. While I had been including “localTransform = True” in my calls to exposeJoint, I hadn’t known what the first parameter was, and so had been leaving that as “None”.
However, having read that post, I’m not sure of what nodes to pass into that first parameter. At the moment, for each “exposeJoint” after the first, I’m passing in the NodePath returned by the previous “exposeJoint” (since I’m modelling a single limb, and thus my joints form a single chain), but I suspect that this isn’t correct.
I’ve looked at the result of “getPartBundle”, as suggested in the post, but don’t see a way to get appropriate NodePaths out of that: “getPartBundle” returns a “CharacterJointBundle”; it’s child (I have only one at the moment, it seems) is a “PartGroup”, and the child of that is a “CharacterJoint”. Looking at the API covering those classes, I don’t see a likely-looking way to get appropriate NodePaths out of them.
Interestingly, if in my calls to “exposeJoint” I include “localTransform = True” but leave the first parameter as “None”, I get poses that look almost like the ones that I modelled, but still off.
So, I’m still not quite there, but a little closer, I feel…