11

Proportional term: this controls how quickly to turn the steering when the heading is not at the set value. A low P will lead to sluggish steering, reacting only slowly to set heading changes. It may never reach the commanded value. A higher P will give a snappier response, ideally with the steering turning rapidly and smoothly to follow commanded heading ...


7

Robots with two opposing wheels and usually a castor wheel for balancing reasons (no motor attached) are called Differential Drive Robots.


5

Your linear velocity should be the average of both wheel values. Assuming there's some wheel radius of WHEEL_RADIUS, as you've stated, then you should get each wheel speed as: left_velocity = left_rpm * (RPM_TO_RAD_PER_S * DIST_PER_RAD); right_velocity = right_rpm * (RPM_TO_RAD_PER_S * DIST_PER_RAD); linear_velocity = 0.5f * (left_velocity + right_velocity);...


4

At first, I did not go trough your code to check for errors in the formulas but from a high level perspective this seems ok. Therefore, your position controller is fine. What you lack is a lowlevel controller for the PWM signal. This controller should take the error of w_l - e.g. e_w_l - and w_r and provide a duty cycle accordingly. For that you should ...


3

Your instincts are correct if you are talking about rotating both wheels forward (or reverse) with the same rotational speed. In that case, the robot would move linearly forward (or backward), just as you describe. The drawings at the link you provide seem to support this. However, this analysis is different from what the text describes. I think the ...


3

Kinematics of mobile robots For the figure on the left: I = Inertial frame; R = Robot frame; S = Steering frame; W = Wheel frame; $\beta$ = Steering angle; For the figure on the right: L = Distance between the wheels; r = radious of the wheel; Now we can derive some useful equations. Kinematics: $\hspace{2.5em}$ $\vec{v}_{IW} = \vec{v}_{IR} + \vec{\...


3

To append Demetris answer, if it has tank-like treads or even 4 fixed wheels, then you can also call it a skid steer vehicle.


3

I would add a few lines after you check that theta is between +/- 2pi: meanDistance = (SL + SR)/2; posX = posX + meanDistance*cos (theta); posY = posY + meanDistance*sin(theta); This of course assumes theta is positive CCW starting from the +x-axis. This is similar but not the same as your code for X and Y, but your code appears to put the X origin on the ...


3

In order to do this, you need to have something on the robot that can intercept your "single joystick" signal from the remote control and translate it to left/right wheel speeds. Your arduino might be able to serve this purpose, with the appropriate shield. For that calculation, check out this question on calculating left and right motor speeds based on ...


3

A few things: I took a look at your data set. Did you make sure you used the time column correctly? The first entry is "1429481388546050050" without the decimal. To make it in seconds, it should be 1429481388.546050050. Your motion model is fine (I've used it before, for people who want to see it derived, it is very similar to this one). However, to avoid ...


3

OK. as drawn, ignoring mass and accelerations, the force $F_p$ will appear as a torque on your ball screw. However, the total force on the ball screw, and hence the torque, depends on the mass of the thing you're moving with the ball screw interacting with gravity (if it's being moved in anything other than a horizontal plane), and on whether or not the ...


3

EKF sensor fusion is achieved simply by feeding data streams from different sensors to the filter. So all you need to do is setup your implementation to accept both encoder and IMU data. This is basically a matter of providing different versions of the observation model matrix $\mathbf{H}$ that converts states to sensor measurements, one for each sensor. It'...


2

You aren't properly mapping your steering value to the wheel speeds. In fact, I don't think you're applying the PID correctly at all. From your code, my guess is that you're using get_segment_center to determine the adjustment that you need to make. My assumption is that this describes a distance measurement of how far the line sensor is off of the ...


2

Pure pursuit is the standard method for following a trajectory with a differential drive (or ackerman steering) robot. It is a very simple technique. You should be able to search for it and find some (very old) papers describing it.


2

I have a bot with 2 independently driven wheels. I chose to use a gyro to keep it heading in the desired direction, bumps slippage and even picking it up and turning it around are of little consequence to it as it will just correct it's heading. I use a single PID, which adds/subtracts a correction to the desired current speed for each of the 2 motors in ...


2

At the foundation of PID control, there is the assumption that the quantity you are measuring (and using to compute your error) has a direct linear relationship with the quantity you are controlling. In practice, people frequently bend this rule without things going horribly wrong. In fact this resiliency to modeling error--when our assumptions (our "model")...


2

To make compatible gears, you need to match the pitch and shape of the teeth. First, check out this wiki article about gears and especially the image about nomenclature, so you have a good idea of the names for things: You first need to determine the pitch of the gear you want to match, the 8-tooth gear. If it has a diameter of say 10 mm, then take the ...


2

Thanks for the update. Now it looks like $x_c$ and $y_c$ denote the origin/starting position, and $\theta$ is positive, measured CCW from the positive x-axis. Now I am even more concerned about the equations you're using. Consider just $x$. You have: $$ x_k = x_{k-1} - \frac{v}{\omega} \sin{(\theta)} + \frac{v}{\omega} \sin{(\theta + \omega \Delta t)} $$ ...


2

Andy's response is good, and he hits all of the important points but to fully understand PID control in the context of a differential drive robot, it might be useful to take a step back and consider the dynamics of the system. This may seem like a digression from your specific question, but if you take the time to read through, I am confident that this will ...


2

The answer is very simple; Steer drive is what you know from a car where one motor powers both the wheels (either the front or the rear wheels) and then steering is achieved by turning the front wheels right or left. Differential drive means having two motors, one that powers all wheels (or the track) on the right side and one that powers all wheels on the ...


2

The short answer is that the equations/models for these different vehicle should be different but there is no value in using more accurate equations. All these equations are approximations that make assumptions about how the ground and wheels/tracks interact. If there is 2 wheels and no slipping of the wheels on the ground, then the equation is reasonably ...


2

It depends what Arduino you are going to use. I don't think that you can use Arduino Nano/Micro for this because you will not have enough I/O and memory. You can use Arduino Mega (maybe UNO) but you will have to utilize hardware interrupts for all the communication and measurement stuff. I have done a similar robot a few years ago utilizing interrupts only ...


2

It seem that your are missing some intuition about the function of a Kalman filter type filtering method. To a large degree the working principle of the Kalman filter is combining information from different sources in order to create estimates greater than the measurements from either individual sensor. The advantage of the Kalman filter is that it offers a ...


2

I can't use any line-following method. Actually, you are quite wrong, the way I understand the problem. It is a line-following. It is just that the line is not painted (like on the road). The line is the edge of the table. The way I see it, your robot needs to look up, and detect the line "painted" by the edge of the table on the ceiling. Once the ...


2

The problem you are describing is quite similar to line following from a controls perspective, there is a difference in how the line is detected. Line following robots use a wide variety of ways to detect line. Simplest is probably photo-resistors or phototransistors, however magnetic stripes (lines) and hall effect sensors have been quite popular in the ...


2

For a similar problem (TT motors can't start the bot rolling on a carpet) I have been toying with the idea of setting up PID control for the angular velocity. If it stays stuck, the integral term will start upping the power. Once it suddenly breaks loose, the differential term will throttle it back. That's the idea, anyway -- someday I'll actually try it. ...


2

This looks like a common angle wrapping mistake. I am assuming you're defining your angles between -180° ($-\pi$) to +180° ($\pi$). Let's say your current heading is -170°. And you desired heading is 170°. The error in angle is: 170 - (-170) = 340, so your robot has to do almost a full turn to get to the desired heading. Since you're defining your angle in ...


2

tl;dr: don't worry about it Your system really operates in continuous time, described by differential equations. It's a convenient, even necessary, approximation to use discrete time and difference equations. The dynamics solution would result from integrating the differential equations; the difference equations approximately solve the problem by doing ...


1

OK, I'm going to work on the assumption that you are trying to calculate the Instantaneous Centre of Curvature, and that the values of $R$ and $\theta$ that you have been given are the distance from the ICC to the mid-point of the wheel axle and the direction of travel relative to the x-axis. That should correspond with the diagram below, taken from ...


1

You can alter the C code structure in the Controller, so that the code you want to test is indepencent from platfrom specific code. (You can only test the platform independent code using Software in the Loop anyways.) I am not sure what ways are available in C in order to achive this, but all inversion of control methods, e.g. Dependency injection, have ...


Only top voted, non community-wiki answers of a minimum length are eligible