答:
"My question is the following"

Is this even a good solution?

No, not really. As BendingUnit22 mentions, a motor controller... controls a motor. One motor. The biggest problem I see with this is that you've got the EtherCAT slave on the feedback line, trying to do signal processing, instead of piping the feedback directly to the motor controller.

The motor controller is setup for one motor. Use one motor controller for each motor you want to use.

What are other solutions to this problem?

Open-ended design problems are off-topic (you could join us in Robotics Chat and ask there if you like). That said, you haven't mentioned how you are converting from a brushless DC motor to the joint, but I'm going to guess you've got some kind of fixed gearing between the motor and the joint.

Your options there are to either put an encoder on the joint and do processing on the feedback signal to convert to motor units (as you've depicted), or you could put the encoder on the motor and do processing on the reference signal to convert the desired joint angle to motor units. My preference, personally speaking, would be to put the encoder on the motor. This means that all of your processing (converting between joint/motor units) is done before the motor-control loop. Processing introduces delays and those delays (negatively) affect control.

Something to think about, but I'm not going to speculate on your options here beyond pointing that out. You can leverage the knowledge of the fixed gearing between motor and joint to quickly scale desired joint angles to desired motor units and vice-versa, depending on where you want to put the encoder. I believe most BLDC motors come with encoders already, though generally not absolute encoders, which you would need.

Are there even better alternatives for a motor controller?

Terms like "good" and "better" are for you to decide; they have no quantifiable meaning on their own. Once you set a list of specifications, you can rank options by how well they meet or exceed each of the items on your list of specifications. If you can rank your specifications then it should become obvious that some options are "better" for your application than others, but again that's all dependent on the list of specifications that you generate.

I'll add here that I think a lot of people put cost as a specification, which is generally advisable, but they put too much emphasis on it. What matters more to you, cost or quality documentation? Cost or that the motor utilizes industry standards (NEMA bolt patterns, standard shaft sizing, reasonable power interface)? Cost or supplier's return policy? Cost or availability?

What good is a cheap motor when you can't bolt it to any standard accessories or gearboxes? What good is a cheap motor that arrives DOA and then you can't exchange it, or when the exchange process takes 3 months?

I ask because these are all (absolutely colossal) problems I've actually faced on academic design projects. Some of these oversights nearly killed a couple (graded) projects I worked on.

Might it be a better idea to build and program your own motor controller?

Generally speaking, yeah, I think that's a great project. Unfortunately for you, that's not the project you're supposed to be working on. You stated that you're part of the software and control department. The other people on this project are counting on you to get a motor controller done and programmed so the other teams can get their portion of the project completed.

A frame that can't be actuated doesn't help anyone and looks bad on everyone.

If this was your own pet project, then I'd say go for it, but because you're working in a team environment, where there are other people depending on you to complete your work in a timely manner, I'd say save that project for when you have time and try to find an off-the-shelf product that meets your needs for now.

If your teams are big enough you might be able to split this project off for yourself, after you help acquire at least passable motor controllers. The problem with designing your own is that you need to:

Interface with the motor encoder, in all the formats the commercial motor controller could (or, at a bare minimum, in all the formats for the encoders you're using).

Design the schematic for the power electronics capable of providing 1.2kW.

Design the PCB for the schematic, including layout and trace size. 1.2kW isn't "high power" by any means, but it's enough that you're likely to blow up a couple boards before you get the design right.

Design the housing/mount footprint for the completed circuit.

Actually assemble and solder the PCB.

Program the PCB, including the packet processing for EtherCAT if you go that route, the input processing and conditioning for the encoder feedbacks, and then the actual control algorithm for the motor speed control.

This might "only" be a couple weeks of working full time, but there's generally a couple weeks of down time between completing the PCB design and receiving the boards, and like I mentioned I would be money you'll blow at least one board. You have to have everything perfect; all the component datasheets read correctly, transcribed to schematics correctly, transcribed to PCB correctly, components placed correctly, and then soldered correctly, and then programmed correctly, for the thing to work.

If you blow a board because you didn't place or solder or program something correctly, then you're out the turnaround time on the replacement parts.

If you blow a board because you didn't get the schematic right, then you're out the turnaround time on replacement boards, which again is probably a couple weeks.

How do you know the difference between blown by bad schematic and blown by bad construction? Good question. That'll probably take at least a week or two.

And the whole time, the rest of the project is stalled while everyone else on the team waits for the motor controllers.

You stated you or your team ("we") don't have much experience in that area. I don't know how you were thinking you might build and test your own motor controller circuit, but a breadboard is absolutely out of the question. Breadboards can only handle 0.5 to 1 Amp max, so whatever circuit you're testing with one is certainly not a 1.2kW motor controller, or even a 700W motor controller.

Title: Motor Controller Configuration

Body:
With a group of students we are building an exoskeleton for paraplegics. I am part of the Software & Control department and we are designing the motor controller configuration. We have several requirements:

Size is one of our main requirements. We want the Exoskeleton to be
as slim as possible, so this is true for all the components as well.
We want the motor controller to be as small as possible.

The motor controller has to work with a brushless DC motor

A setpoint will be sent from a microcontroller to the motor
controller Two or three absolute encoders need to be connected,
this depends on the design of the joint.
**We are either going to
use position or torque control
We need one encoder for the motor
angle, and one for the joint angle. We might implement Series
Elastic Actuation in our joint and then we want to be able to
measure the deflection in the spring and thus need two encoders
for that.

A continuous power output in the range of 700 - 1200 Watt

While exploring several off-the-shelf possibilities, we came accross the  Elmo Gold Twitter and the IOMI Pro. One of the problems of these boards, is the amount of absolute encoders that can be connected. Both the Elmo and the IOMI board can either have 1 or no absolute encoders connected.

We came op with a solution, so that we are able to connect multiple encoders. In our exoskeleton we are going to use an EtherCAT Master-Slave configuration. The High-Level control (e.g. state-machine) is on the EtherCAT Master and sends joint angle setpoints. Our idea is to use a EtherCAT Slave as a sort of second controller, which gets the joint setpoint and the joint encoder values, calculates the motor setpoint and sends this out to a certain off-the-shelf controller like the Elmo Gold Twitter or the IOMI Pro.

My question is the following: Is this even a good solution? And what are other solution to this problem? Are there even better alternatives for a motor controller? Might it be a better idea to build and program your own motor controller? (please bare in mind that we have limited experience in that area)

I thank you all in advance for your reply!

Cheers!

Nathan


问:
Reading Intention for exoskeletons motion estimation
I'm interested in exoskeletons and wearable rehabilitation robotics. I wonder how we can estimate/predict the intention of human body/part motion. I want to prevent the exoskeleton from interfering with human movements.  Intention reading is the process of predicting how the movement will take place and how it will happen at the beginning of any movement.

There is an exoskeleton example (https://www.youtube.com/watch?v=BdoblvmTixA) which detects muscle activation with EMG and generates artificial muscle attraction. But this is only a open and close action. And it will begins after the movement. Also EMG system has a lot of disadvantage like sliding probes, affecting from other/crossing muscles. I want to estimate every motion like turn,twist, amount of contraction. I'm open to suggestions or issues (The troubles you have experienced.)

This matlab webinar which is about "Signal Processing and Machine Learning Techniques for Sensor Data Analytics" shows how to classify different actions. But this example predicts kind of motion after the motion completed. I need to know motion information at very first.

I want know how can I estimate different motions at the beginning of limb action. Which system (EMG,EEG,IMU,etc.) and processing technique will be better or which combination should I use.

答: You have many options: encoders at exo joints to provide absolute angles, IMU on limbs for estimating motions, force sensing shoe soles for force distribution, force sensors at joints, crutches usually used by pilots wearing rehab exo can also have those sensors, e.g. at the bottom of the crutch, at hand handles, etc.</p>

ContentLicense: CC BY-SA 3.0


问:
What is the bicycle model for a dynamic robot?
I was asked this in a phone interview for a robotics job. Googling has not really helped. I assume it is some sort of state prediction model that can be used in a Kalman filter.

Can anyone give me a formal description? A link to a reference would also be nice.

EDIT to clarify, the interview was for a self-driving car company and before the question we had been discussing Kalman filters, Particle filters, and path planning algorithms (A*).

答:
"The" bicycle model? No idea.  But "a" bicycle model is something that's a great jumping point for tons of interesting topics though...

holonomics

closed-loop systems / feedback models

torque calculations

gyroscopic stabilization

general stability / lyapunov theory

Terrible question for a phone interview!

Bicycle Dynamics and Control by K. J. Åström

This PDF discusses most of those issues.


答: MYO gesture control looks like a good system at least estimation on arm and hand motions. It includes multiple EMG and IMU sensors. </p>

Title: Reading Intention for exoskeletons motion estimation

Body:
I'm interested in exoskeletons and wearable rehabilitation robotics. I wonder how we can estimate/predict the intention of human body/part motion. I want to prevent the exoskeleton from interfering with human movements.  Intention reading is the process of predicting how the movement will take place and how it will happen at the beginning of any movement.

There is an exoskeleton example (https://www.youtube.com/watch?v=BdoblvmTixA) which detects muscle activation with EMG and generates artificial muscle attraction. But this is only a open and close action. And it will begins after the movement. Also EMG system has a lot of disadvantage like sliding probes, affecting from other/crossing muscles. I want to estimate every motion like turn,twist, amount of contraction. I'm open to suggestions or issues (The troubles you have experienced.)

This matlab webinar which is about "Signal Processing and Machine Learning Techniques for Sensor Data Analytics" shows how to classify different actions. But this example predicts kind of motion after the motion completed. I need to know motion information at very first.

I want know how can I estimate different motions at the beginning of limb action. Which system (EMG,EEG,IMU,etc.) and processing technique will be better or which combination should I use.


答:
The bicycle model is a simplified model of vehicle dynamics. It's really common so I'm not sure why a web search did not get any results for you.

A random paper, first one in my search that had a diagram and was not behind a paywall...

Modification of Vehicle Handling Characteristics via Steer-by-Wire
By Paul Yih, Jihan Ryu, and J. Christian Gerdes.

Title: What is the bicycle model for a dynamic robot?

Body:
I was asked this in a phone interview for a robotics job. Googling has not really helped. I assume it is some sort of state prediction model that can be used in a Kalman filter.

Can anyone give me a formal description? A link to a reference would also be nice.

EDIT to clarify, the interview was for a self-driving car company and before the question we had been discussing Kalman filters, Particle filters, and path planning algorithms (A*).


问:
showing error while using inverse kinematics "ikine" for 4 dof robotic arm
I want to do forward dynamics but before that I got struck in inverse kinematics for 4 dof. My code is given below:

```<code>preach = [0.2, 0.2, 0.3];
% create links using D-H parameters
L(1) = Link([ 0 0 0 pi/2 0], 'standard');
L(2) = Link([ 0 .15005 .4318 0 0], 'standard');
L(3) = Link([0 .0203 0 -pi/2 0], 'standard');
L(4) = Link([0 .4318 0 pi/2 0], 'standard');
%define link mass
L(1).m = 4.43;
L(2).m = 10.2;
L(3).m = 4.8;
L(4).m = 1.18;
%define center of gravity
L(1).r = [ 0 0 -0.08];
L(2).r = [ -0.216 0 0.026];
L(3).r = [ 0 0 0.216];
L(4).r = [ 0 0.02 0];
%define link inertial as a 6-element vector
%interpreted in the order of [Ixx Iyy Izz Ixy Iyz Ixz]
L(1).I = [ 0.195 0.195 0.026 0 0 0];
L(2).I = [ 0.588 1.886 1.470 0 0 0];
L(3).I = [ 0.324 0.324 0.017 0 0 0];
L(4).I = [ 3.83e-3 2.5e-3 3.83e-3 0 0 0];
% set limits for joints
L(1).qlim=[deg2rad(-160) deg2rad(160)];
L(2).qlim=[deg2rad(-125) deg2rad(125)];
L(3).qlim=[deg2rad(-270) deg2rad(90)];
%build the robot model
rob = SerialLink(L, 'name','rob');
qready = [0 -pi/6 pi/6 pi/3   ];
m = [1 1 1 1 0 0];   % mask matrix
T0 = fkine(rob, qready);
t = [0:.056:2];
% do inverse kinematics
qreach =  rob.ikine(T0, preach, m);
[q,qd,qdd]=jtraj(qready,qreach,t);
%compute inverse dynamics using recursive Newton-Euler algorithm
tauf = rne(rob, q, qd, qdd);
% forward dynamics
[t1,Q,Qd] = rob.fdyn(2,tauf(5,:),q(5,:), qd(5,:));
</code>```

But due to

```<code>qreach =  rob.ikine(T0, preach, m);
</code>```

it shows error

Index exceeds matrix dimensions.

Error in SerialLink/jacobn (line 64) U = L(j).A(q(j)) * U;

Error in SerialLink/jacob0 (line 56) Jn = jacobn(robot, q); % Jacobian from joint to wrist space

Error in SerialLink/ikine (line 153) J0 = jacob0(robot, q);

Can anybody explain me why this is happening and how to resolve it.

Thanks.

答:
In the Robotics Toolbox

SerialLink.ikine()

can only be used for 6 dof or higher structures.

The masking option you have used, can be used fo underactuated robots. There is an example in the documentation, how a 3dof robot could be considered a 6dof underactuated robot. However, it is also stated in the manual, that:

For robots with 4 or 5 DOF this method is very difficult to use since
  orientation is specified by T in world coordinates and the achievable
  orientations are a function of the tool position.

Using SerialLink.ikcon() instead might be viable alternative.


问:
How to make RRT to work for dynamic systems?
I want to make path planning algorithm for a quadrotor with RRT in my thesis. I have searched lots of articles and come up with the concept of "dynamic RTT" and one of the articles has a title "kinodynamic RRT*". I have emailed the author of the article with no response.

The main point that I couldn't understand is, we need to sample random state for dynamic RRT like 2 position and 2 velocity values for planar vehicle or an angle and its rate in case of 2D-quadrotor.

How should the samples be so that speeds and positions does not confused and when should I consider the saturation limits of the actuators or vehicle acceleration limits.

I can't understand how to handle what if two consecutive samples for positions are A(0,0) and B(10,10) this needs positive velocity at the point B but sampling can cause negative velocity. Am I wrong?

Other issue is, how should the control signal be determined so that it can be applied for duration of delta t to move as close as possible to the sampled point. I am not sure how to determine the input or move the vehicle.

Do I need optimizations so that it can reach to the sampled point in shortest time possible?

Please let me know if there is a missing part to be understood.

Thanks in advance.

Wish a hopeful new year.

答:
Dynamic Systems are described via system identification. That is a procedure to generate a physic engine on-the-fly. The physic engine can predict the future state of the system. An example: the quadrotor has a speed of 10 mph and runs into a wall. The physics engine aka "dynamic system" can predict the collison.

RRT is used for solving the optimal control problem. It calculates the control signals for the quadcopter for reaching a given goal like "fly to a point", "be in balance". The paper which is cited in the comments tries to adapt RRT for kinodynamic planning with the aim of reducing the search space. According to my research the best RRT-like algorithm for solving optimal control is DARRT which was invented by BostonDynamics engineer Jennifer Barry.


问:
Angles from gyroscope readings using quaternions
I am using gyroscope only to get real time angles as I move the IMU using a micro controller.

I am able to get angles at a pretty decent accuracy(2 to 3 degree error). I am using quaternions for obtaining angles.

The angles are with respect to the initial position of the IMU.

I rotate the IMU around individual axis i.e around any one Axis at a time, I get good accuracy. But when I rotate around all axis at once the problem starts as stated below.

Problem:

The problem here is when I give a pitch and then yaw all seems fine. Now at this position of pitch and yaw, I give a roll, the other two angles also change.

The gyroscope gives raw angular rate in DPS, which is converted to radian/sec for processing. The quaternions are calculated from raw angular rate.

The code to convert quaternions to euler angles is as follows,

```<code>//Local variables for clarity
fqw = gsangleparam.fquaternion[0];
fqx = gsangleparam.fquaternion[1];
fqy = gsangleparam.fquaternion[2];
fqz = gsangleparam.fquaternion[3];

//Calculate Angles*/
gsangles.yaw = atan2(2 * (fqx*fqy + fqw*fqz), (fqw*fqw + fqx*fqx - fqy*fqy -    fqz*fqz)) * 180/PI;

gsangles.pitch = asin(-2 * (fqx*fqz - fqw*fqy)) * 180/PI;

gsangles.roll = atan2(2 * (fqy*fqz + fqw*fqx), (fqw*fqw - fqx*fqx - fqy*fqy  + fqz*fqz)) * 180/PI;
</code>```

The Problem of roll is present only when initial position(and also 180 deg counterpart) is as follows:

X - Facing left

Y - Facing towards us

Z - Facing UP

The problem is, When I give a pitch(around X here),yaw(around Z) and then roll(around Y here) or any sequence of roll pitch and yaw, then yaw changes.

In fact whenever I rotate about Y axis(roll here), Yaw(around Z) changes.

There is no problem when the initial position is(and also 180 deg counterpart) as follows,

X - Facing away from us

Y - Facing towards us

Z - Facing UP

There is no problem. i.e When I give a pitch(around Y here),yaw(around Z) and then roll(around X here) or any sequence of roll pitch and yaw, there is no problem.

Why is this happening?? can anyone please explain.
Thanks in advance.

答:
I'll link you to some math but try to give a conceptual explanation, too.

Consider a case where you want to start with the IMU upright and pointed forward and want to end with the IMU upside-down (new +z = old -z) but still pointed forward (new +x = old +x).

How do you get from the starting position to the end position?

Easiest way is to rotate about +x an angle of 180 degrees. (Roll)

You could rotate about +y an angle of 180 degrees and then rotate about the new +z axis an angle of 180 degrees (Pitch then Yaw)

You could rotate about +z an angle of 180 degrees and then rotate about the new +y axis an angle of 180 degrees (Yaw then Pitch)

There are other ways you could do it, too - you could rotate about successive axes in 90 degree increments, a bunch of little increments, etc. The point is, you need to define what your order of rotations are to get from one particular starting orientation to get to a particular ending orientation for your rotation angles to make sense.

The problem that you're seeing is that your gyroscope is likely setup to assume a roll first, followed by a pitch, followed by a yaw. That's (again, probably - check your datasheet) the order of rotations the gyro is giving you, but you are giving it a a pitch first, then yaw, which are the last two rotations in the sequence, then giving it the first rotation - roll.

You're giving it the first motion last, which means that it has to go "back" and update the pitch/yaw angles to correct for the fact that you didn't rotate it the way it wants to report the angles to you.

Try doing a roll first, followed by a pitch then a yaw and see if your angles hold steady with that order of rotations. Check your datasheet for specifics, but I think most systems are setup for roll/pitch/yaw (rpy) order.


问:
Has a robot ever taken a complete IQ test?
And if so, what was the highest score so far?

Some news articles suggest only parts of tests were aced.

Update since people censored this question and closed it. There was an AI that has taken an IQ test and scored similar to a 4 year old.

http://phys.org/news/2015-10-ai-machine-iq-score-young.html

The AI system which they used is ConceptNet, an open-source project run by the MIT Common Sense Computing Initiative.
Results: It scored a WPPSI-III VIQ that is average for a four-year-old child, but below average for 5 to 7 year-olds

Abstract

We administered the Verbal IQ (VIQ) part of the Wechsler Preschool and Primary Scale of Intelligence (WPPSI-III) to the ConceptNet 4 AI system. The test questions (e.g., "Why do we shake hands?") were translated into ConceptNet 4 inputs using a combination of the simple natural language processing tools that come with ConceptNet together with short Python programs that we wrote. The question answering used a version of ConceptNet based on spectral methods. The ConceptNet system scored a WPPSI-III VIQ that is average for a four-year-old child, but below average for 5 to 7 year-olds. Large variations among subtests indicate potential areas of improvement. In particular, results were strongest for the Vocabulary and Similarities subtests, intermediate for the Information subtest, and lowest for the Comprehension and Word Reasoning subtests. Comprehension is the subtest most strongly associated with common sense. The large variations among subtests and ordinary common sense strongly suggest that the WPPSI-III VIQ results do not show that "ConceptNet has the verbal abilities a four-year-old." Rather, children's IQ tests offer one objective metric for the evaluation and comparison of AI systems. Also, this work continues previous research on Psychometric AI.

Update. A robot has passed the Japanese college entrance test and has an 80% chance of being accepted. Since it scored more than the average, that would make the IQ > 100, especially since college applicants have an IQ greater than average, and especially since Japanese are smarter than average humans. http://gizmodo.com/an-ai-program-in-japan-just-passed-a-college-entrance-e-1742758286

The Wall Street Journal reports that the program, developed by Japan’s National Institute of Informatics, took a multi-subject college entrance exam and passed with an above-average score of 511 points out of a possible 950. (The national average is 416.) With scores like that, it has an 8 out of 10 chance of being admitted to 441 private institutions in Japan, and 33 national ones.

答: To the best of my knowledge no robot has ever been subjected to an IQ test. This is in part because the IQ test is not considered a valid test of intelligence amongst. It was originally developed as a test to determine whether any given child needed special attention in school and was later altered to apply to adults. Since then it has been shown to really only measure awareness of social norms. Some have argued that this awareness is indicative of intelligence but it's not generally accepted. Dr. Rolf Pfeifer's book Understanding Intelligence has a great discussion of this topic in chapter 1.</p>


问:
Is there any error analysis of Irobot Create 2?
I am curious about the travelling distance/turning angle accuracy of Irobot Create 2. E.g., if the program let Create 2 go forward for 10 m, will Create 2 go forward exactly 10 m?

What is the possible error for Create 2 for both travelling distance and turning angle? I did not find related information in the Irobot create 2 manual.

Is there any one could help me with the above questions?

答:
On their own, the resolution of the wheel encoders is pretty good.  With a wheel diameter of 72 mm, and 508.8 counts per revolution, there is about 0.44 mm per count.  And the angular resolution is also good.  Turning in place with 1 encoder count yields 0.00378 radians (0.217 degrees).

Unfortunately, for motions like going forward 10 m, the robot can only perform open-loop control.  Because there is no overarching ground-truth to close the loop.  (For example with a motion capture system like OptiTrack).  So the robot is at the mercy of environmental factors like carpet drift, differences in wheel diameter, differences in motor torque, wheel slippage, etc.  This, combined with low-cost electronics which limit the resolution of the velocity controller (about 28.5 mm/s per step), make it so the robot might not actually drive very straight.

As I mentioned earlier, this is largely due to external conditions so iRobot makes no claims regarding the accuracy of the Create2.  It is up to you to test under your own conditions.

P.S. All specs above are mentioned in the OI Spec document.


问:
Comparison of Balance Bot design
I'm planning to build a Balance Bot and I would like to know which design should I go with. There's a vertical design such as the ArduRoller and on the other hand, there's the typical stacked type of deign. I have attached images below for both of them.

Although both of these are based on the principle of Inverted Pendulum, how do these differ from each other in terms of stability and response (assuming both the designs are of the same size)? Is the mass distribution in the vertical design better? Also, is there a difference in programming them?

答:
The "Balance Bot" robot you describe is widely known as the "inverted pendulum on a cart". For static balancing (keeping the body upright), it is generally desired to have as much as possible time to recover from toppling. This implies that it is desired to have the natural toppling speed of the pendulum as low as possible, or equivalently, to have the toppling duration as long as possible.

As you probably know, balancing a pencil on your finger is much harder than balancing a broom, which is due to the fact that the broom topples slower. It turns out that it topples slower because it is longer. This will also be true for your balancing robot. The model that has the center of mass highest from the ground is the best candidate for balancing, which seems to be the second robot because the (heavy) battery pack is placed on top.

What is then the relation between length and toppling speed?

A measure that can be used to describe toppling speed is the time constant of toppling $\tau$. The higher this value, the longer the duration of toppling (i.e. toppling is slower), and thus the easier it is to balance. The time constant of toppling for a simple point mass inverted pendulum is $\tau=\sqrt{L/g}$ for small toppling angles, with $L$ the length of the pendulum (defined by the distance between the hinge and the center of mass) and $g$ the gravitational acceleration. For example, a robot with a center of mass that is 4 times higher will topple approximately 2 times slower. Or, if it is not feasible to make your robot sufficiently tall, you can always send it off to another planet with lower gravity...

As for your second sub-question, programmability, I do not see how placing the microcontroller either vertically or horizontally should make a difference. It is furthermore up to you to pick the microcontroller of your choice when building your own machine.

Title: Comparison of Balance Bot design


问:
How to interpret and use values of an accelerometer
Currently, I'm building a quadcopter using Arduino. To make the copter able to stabilize I use an mpu6050 accelerometer + gyroscope.

I understand that I can get the angle of rotation by integrating the values of the gyro. I understand too that I can calculate the angle using the amount of G working on the different axes of the accelerometer.

But from the accelerometer I get values from around 1000 to 14000.

What are these values?

How can I get the angle from these values?

How can I turn these values into motor rotation?

答:
You should really read the datasheet that acs linked in a comment to your question.

The device you're using has a set of 16-bit analog to digital converters (ADCs) that convert the actual outputs of the gyroscopes and accelerometers to a digital format the microcontrollers can process.

The device outputs positive and negative accelerations and speeds, which means the output needs to be interpreted as a signed 16-bit integer. That is, the raw (unsigned) 16-bit number would normally read from 0 to 65535, but it's signed so you need to interpret the output as existing between -32768 to 32767.

Once you get the raw output put into the correct signed integer output, you need to scale it to get the reading of the sensor. This depends on the "full scale selection" you make when you configure the device. On page 12 of the datasheet, you can see, for the gyroscope, the "Sensitivity Scale Factor" for each selection.

$$
\begin{array}{}
\mbox{PARAMETER}                & \mbox{CONDITIONS} & \mbox{TYP} & \mbox{UNITS} \\
\mbox{Sensitivity Scale Factor} & \mbox{FS_SEL=0}   & 131        & \mbox{LSB}\left(^\circ /s\right) \\
                                & \mbox{FS_SEL=1}   & 65.5       & \mbox{LSB}\left(^\circ /s\right) \\
                                & \mbox{FS_SEL=2}   & 32.8       & \mbox{LSB}\left(^\circ /s\right) \\
                                & \mbox{FS_SEL=3}   & 16.4       & \mbox{LSB}\left(^\circ /s\right)
\end{array}
$$

So you take your signed integer, divide by the value given for the scale factor (again, based on how you have the device configured), and get your reading.

If you've got the maximum value, 32767, and you've got FS_SEL=2, then your sensor is reading (32767/32.8) = 998.99 $^\circ /s$, which is approximately the +1000 degrees per second limit for that FS_SEL setting.

The accelerometer scale settings are given on the next page (13), but generally speaking it works the same. The accelerometer reading is also a signed 16-bit output.

As you correctly stated in your question, you need to numerically integrate the outputs to get to positions and angles. The accelerometer outputs an acceleration, so you need to integrate once to get speed and then again to get position. The gyroscope outputs angular velocities and thus needs to be integrated once to get to angular positions (angles).

Generically, numeric integration is done as follows:

$$
\mbox{output}_k = \mbox{output}_{k-1} + \mbox{input}_k \Delta T \\
$$

The current value for the integrated term is the previous value plus the rate term multiplied by the sample interval. So, for example, current speed is previous speed plus acceleration multiplied by the sample interval. Angle is the previous angle plus angular speed multiplied by the sample interval.

I'm not sure what your background is or how you got to work on this project, but getting from the output of an inertial measurement unit (IMU, a device that gives accelerometer and gyro readings) to a flight controller is quite a step.

There are lots of questions here (and elsewhere) about quadrotor flight controllers. Generally speaking, most flight controllers operate on PID control loops. You provide, via control inputs, the desired angular positions, angular rates, linear speeds, etc., as the "reference input." The controller subtracts the IMU feedback from the reference input to get a "control error."

If you want to go forward, and the vehicle is stationary, the control error is (+v - 0) = +v, which means the vehicle should move forward. You can modify the error terms by multiplying the errors by "control gains." The gains scale the error terms. Bigger gains make the controller "think" there is more error and force a larger response.

A lot of tuning is trial and error; too little throttle and you don't get a response. Too much throttle and the system goes unstable.

Most of what I've said about controls and controllers is hand waving; if you don't have controls experience then I'd recommend doing just a controls project; if you don't have programming experience, I'd recommend doing just a programming project, etc.

Trying to go from no experience to building your own quadrotor from scratch is a good way to get really discouraged fast. There are so many things to try to manage that it's not a good way to build fundamental experience.


问:
Motion planning with sequential convex optimization
I recently read a paper titled Finding Locally Optimal, Collision-Free
Trajectories with Sequential Convex Optimization by John Schulman, Jonathan Ho, Alex Lee, Ibrahim Awwal, Henry Bradlow and Pieter Abbeel.

The authors mention that the end-effector final pose constraint can be readily incorporated in the planning scheme which is based on solving an unconstrained optimization with the equality and inequality constraints added in penalty function.

Let $F_{targ} \in $ SE(3) be the desired pose and $F_{cur}(\theta)$ be the current pose, then the pose error is given as $F^{-1}_{targ}F_{cur}(\theta)$. However, I am wondering that if we plan motion in the joint space, then how can this error be incorporated in the objective function as a penalty term?,since $F_{cur}(\theta)$ is a highly nonlinear, $nonconvex$ forward kinematics map, are we linearizing the forward kinematics map to make it convex and add it in the penalty formulation?

答:
This isn't my area of expertise, but it looks like your guess in your question is correct. From the paper:

Let $F_{\mbox{targ}}$ denote the target pose of the gripper, and let $F_{\mbox{cur}}(\theta)$ be the current pose. Then $F^{-1}_{\mbox{targ}} F_{\mbox{cur}}(\theta)$ gives the pose error, measured in the frame of
  the target pose. This pose error can be represented as the six dimensional
  error vector $h(\theta) = (t_x, t_y, t_z, r_x, r_y, r_z)$ (26).

Earlier in the paper, it is stated, "

Sequential convex optimization solves a non-convex optimization
  problem by repeatedly constructing a convex subproblem — an approximation to the problem around the current iterate x. The subproblem is used to generate a step
  ∆x that makes progress on the original problem.

And, earlier still,

Robotic motion planning problems can be formulated as non-convex optimization problems, i.e., minimize an objective subject to inequality and equality constraints:

$$
\begin{array}{ll}
\mbox{minimize } f(x) & (1) \\
\mbox{subject to}    & (2) \\
g_i(x) ≤ 0, i = 1, 2, . . . , n_{\mbox{ineq}} & (3) \\
h_i(x) = 0, i = 1, 2, . . . , n_{\mbox{eq}} & (4)
\end{array}
$$
  where $f$, $g_i$, $h_i$, are scalar functions.

[...later...]

The nonlinear constraints are incorporated into the problem as penalties, while the linear constraints are directly imposed in the convex subproblems.

So, in Algorithm 1, line 15 gives where the $h(\theta)$ error vector is incorporated:

$$
x \leftarrow \mbox{arg min}\tilde{f}(x) + \mu \Sigma_{i=1}^{n_{\mbox{ineq}}} \left|\tilde{g}_i(x)\right|^+ + \mu \Sigma_{i=1}^{n_{\mbox{eq}}} \left|\tilde{h}_i(x)\right|
$$

I wish there were more detail or a worked example; I don't see where "TrueImprove" or "ModelImprove" is given, I don't see how the initial convex approximations are calculated, etc.


问:
Torque in kg/cm?
I was looking up the motor parameters for some stepper motor where they listed the torque of the motor at different current/voltage but the torque they listed was in kg/cm.

How is kg/cm even a remotely acceptable unit for torque?

How do I calculate the torque in Nm from kg/cm?

Clarity note: Its not kgcm which represents [0.098 kilogram force = 1 Nm.]

Website where this happens.

答:
It is most likely kgf-cm, as kg/cm is not a valid unit for torque.

Apparently writing kg/cm when kgf-cm is meant is a common mistake made on datasheets.

According to this conversion of kgf-cm to Nm, 28 kgf-cm of torque is 2.7 Nm, and 150 kgf-cm of torque is 14.7 Nm.

Title: Torque in kg/cm?


答:
are we linearizing the forward kinematics map to make it convex and
  add it in the penalty formulation?

No. The reason is that "convex optimization" is not the solution it is the problem description like "minimize the function f(x) with constraints a,b and c". The same mistake made Emo Todorov in his paper A convex, smooth and invertible contact model for trajectory optimization. The trajectory optimization problem is described as logic calculus but that shows only that we have a np-hard problem which is not solvable on current hardware.

Title: Motion planning with sequential convex optimization

Body:
I recently read a paper titled Finding Locally Optimal, Collision-Free
Trajectories with Sequential Convex Optimization by John Schulman, Jonathan Ho, Alex Lee, Ibrahim Awwal, Henry Bradlow and Pieter Abbeel.

The authors mention that the end-effector final pose constraint can be readily incorporated in the planning scheme which is based on solving an unconstrained optimization with the equality and inequality constraints added in penalty function.

Let $F_{targ} \in $ SE(3) be the desired pose and $F_{cur}(\theta)$ be the current pose, then the pose error is given as $F^{-1}_{targ}F_{cur}(\theta)$. However, I am wondering that if we plan motion in the joint space, then how can this error be incorporated in the objective function as a penalty term?,since $F_{cur}(\theta)$ is a highly nonlinear, $nonconvex$ forward kinematics map, are we linearizing the forward kinematics map to make it convex and add it in the penalty formulation?


问:
Cascaded PID in Quadcopter control
I'm working on diy flight controller for quadcopter. I have a question for which I can't find a good answer. So perhaps you could help me.
I'm using a cascaded PID controller for Pitch and Roll regulation.
First there is a stabilize PID and rate PID. For the first (stab.) you input desired angle from transmitter and actual angle from IMU. then this output is feed into rate controler. From there it goes to the motors.

In code I'm pooling a function with "data is ready to read from IMU" which happens every 1ms. In this function I'm calculating one regulator and writing to motors. Loop time when this condition is not true is way lower then that. So one regulator should be inside this slow loop and one outside. So which one should be fast and which one slow?
In my understanding, stabilize PID should be the fastest? Is that correct?
Also should both regulators be PID?

Thanks for your help!

答: I had some trouble understanding your current setup, But generally you will have an interrupt pin connected to your IMU, and every time the IMU has new data, you process the Rate control loop then the Stabilize control loop, then update the motor output. You want the shortest possible time from the reading of the IMU data to the processing of the rate control loop to the output of the motor commands. Generally you can update the stabilize loop ~5 times slower than the rate loop to save time. I would shoot to run the rate loop as fast as you can update the motors (50Hz for pwm 400+Hz if your using Oneshot or Fast PWM), and to save time you can run the stabilized loop at 10-50Hz.</p>

Title: Cascaded PID in Quadcopter control


问:
What is the learning (control) algorithm inside Cubli?
As in this video: https://www.youtube.com/watch?v=qce5Vguj5Jg

In this new version (did not see the learning part in the past versions), with three to four trials, Cubli can learn to balance on a new surface.

答:
A Linear–quadratic regulator (LQR) controller with an accurate state-space representation is implemented in Gajamohan's first and second paper. A high quality motor controller with torque-control is also necessary for the system to work.

The learning algorithm is called gradient descent algorithm. It is used to find the local minimum, and is used to find the initial wheel velocities.  They mentioned in this robohub post[1] is to implement the learning algorithm, and is finally implemented by Mr. Muehlebach three years afterwards[2] in 2016.

[1] G. Mohanarajah and M. Waibel, "Cubli – A cube that can jump up, balance, and walk across your desk", Robohub, 2013, http://robohub.org/swiss-robots-cubli-a-cube-that-can-jump-up-balance-and-walk-across-your-desk/

[2] M. Muehlebach, and R. D'Andrea, "Nonlinear Analysis and Control of a Reaction Wheel-Based 3-D Inverted Pendulum", in IEEE Transactions on Control Systems Technology, 2016.


答:
A cascaded PID controller is normally used when multiple sensors are available. In a normal PID controlled system, you have the measurement from your sensor and your setpoint (both used to calculate your error), and your PID controller which acts to reduce the error through the P, I and D gains. A cascaded PID controller is a nested PID controller, meaning it consists of an inner PID loop which supposedly is faster and an outer PID loop. If applied correctly the faster inner PID loop controller can buffer the impact on the slower outer PID controller resulting in a smoother dynamic performace.

Normally in a quadcopter, the inner/faster loop is the rate loop. The rate loop regulates the angular velocity given a setpoint and the rate measurement usually from the gyroscope. The outer loop/slower loop is the stabilize loop which uses angle input setpoints and measurements from fusing the angles computed from the accelerometer and angles integrated from the gyroscope via sensor fusion (eg. kalman, complementary filter, etc.)

Mathematically, in this case a normal/traditional PID controller (PID) would be equivalent to a cascaded PID controller (P-PI). Where your Kp(traditional) is equivalent to Kp(stab), Ki(traditional) is equvalent to Kp(stab)*Ki(rate) and lastly your Kd(traditional) to Kp(stab)*Kp(rate). See Edouard Leurent's easy to understand explanation/comment here: https://www.quora.com/What-is-rate-and-stabilize-PID-in-quadcopter-control

I'm really sorry because I did not quite understand your question but I hope this helps :)

Title: Cascaded PID in Quadcopter control

Body:
I'm working on diy flight controller for quadcopter. I have a question for which I can't find a good answer. So perhaps you could help me.
I'm using a cascaded PID controller for Pitch and Roll regulation.
First there is a stabilize PID and rate PID. For the first (stab.) you input desired angle from transmitter and actual angle from IMU. then this output is feed into rate controler. From there it goes to the motors.

In code I'm pooling a function with "data is ready to read from IMU" which happens every 1ms. In this function I'm calculating one regulator and writing to motors. Loop time when this condition is not true is way lower then that. So one regulator should be inside this slow loop and one outside. So which one should be fast and which one slow?
In my understanding, stabilize PID should be the fastest? Is that correct?
Also should both regulators be PID?

Thanks for your help!


问:
Can I use digital animation software to define the movements of humanoid robots?
I'm working with a lifesize (~130cm) humanoid robot (Hubo+) and looking for a way to easily program new motions and gestures into him. Obviously, I could write my own tool, but I am looking for a solution that can leverage existing tools or standards for robot motion. My first thought was trying to use animation software like Blender or Maya, and writing a script to extract the joint angles at keyframes. However, few robotics researchers are probably proficient with Maya. (I know I'm not!)

Is there already some kind of 3D posing tool for robotics that is a standard? The only things I have seen so far that comes close is the Pose Utility in RoboPlus and Choregraphe for the Nao, but both programs seem limited to particular robots and don't appear to be extendable to Hubo.

So my questions are:

Are there standard file formats for robot motion? Not 2D wheeled robot motion. Arm and leg motion! Something equivalent to the .bvh file format used in motion capture.

Do you know of any WYSIWYGish tool for creating robot motion using keyframes and inverse kinematics?

答:
The short answer is that I don't think a good standardized motion file format exists and I don't think there are any good generic wysiwyg robot posing tools.  Some level of custom programming is going to be required.

RE: Standard file formats for robot motion

Collada is meant as a standardized 3D data interchange file format, and it has support for storing basic animation and physics type information with a model. Support is not consistent across tools though, especially for the animation/physics data.

Beyond that, it's unlikely you'll find any general use file formats for storing robotic animation.  (Although not 100% comparable, check out the wikipedia list of motion/gesture file formats.)  Everything I have seen is specific to the platform and/or proprietary. Consider that the game and CAD industries are orders of magnitude larger and more specific than robotics. They have similar requirements, yet there is no defacto file format.

If you are interested in a more programmatic view of the data by these proprietary systems though, then looking at the specialized tools used by these industries might give you some additional options and ideas. Examples:

Autodesk MotionBuilder and API

The Unreal Animation System

SolidsWorks Motion Studies & SolidWorks API

The creation, storage, and execution of character animation (often humanoid), in particular, is well represented and very advanced in the game development industry. For a price. I believe most of the larger studios have an entire team dedicated to doing nothing more than converting data from one system to another and feeding it through a production pipeline.

One recurring problem with using game development tools (or creative type 3D tools in general) for robotics is that in games/movies, is that it's usually okay if the animation doesn't model reality exactly. That can cause issues when applied to real world robots.

RE: Posing Tools

Robotic simulators (like Coppelia's V-REP or even MS Robotics Studio) might be of use if they provided an API/export of some sort and were able to simulate humanoid type robots. I don't know of any that support a full humanoid model though. Most are just for modelling arms and wheeled robots. Still, perhaps you could model your humanoid movements as an collection of independent arm subsystems? i.e. The left leg is one robotic arm.  If so, then a few more wsyiwyg tools would be open to you.

Flowstone is another visual tool that could be used for posing, but probably not the wysiwyg that you had in mind.

If you don't need WYSIWYG and are open to some programming, you might want to check out PyPose and Nuke.

Similarly, but requiring more advanced programming, various physics engines might be of interest for taking in all the inputs (3D models and associated parameters) and then providing movement results by applying forces and inverse kinematics. Examples include ODE and Bullet physics. A similar programmatic slanted option would be to use ROS. I've seen a few projects and notes regarding potential ROS support for humanoid type motions.

All that said... although difficult to learn, I still think Blender3D has potential to be one of the better all around options for advanced hobbiest type robotics posing and motion work, particularly due to it's tight integration with the Python programming language.  Someone already pointed out the Blender Robotics wiki in the comments. You should also review Grantlo321's YouTube video using blender to control servos playing a piano, as well as the blog post by Justin Daily where he describes using Blender/Python for servo control.  I agree that Blender3D is hard to learn, but that is likely going to be true with almost any 3D wysiwyg type software unless it's focus is very narrow.


问:
Depth accuracy of the stereo camera
I am doing a project on calibrating stereo ZED camera and  finding its accuracy and compare with the Manufacturer's accuracy of 1% at 1m depth accuracy.
For this purpose , the formula to calculate the depth accuracy  is
$dz = (z^2 * de) / (f * b)$
but how do we calculate $z$ , $de$ and $f$. Is is taken from matlab stereo-callibration app which gives 'Stereoparameter' ?

$dz$ is the depth error in meters, $z$ is the depth in meters, $de$ is the disparity error in pixels, $f$ is the focal length of the camera in pixels and $b$ is the camera baseline in meters.

答:
You have to "estimate" your disparity error somehow (depending you the stereo matching algorithm used etc.) and you should be set. f and b are camera constants and z is the depth in which you make the measurement.

You can also see my answer on a related question: How can I improve ZED Camera precision?

Title: Depth accuracy of the stereo camera


问:
Inverse kinematics showing incorrect results for 4 dof robot in MATLAB using Robotics Toolbox
I'm doing inverse kinematics for 4 dof robot using robotics toolbox matlab. The code is given below:

```<code>    preach = [0.326 0.223 0.342]; % reach point of end-effector
% create links using D-H parameters
% Link('d', 0.15005, 'a', 0.0203, 'alpha', -pi/2)
L(1) = Link([0  0     0.15   pi/2    0], 'standard');
L(2) = Link([0  0     0.15   0       0], 'standard');
L(3) = Link([0  0     0.15   0       0], 'standard');
L(4) = Link([0  0     0.15   0       0], 'standard');
  % set limits for joints
 L(1).qlim=[deg2rad(-160) deg2rad(160)];
 L(2).qlim=[deg2rad(-45) deg2rad(45)];
 L(3).qlim=[deg2rad(-60) deg2rad(60)];
 L(4).qlim=[deg2rad(-50) deg2rad(50)];
 %build the robot model
rob = SerialLink(L, 'name','rob');
qready = [0 0 0 0]; % initial position of robot
plot(rob,qready,'noname');
T1= transl(preach); % convert of reach point of 4x4 homogenous matrix
[qreach,err] =  rob.ikcon(T1, qready); % find inverse kinematics with error
</code>```

Matlab shows results like this(using robotics toolbox ):

```<code>    >> [qreach,err] =  rob.ikcon(T1, qready)
qreach =
    2.7925    0.7854    1.0472    0.8727
err =
    9.6055
</code>```

I'm not taking preach = [0.326 0.223 0.342]; randomly. Infact, first I do forward kinemtics to get these points. code is below:

```<code>    % to find forward kinemtics
qreadyrr = [0.6 0.45 0.63 0.22]; % setting the four angles randomly within range to get preach
T0 = fkine(rob, qreadyrr);
</code>```

then, I got T0 as

```<code>     >> T0
T0 =
    0.2208   -0.7953    0.5646    0.3267
    0.1510   -0.5441   -0.8253    0.2235
    0.9636    0.2675    0.0000    0.3421
         0         0         0    1.0000
</code>```

Also, when I put this T0 in place of T1 in inverse kinematics code as given above, the values I got is very accurate with negligible error.

```<code>    >> [qreach,err] =  rob.ikcon(T0, qready)
qreach =
    0.6002    0.4502    0.6296    0.2204
err =
   4.6153e-07
</code>```

The point is, in my case, I have only px, py and pz values for transformation matrix but with this, inverse kinematics is not solving it correctly. I want to do inverse kinematics px, py and pz values. how can I do it correctly.

Thanks.

答:
The T0 matrix in your code has an orientation component which (since it comes from the forward kinematics) is a reachable orientation.

The T1 matrix in your code has been created with the command:

```<code>T1= transl(preach);
</code>```

It most probably look like this

```<code>T1 =
1.0000   0.0000    0.0000    0.3267
0.0000   1.0000    0.0000    0.2235
0.0000   0.0000    1.0000    0.3421
     0         0        0    1.0000
</code>```

This specifies that the orientation of the end-effector is [0, 0, 0]. This orientation might not be possible to reach in the position you have specified.

Body:
The T0 matrix in your code has an orientation component which (since it comes from the forward kinematics) is a reachable orientation.

The T1 matrix in your code has been created with the command:

T1= transl(preach);

It most probably look like this

T1 =
1.0000   0.0000    0.0000    0.3267
0.0000   1.0000    0.0000    0.2235
0.0000   0.0000    1.0000    0.3421
     0         0        0    1.0000

This specifies that the orientation of the end-effector is [0, 0, 0]. This orientation might not be possible to reach in the position you have specified.


问:
Is this large bipedal robot real or realizable?
I saw this link today. This robot seems real, but redditors on a reddit thread argued that it might be CGI. It doesn't seem unfeasible to make such as robot IMO. There isn't anything out of the norm from the video except the size. Plus, there exist Kurata and Megabot, though they don't make bipedal robot, the scale is similar. From roboticist's point view, is this robot real? What are the technological limitation preventing such a robot being developed if it's fake? </p>

答: On the video is a 4 meter tall mecha robot which makes heavy noise while walking forward. To determine if this is a real robot or fake, the first step is to enter the name of creator Vitaly Bulgarov into a search engine like Linkedln to find more about him. Linkedln says that Bulgarov works for the gaming-industry and is an artist. So it is normal, that Google Scholar and ResearchGate has no papers from him. From a academic point of view, he doesn't exists. If this is a real robot, it wasn't created by any universities worldwide. From the technical point of view this kind of mechanic is possible. The most advanced university driven project is until now is "SRI DURUS".</p>


问:
Velocity Relation for Parallel Robots
In my course of "Advanced Robotics" with "Fundamental of Robotic Mechanical Systems" as the reference book I saw the following equation as the velocity relation for parallel manipulators such as the one depicted on the pic.

$$\mathbf{J}\mathbf{\dot{\theta}}=\mathbf{K}\mathbf{t}$$

$\mathbf{\dot{\theta}}$ is the joint rate vector and $\mathbf{t}$ is the twist.

where $\theta_{J1}$ for $1\leq J\leq 3$ is the actuator.

It was indicated there that usually the matrix $\mathbf{J}$ is a diagonal matrix referring to the borders of the work space. But the proof for this velocity relation was just given case by case. In another word there was no general proof of this equation.

So here are my questions

Is there a way to derive a general velocity formula for parallel manipulators ? (a formula that would show the relation between joint rates and twists).

Are there cases in which $\mathbf{J}$ is not a diagonal matrix ?

答:
If you can write the forward kinematics equations of a parallel robot in an explicit form, you can derivate those equations and you get the formula for the velocities. This is  generally valid approach for all robots, but the formulae obtained are only valid for the specific structure.

If the jacobi matrix is diagonal it means that the motions of the robot are decoupled. i.e. if only one joint moves, only one component of the 6 (or 3 the planar case) velocities of the end effector will change. The ISOGlide type parallel structures have a diagonal jacobi matrix, as published here. Portal or Cartesian type structures, like this,  also have a diagonal jacobi matrix. Delta robots, Stewart platfroms, Scara robots and 6 axis puma robots do not have a diagonal jacobi matrix.

(By looking at the schematic you attached, and not doing the math, I am not convinced that the robot you described has a diagonal jacobi matrix)

Title: Velocity Relation for Parallel Robots


问:
Source to learn Kalman Fusion, explanatory code snippets
Currently I am reading a book of Mr. Thrun: Probabilistic Robotics. I find it really helpfull to understand concept of filters, however I would like to see some code in eg. Matlab. Is the book "Kalman Filter for Beginners: with MATLAB Examples" worth buying, or would you suggest some other source to learn the code snippets from?</p>

答:
If you are looking for a source to get an intuitive feeling for what the Kalman Filter is actually doing I would suggest going through lesson 2 of Udacity's Artificial Intelligence for Robotics course found here:
https://www.udacity.com/course/cs373.

The course is free and it has video lectures and simple code examples. The explanation given is a little simplistic but it does help to build an intuition for how and why the filter works.


问:
Integrating Forward Kinematics Map
Let the forward kinematics map be denoted by $\mathcal{F}$ such that

$\mathcal{F}: \theta \in \mathbb{R}^{n} \rightarrow g \in SE3$

Let the minimal representation of $g$ be given by $x \in \mathbb{R}^{6}$ using axis-angle or other forms of attitude parametrization. If we differentiate the forward kinematics map, we get

$\dot{x} = J_{a}\dot{\theta}$, where $J_{a}$ is the analytical Jacobian. This equation is commonly used in numerical inverse kinematics. However, can we do the reverse?

$x(t_{f})-x(t_0) = \int^{t_{f}}_{t_{0}}J_{a}\dot{\theta}dt$

答:
(EDITED TO CLARIFY PARENTHETICAL ABOUT CARTESIAN MANIPULATORS)

Your equation is true in general only for those manipulators in which $J_a$ is independent of $\theta$ (such as with Cartesian manipulators).  Otherwise, the expression is only true in the small (the region of $\theta$ close to $\theta_{t=0}$.

The equation is not true in general because elements of $J_a$ often contain functions of $\theta$.  I suppose if you could integrate the expression it would be true, but that just gets you back to  your original kinematics function.  The Jacobian represents a linearization of the kinematic mapping.  It is only a first-order approximation, so the expression does not hold globally.

(EDIT BASED ON OP COMMENT)

If you do want to numerically integrate using your equation, you would need to modify (update) $J_a$ at each iteration based on the new values of $\theta$.  This would then be similar to the algorithm for velocity control, although I believe your timestep would be finer.

Title: Integrating Forward Kinematics Map


问:
Reading multiple signed digits from serial port
I'm using simulink support package for arduino to read serial data from port2 in Arduino due. My plan is to read signed integers (-415 for example) representing motor speed and feed it to the pid controllers as in the image.

from the far end i'm sending delimited data in the following shape . The matlab function in sumlink is supposed to read the received ASCII characters and add them to a variable until it reaches the end character '>'. I'm using the following simple code just to give the output on both the Right and Left to check if I'm receiving the correct data, However I'm not.

```<code>    function [Right ,Left] = fcn(data,status)

SON = '<';
EON = '>';

 persistent receivedNumber;
 receivedNumber = 0;

 persistent negative;
 negative = false;

 if(status ==1)

    switch(data)

    case EON
        if (negative)
            receivedNumber = -1*receivedNumber;

        else
            receivedNumber = 1*receivedNumber;
        end

    case SON
        receivedNumber = 0;
        negative = false;

    case {'0','1','2','3','4','5','6','7','8','9'}
        receivedNumber = 10*receivedNumber;
        receivedNumber = receivedNumber + double((data - 48));

    case '-'
        negative = true;

    end

 end

    Right = receivedNumber;
    Left = receivedNumber;

end
</code>```

Can anybody tells if there are any other approaches to read multiple signed digits in simulink? Taking into consideration that I have to use the support package for Arduino since my pid controllers are already configured in Simulink and interfaced with port2 in Arduino (which will be connected to BeagleBone black)

答:
It looks like you're doing this in a very round-about manner. You said,

The matlab function in sumlink is supposed to read the received ASCII characters and add them to a variable until it reaches the end character '>'.

It looks like you are thinking the "signed numbers" are coming in as a string that you'll read one digit at a time, where the entire string is delimited by a start and stop magic number (the '<' and '>' symbols).

A couple of things I would point out:

First and foremost, typically a signed integer is just sent as a byte or (more typically) a series of bytes. For example, a 16-bit signed integer (short signed integer) is composed of two 8-bit bytes. To convert to the signed 16-bit integer, just use the Matlab function int16. You're doing it the especially long and painful way of sending a string, with delimiters, then reading that string in one digit at a time, converting the characters to numbers, then multiplying the current number by 10 every time you want to concatenate a new digit.

Probably where you're running into more trouble code-wise is that you're not using the Matlab persistent function correctly. From the documentation

If the persistent variable does not exist the first time you issue the persistent statement, it is initialized to the empty matrix.

This is the check you should be making. If the variable you want to be persistent is empty, then initialize it to zero. You are currently declaring it persistent and then immediately setting it to zero every function call!

Your code is:

```<code>persistent receivedNumber;
receivedNumber = 0;
</code>```

when it should be:

```<code>persistent receivedNumber;
if isempty(receivedNumber)
    receivedNumber = 0;
end
</code>```

This way, receivedNumber only gets set to zero IF IT IS EMPTY (meaning it was just created). In all other cases it should be retaining the value it had and thus would be NOT empty. For the record, you need to do the same thing for negative; they're both being implemented incorrectly.

Now, about your other question,

Can anybody tells if there are any other approaches to read multiple signed digits in simulink?

Yes, there are a couple things you could do. First, you could just concatenate the string and convert to double when you're done. That would look something like the following:

```<code>if(status ==1)
    switch(data)
        case EON
            output = str2double(receivedNumber);
        case SON
            receivedNumber = char;
        otherwise
            receivedNumber(end+1) = data;
    end
end
</code>```

This code creates output by converting the running receivedNumber to a 'double' format when you hit the end of number delimiter. On receiving the start of number delimiter, output is reinitialized to an empty character array. Any other input appends whatever the current character is to the string.

In going through the code looking for your output variable, I noticed that you have Left and Right, which output your current receivedNumber. I'd point out that, generally speaking, receivedNumber is an intermediate result. I would create a persistent variable called output instead, assign Left and Right to the output, and then only update output when you have a full number to report.

You could further "bulletproof" the function by checking that the output of the str2double command is, in fact, a number, and that you didn't pick up a mis-transmitted byte somewhere along the way that would look something like -1Q65.

Right now you don't have any error checking in your inputs; if you get a mis-transmitted byte that is not a valid digit then you just skip handling it and then treat the next valid digit as correct. This is probably not what you should be doing; if, for example, you should have gotten -1065 and got -1Q65 instead, your code would output:

```<code>0;
1;
1;
16;
165;
-165;
</code>```

The first zero is the output when you get '<', then you output 1 when you receive it, then you output 1 again because you don't handle Q, then you output 16, then 165, then you apply the negative sign when you hit the end delimiter >. The way I would suggest doing it instead would be:

```<code>persistent output;
persistent receivedNumber;
if isempty(output)
    output = 0;
    receivedNumber = char;
end
if status == 1
    switch(data)
        case '<'
            receivedNumber = char;
        case '>'
            tempResult = str2double(receivedNumber);
            if ~isnan(tempResult)
                output = tempResult;
            end
        otherwise
            receivedNumber(end+1) = data;
    end
end
</code>```

Now your output is all zeros until the number is done being parsed, then it's the output number. The more important thing here is that, when you start receiving the next number, the output continues to be the previous number until the current number is done being parsed. If there is a misformed byte somewhere, the str2double conversion will output a NaN (Not A Number), and the ~isnan() (not isnan; Matlab uses ~ instead of !) check catches the mis-created number and the result is discarded.

Consider your previous code getting -1065, -1Q65, and then -1064. There's almost no difference there, so I wouldn't expect much response from your PID controller, but the way you're handling your feedback will give you nothing but headaches. You would get:

```<code>0;
1;
10;
106;
1065;
-1065;
0;
1;
1;
16;
165;
-165;
0;
1;
10;
106;
1064;
-1064;
</code>```

There are 18 numbers there, only three of them have the correct sign, and only two of them are actually correct. Granted you were given a faulty input, but what should your system do in that circumstance? Error out, discard the input, or pass the faulty input as truth?

Whatever your decision on how an error should be handled, for control purposes, you should only be releasing complete and valid data.

:EDIT:

I just re-read my answer, and thought I'd reiterate that the persistent function isn't being used correctly. All of my examples of what your output would be are assuming you fix that. Otherwise, you code would output only whatever the current digit is.

Body:
It looks like you're doing this in a very round-about manner. You said,

The matlab function in sumlink is supposed to read the received ASCII characters and add them to a variable until it reaches the end character '>'.

It looks like you are thinking the "signed numbers" are coming in as a string that you'll read one digit at a time, where the entire string is delimited by a start and stop magic number (the '<' and '>' symbols).

A couple of things I would point out:

First and foremost, typically a signed integer is just sent as a byte or (more typically) a series of bytes. For example, a 16-bit signed integer (short signed integer) is composed of two 8-bit bytes. To convert to the signed 16-bit integer, just use the Matlab function int16. You're doing it the especially long and painful way of sending a string, with delimiters, then reading that string in one digit at a time, converting the characters to numbers, then multiplying the current number by 10 every time you want to concatenate a new digit.

Probably where you're running into more trouble code-wise is that you're not using the Matlab persistent function correctly. From the documentation

If the persistent variable does not exist the first time you issue the persistent statement, it is initialized to the empty matrix.

This is the check you should be making. If the variable you want to be persistent is empty, then initialize it to zero. You are currently declaring it persistent and then immediately setting it to zero every function call!

Your code is:

persistent receivedNumber;
receivedNumber = 0;

when it should be:

persistent receivedNumber;
if isempty(receivedNumber)
    receivedNumber = 0;
end

This way, receivedNumber only gets set to zero IF IT IS EMPTY (meaning it was just created). In all other cases it should be retaining the value it had and thus would be NOT empty. For the record, you need to do the same thing for negative; they're both being implemented incorrectly.

Now, about your other question,

Can anybody tells if there are any other approaches to read multiple signed digits in simulink?

Yes, there are a couple things you could do. First, you could just concatenate the string and convert to double when you're done. That would look something like the following:

if(status ==1)
    switch(data)
        case EON
            output = str2double(receivedNumber);
        case SON
            receivedNumber = char;
        otherwise
            receivedNumber(end+1) = data;
    end
end

This code creates output by converting the running receivedNumber to a 'double' format when you hit the end of number delimiter. On receiving the start of number delimiter, output is reinitialized to an empty character array. Any other input appends whatever the current character is to the string.

In going through the code looking for your output variable, I noticed that you have Left and Right, which output your current receivedNumber. I'd point out that, generally speaking, receivedNumber is an intermediate result. I would create a persistent variable called output instead, assign Left and Right to the output, and then only update output when you have a full number to report.

You could further "bulletproof" the function by checking that the output of the str2double command is, in fact, a number, and that you didn't pick up a mis-transmitted byte somewhere along the way that would look something like -1Q65.

Right now you don't have any error checking in your inputs; if you get a mis-transmitted byte that is not a valid digit then you just skip handling it and then treat the next valid digit as correct. This is probably not what you should be doing; if, for example, you should have gotten -1065 and got -1Q65 instead, your code would output:

0;
1;
1;
16;
165;
-165;

The first zero is the output when you get '<', then you output 1 when you receive it, then you output 1 again because you don't handle Q, then you output 16, then 165, then you apply the negative sign when you hit the end delimiter >. The way I would suggest doing it instead would be:

persistent output;
persistent receivedNumber;
if isempty(output)
    output = 0;
    receivedNumber = char;
end
if status == 1
    switch(data)
        case '<'
            receivedNumber = char;
        case '>'
            tempResult = str2double(receivedNumber);
            if ~isnan(tempResult)
                output = tempResult;
            end
        otherwise
            receivedNumber(end+1) = data;
    end
end

Now your output is all zeros until the number is done being parsed, then it's the output number. The more important thing here is that, when you start receiving the next number, the output continues to be the previous number until the current number is done being parsed. If there is a misformed byte somewhere, the str2double conversion will output a NaN (Not A Number), and the ~isnan() (not isnan; Matlab uses ~ instead of !) check catches the mis-created number and the result is discarded.

Consider your previous code getting -1065, -1Q65, and then -1064. There's almost no difference there, so I wouldn't expect much response from your PID controller, but the way you're handling your feedback will give you nothing but headaches. You would get:

0;
1;
10;
106;
1065;
-1065;
0;
1;
1;
16;
165;
-165;
0;
1;
10;
106;
1064;
-1064;

There are 18 numbers there, only three of them have the correct sign, and only two of them are actually correct. Granted you were given a faulty input, but what should your system do in that circumstance? Error out, discard the input, or pass the faulty input as truth?

Whatever your decision on how an error should be handled, for control purposes, you should only be releasing complete and valid data.

:EDIT:

I just re-read my answer, and thought I'd reiterate that the persistent function isn't being used correctly. All of my examples of what your output would be are assuming you fix that. Otherwise, you code would output only whatever the current digit is.


问:
Is ROS (Robot Operating System) mandatory?
Do we have to build ROS for robotic research/application? What is the main advantage? When or in which situations ROS is mandatory?</p>

答:
Disclaimer:
This answer is somehow a reaction to the Shahbaz' post, so it has a pro-ROS bias.

I do not think that ROS is mandatory, but it is a great starting point and worth the time to invest. It started within Willow Garage, but this company vanished and
ROS is still alive, used and developed. Most of ROS is fully open source and also
commercially usable so there is no way that ROS is just going to vanish if a company is no longer interested in it.
The code quality of course differs between the core modules and implementations of cutting edge algorithms that some phd student published with his paper.

ROS is picking up more and more speed in industrial settings (I'd be surprised if there is a significant portion of robotics startup worldwide that do not use ROS).
Some algorithms are going to be further maintained and developed by the ros-industrial consortium and if you have a look at the members, it's a good bet that ROS is going to become a standard in the industry:

http://rosindustrial.org/ric/current-members/

The distributed way of using ROS helps a lot to create and maintain new packages, especially within teams. The message and action definitions help a lot in defining interfaces so that hardware and algorithms can be exchanged quickly. It also helps to integrate new team members as a new node will node bring down other nodes if it crashes (as long as it does not eat all the RAM..) so it's rather safe to integrate partially working nodes into the running system as their effect is limited. The communication uses TCP which is reliable and fast (on a local machine), so that message passing is very quick (several hundred Hz for a control loop is possible).

Non-Real-Time

ROS is currently not realtime as the vast majority of algorithms have no need for realtime. Sensing or planning does not have realtime constraints in most cases (how many people are building self driving high speed cars?). It's enough if the final control loop runs in realtime and this can in many cases be done directly on the motor (to which the final position is send e.g. via CAN). Real Time however is one of the core goals of ROS2 (https://github.com/ros2/ros2/wiki/Real-Time-Programming) so even if you need this in the future for the whole system, ROS has you covered.

If you really want to run stuff embedded, there is of course a connection to arduino, so that you can write ROS messages directly on the arduino which then are send via serial connection.

Running ROS on Windows is currently rather a pain, but as Windows is moving closer to Linux (even starting to have something bash-like), it's only a matter of time until it's possible. (But who wants to run a robot with windows anyway?)

Hardware Interfaces and Algorithms:

I think this really is a strong point for ROS. A lot of commercially available robots already come with a ROS interface or someone already invested some time to implement the interface. Most commercial arms can be used in MoveIt so much of the work to get an application to run with a specific arm can be reused with another hardware.

Community:

Another strong point for ROS. New algorithms get a ROS-interface very quickly and a lot of people had the same problems as you so you will find someone to help you.

http://download.ros.org/downloads/metrics/metrics-report-2016-07.pdf


问:
How is PIV control performed?
I'm considering experimenting with PIV control instead of PID control. Contrary to PID, PIV control has very little explanation on the internet and literature. There is almost a single source of information explaining the method, which is a technical paper by Parker Motion.

What I understand from the control method diagram (which is in Laplace domain) is that the control output boils down to the sum of:

Kpp*(integral of position error)

-Kiv*(integral of measured velocity)

-Kpv*(measured velocity)

Am I correct? Thank you.

答:
In industry, this type of control is still generally referred to as PID control and I've seen many applications of it. It's main benefit stems from the fact that it removes the "derivative kick" caused by an abrupt change in set point and thus is useful for applications where set point tracking is most important (rather than fast disturbance rejection). See http://www.controlguru.com/wp/p76.html.

Image showing difference in derivative kick of PID and PIV
http://controlguru.com/wp-content/uploads/2015/08/pidkickbig.jpg

Title: How is PIV control performed?


问:
One motor, two wheels (motor direction rotates one wheel forward, reverse for other wheel)?
Rewriting this whole question as I've learned a lot more since I first tried to ask.

I'm building a tiny bot and looking to use two motorized wheels for movement, but only one motor. I'll have a 3rd wheel (caster) for balance.

My goal is to have the wheels move opposite to each other when the motor turns and each wheel reverse direction when the motor reverses direction.

The tricky part is I want the ratio to be uneven between the wheels. By this, I mean when one wheel rotates clockwise, it should rotate faster than the other wheel rotating counter-clockwise. This needs to hold true regardless of which wheel is rotating which way.

The end result should be that I could run the motor in one direction continuously to have my bot drive in a small circle. If I switch motor directions, it would drive in the same size circle the opposite direction. If I alternate motor directions frequently enough, the bot should move in a fairly straight line (or if I alternate the motor too infrequently, an S like pattern).

The closest I can envision so far (thanks to those that have responded here) is to use bevel/miter gears to have my wheels rotate opposite to each other and then to use two differently sized ratcheting mechanisms per wheel working in opposite directions. This would allow each ratcheting mechanism to trigger only in one direction and the RPM per direction would be related to the size of that direction's ratcheting mechanism.

Is this the best way to achieve my goal? Is there a name for this concept or is it so uncommon I'll have to build/fabricate it all myself? As far as a ratcheting mechanism, I believe I'd be looking to use a freewheel clutch or I'd need an oscillating lever carrying a driving pawl over top a ratchet gear. My biggest struggle in finding affordable parts is the ratcheting mechanism.

答:
Are you talking about a bevel gear? Here's a video - the gold gear would be connected to the motor and the blue gears would be connected to your wheels.

Both wheels are always powered - one is powered in forward and the other is powered in reverse.

You're not clear on the purpose of this device, so I don't know if this fits your needs.

A differential allows the wheels to rotate at different speeds, but they generally still rotate in the same direction. You could use a brake band or something similar to lock an output axle and force all of the drive power to be delivered to the other wheel, but then one wheel is locked and not able to turn freely.

Hopefully this helps, but again I'm not clear on what you want to do. Generally it's best to provide your end application if you're looking for help on naming a particular mechanism.


答:
Do you want the non-engaged wheel to be locked in place while the other wheel is rotating?  If so, I cannot think of any transmission that will do this easily without getting rather complicated.

If you can accept the non-engaged wheel being free to rotate (as if in neutral), then you may be able to take advantage of a clever arrangement of simple mechanisms to do the job.  The two that come to mind are both described at Carnegie-Mellon's Introduction to Mechanisms course.  You could place a ratchet that engages in one direction to drive the ratchet wheel attached to one wheel's axle, and does not engage when it is rotated the other direction.  Then do the reverse ratchet design for the other wheel.  You could also use two opposite-direction engaging overdriven clutches to accomplish the same purpose.

Both of these implementations will have considerable backlash, and the non-driven wheel will be uncontrolled.  It is not clear if that is acceptable to your application.

I do not know of any common term for such a device, but it sounds like fun to develop!

Title: One motor, two wheels (motor direction rotates one wheel forward, reverse for other wheel)?

Body:
Rewriting this whole question as I've learned a lot more since I first tried to ask.

I'm building a tiny bot and looking to use two motorized wheels for movement, but only one motor. I'll have a 3rd wheel (caster) for balance.

My goal is to have the wheels move opposite to each other when the motor turns and each wheel reverse direction when the motor reverses direction.

The tricky part is I want the ratio to be uneven between the wheels. By this, I mean when one wheel rotates clockwise, it should rotate faster than the other wheel rotating counter-clockwise. This needs to hold true regardless of which wheel is rotating which way.

The end result should be that I could run the motor in one direction continuously to have my bot drive in a small circle. If I switch motor directions, it would drive in the same size circle the opposite direction. If I alternate motor directions frequently enough, the bot should move in a fairly straight line (or if I alternate the motor too infrequently, an S like pattern).

The closest I can envision so far (thanks to those that have responded here) is to use bevel/miter gears to have my wheels rotate opposite to each other and then to use two differently sized ratcheting mechanisms per wheel working in opposite directions. This would allow each ratcheting mechanism to trigger only in one direction and the RPM per direction would be related to the size of that direction's ratcheting mechanism.

Is this the best way to achieve my goal? Is there a name for this concept or is it so uncommon I'll have to build/fabricate it all myself? As far as a ratcheting mechanism, I believe I'd be looking to use a freewheel clutch or I'd need an oscillating lever carrying a driving pawl over top a ratchet gear. My biggest struggle in finding affordable parts is the ratcheting mechanism.


问:
Kuka KR16L-2 robot simulation base and wrist rotation inconsistent with original robot
The issue is regarding simulation of Kuka robot KR16L6-2 in MATLAB using Robotics toolkit by Peter Corke. I wish to simulate  the kinematic before passing a command to real robot for motion.

I have attached the DH-Parameters. Apart from this I have also tried many other combination of orientations but to no useful effect.

The problems is that the robot base rotates counter-clockwise by default for positive increases in Joint1, while the original robot moves in the opposite direction. Similarly for the wrist roll, i.e. Joint 4, the direction of simulation is reversed.

In order to confirm that it's not my mistake only, I searched for similar ready made simulation software. Although it did not include the same KUKA robot, a similar variant (KUKA_KR_5_sixx_R650) was available. Hence, KUKA_KR_5_sixx_R650 had one set of motions for base and wrist in RoKiSim v1.7 for positive increases in joint angle and reverse motion in roboanalyzerv7  .

NOTE: Only the rotation of J1 (base) and J4 (Wrist Roll) are reversed
and I want to recreate the results of RoKiSim v1.7 in Matlab where rotations are similar to the real world robot spec provided by KUKA.

答:
I'd recommend putting a layer between your internal DH-model and the manufacturers axis conventions. (The differ for different manufacturers, so your IK will not be reusable otherwise. Zero positions varies as well.) KUKA likely does something similar given that you find stuff like this in $machine.dat:

$AXIS_DIR[1]=-1
$AXIS_DIR[2]=1
$AXIS_DIR[3]=1
$AXIS_DIR[4]=-1
$AXIS_DIR[5]=-1
$AXIS_DIR[6]=-1

Regarding the "reverse engineering" mentioned in the other answer: The file mentioned above contains lots of kinematic parameters as well.

Edit: Just noticed the post date. Why did this show up in my sidebar?


答:
A freewheel clutch attached to each wheel will do what you want.

When turned in one direction the clutch will transmit power to the wheel but in the opposite direction it will free spin.

This way when the motor is turned in one direction one wheel will turn and in the other direction the other wheel will turn in the same direction as the first.

The catch is you will have no ability to reverse.


问:
Sensors, Methods for Finding Other Robots
If I can constrain two robots to a hypothetical box, what sensors or common formal methods exist that would enable the two robots to meet? I am specifically interested in the communication of relative position between robots.</p>

答:
Found a great platform just by Googling "communication between robots" called Jasmine. By "great", I mean well documented. I am reading through their Communication documentation, now. It starts out (in the very first paragraph) by saying:

Communication works different in most robotic swarms, depending mostly
  on factors like the environment, the size of the robots, the budget of
  the project and on the limitations set by creators or other instances.
  The larger the robots are, the more possibilities are there for
  building up a properly working communication between the robots. Some
  ways of communication are bluetooth, wireless LAN, communication via
  the environment(stigmergy) or like in the case of Jasmine via infrared
  LEDs.


答:
I would recommend using the XBee protocol to develop a point to point communication unit. What you need is an xbee adapter - which contains both a transmitter and a receiver. You can transmit data serially between the two robots which allows you to send the position of each robot. The implementation details (error checking, parity codes, parsing) are abstracted away from you when using the Xbee and you can set up an xbee connection between two robots like a serial connection.

If you are focussing on getting two robots to meet, you can transmit their position with respect to a fixed coordinate frame in the box using two Xbees and then calculating the relative position of one robot from the other robot and control their heading to intersect each other's center of mass. This way you are guaranteed that the two robots will move towards each other. This is not an optimal way to get to robots to move towards each other in the presence of obstacles - in which case you should go for more sophisticated path planning algorithms like A*, D* Lite etc.

The range is governed by the type of antenna, the transmitting power and the frequency of transmission. Lower frequency com equipment tends to have larger penetration power and thus more range. However, legal restrictions on the frequencies civilians can use depends on the country you are in. (900 Mhz is legal in the US but illegal in India. 2.4GHz is legal, free to use ISM band worldwide). The more your transmitting power, the more the range you will get but this too is regualated by the RF restrictions in your country.

Title: Sensors, Methods for Finding Other Robots

Body: If I can constrain two robots to a hypothetical box, what sensors or common formal methods exist that would enable the two robots to meet? I am specifically interested in the communication of relative position between robots.</p>


问:
Why are industrial machines called robots?
The definition of a robot is as follow: "A robotic paradigm can be described by the relationship between the three primitives of robotics: Sense, Plan, and Act."

An example could be the famous "Kuka Robots". The Kuka robot is preprogrammed and does mainly one loop over and over again. Some of them could have measurement sensors but that is all. They do not think or plan nor do they make decisions.

An automatic door opener, used in a building is not a robot either but according to the robotic paradigm definition they are more a robot than a Kuka machine. They actually get some data from a sensor followed by planning and acting.

So why are Kuka machines called robots?

答: The problem is, there is no set standard definition on what a robot is. In our perspective, a robot should be like "Honda's ASIMO." Which is not the case. It is much more complex. Robots can be controlled by humans and not controlled by humans, either definition is perfectly acceptable.</p>


问:
Denavit-Hartenberg parameters for SCARA manipulator
I'm going through the textbook Robot Modeling and Control, learning about the DH convention and working through some examples.

I have an issue with the following example. Given below is an image of the problem, and the link parameter table which I tried filling out myself. I got the same answers, except I believe there should be a parameter d1 representing the link offset between frames 1 and 2. This would be analogous to the d4 parameter.

If anyone could explain why I might be wrong, or confirm that I have it right, that would be great. I hate it when it's me against the textbook lol.

Cheers.

答:
I'm a Chinese college student and also find this problem when learning industral robot.
If you clearly identify the motion of the SCARA robot, you'll find that the distance of each joint is stable, for example the distance of joint 1 and 2 is always the b1. So just review the definition of bi: the joint offect. I think you're correct.
Please find the Page 110 5.17- from the book , written by SAHA. There is clear dipict of sturature about SCARA robot.
Any commutation, welcome to e-mail me.
sailong.wu@gmail.com</p>


问:
Parallel axis theorem to determine the moment of inertia
I need to use the parallel axis theorem to determine the moment of inertia of each robotic arm link referred to the joints of the 3 DOF manipulator. The moments of each link's centre of mass are:

The link joints are located according to the following coordinates from each link's centre of mass and the link masses are specified as:

I know that solve Izz, Iyy and Ixx to use the following equations:

Ixx = Ixx + m(ry^2 + rz^2)

Izz = Izz + m(rx^2 + ry^2)

Iyy = Iyy + m(rx^2 + rz^2)

But I'm not sure how to solve this particular problem, I was thinking since y1 and z1 both equal 0, to solve the question for that link I need to solve I1yy and I1zz is that right?

答:
If the distance between the axes is zero, then there is no change in the inertia for that specific axis.

You can verify your calculations with a CAD software. Most of them (Solid Works, Inventor, Catia, etc.) can calculate the intertia of solid bodies in any defined reference frame (coordiante system).


问:
Converting a differential equation into its Laplace transform
Given the differential equation of a current controlled electric actuator, how would I convert the differential equation into its Laplace transform?

$$ J \frac{d^2 \phi(t)}{dt^2} + D \frac{d \phi(t)}{dt} + H \phi(t) = K i(t) = 0 $$

I know the reason you're meant to convert this to laplace is because it's easier to work with but I'm finding it difficult to understand why you do certain things in certain parts.

Any concrete method on how to convert this would be appreciated.

答:
If J, D, H, and K are independent of time, you use the property of the Laplace transform that the derivative in the time domain is the same as multiplying by $s$ in the frequency domain.  Then you have to subtract off the initial condition as shown in the first two examples on these Cal State Fullerton math pages.  But really, any web search for differentiation and Laplace transform will get you multiple hits that explain it.

So the Laplace transform of your equation would be

$$ J (s^2 \Phi(s) - s \phi(0) - \phi\prime(0)) + D (s \Phi(s) - \phi(0)) + H \Phi(s) = K I(s) $$


问:
Has a robot ever taken a complete IQ test?
And if so, what was the highest score so far?

Some news articles suggest only parts of tests were aced.

Update since people censored this question and closed it. There was an AI that has taken an IQ test and scored similar to a 4 year old.

http://phys.org/news/2015-10-ai-machine-iq-score-young.html

The AI system which they used is ConceptNet, an open-source project run by the MIT Common Sense Computing Initiative.
Results: It scored a WPPSI-III VIQ that is average for a four-year-old child, but below average for 5 to 7 year-olds

Abstract

We administered the Verbal IQ (VIQ) part of the Wechsler Preschool and Primary Scale of Intelligence (WPPSI-III) to the ConceptNet 4 AI system. The test questions (e.g., "Why do we shake hands?") were translated into ConceptNet 4 inputs using a combination of the simple natural language processing tools that come with ConceptNet together with short Python programs that we wrote. The question answering used a version of ConceptNet based on spectral methods. The ConceptNet system scored a WPPSI-III VIQ that is average for a four-year-old child, but below average for 5 to 7 year-olds. Large variations among subtests indicate potential areas of improvement. In particular, results were strongest for the Vocabulary and Similarities subtests, intermediate for the Information subtest, and lowest for the Comprehension and Word Reasoning subtests. Comprehension is the subtest most strongly associated with common sense. The large variations among subtests and ordinary common sense strongly suggest that the WPPSI-III VIQ results do not show that "ConceptNet has the verbal abilities a four-year-old." Rather, children's IQ tests offer one objective metric for the evaluation and comparison of AI systems. Also, this work continues previous research on Psychometric AI.

Update. A robot has passed the Japanese college entrance test and has an 80% chance of being accepted. Since it scored more than the average, that would make the IQ > 100, especially since college applicants have an IQ greater than average, and especially since Japanese are smarter than average humans. http://gizmodo.com/an-ai-program-in-japan-just-passed-a-college-entrance-e-1742758286

The Wall Street Journal reports that the program, developed by Japan’s National Institute of Informatics, took a multi-subject college entrance exam and passed with an above-average score of 511 points out of a possible 950. (The national average is 416.) With scores like that, it has an 8 out of 10 chance of being admitted to 441 private institutions in Japan, and 33 national ones.

答:
Well, there have been many AI programs written specifically to ace IQ tests. Like this one and this one. I don't think there have been any robots (computer programs which control mechanical components) which have been administered an IQ test, but, TBH, you don't need a robot for this -- just a program.

Update: looks like I'm wrong, this 2012 paper says (I've only skimmed) that while AI may be able to be written to solve certain types of IQ problems, others are beyond our current reach.


问:
Plug & play motors, actuators and drivers system
I was wondering if anyone knew of any easy-to-use plug and play systems, that allow you to build and programme a number of actuators and motors quickly and easily?

I'm thinking something like Lego Mindstorms, but for adults. I.e. with more powerful motors. I need to be able to generate a torque of around 10 Nm, at a speed of around 10 rpm, and I need to control the rotation angles. Could be either stepper motors, or normal DC motors with hall sensors to measure number of rotations. I'm at the beginning of my journey into robotics, so don't mind paying a bit more for the parts in favour of speeding up my learning curve!

If it's not clear already, I'm looking for an "off-the-shelf" product, with a range of products I can browse, and accumulate an increasing number of components over the years.

Many thanks in advance for any suggestions!

答:
Maybe you are interested on the Maxon motor kit, but is a little expensive, but, you can control DC motors precisely like servos, because they comes with rotation encoders and are very powerful and enough RPM's for big scale robotic, using positioning controllers over CANopen protocol or if you prefer, can control motors using Arduino or PI sending signals to the drivers, but it includes his own software...
Maxon motors are used for the most sophisticated applications on robotics, take a tour for the Maxon's web: http://www.maxonmotor.com/ you can request catalogs and find many other resources for learning...</p>


问:
Learning micro-controller programming
Is learning microcontroller programming useful for one who want to specialize in robotics I don't mean platforms like Arduino , Teensy , I mean mcu itself like Arm cortex etc.</p>

答: I would say yes. At the lowest level in terms of robotic project development, you need to interface with hardware, e.g. sensors, motors, etc. So there's always demand in those area. As of if ARM uCs are worth learning, I would say yes also, since they are the most popular uCs on the market, you can find them on many platforms. </p>

Title: Learning micro-controller programming