Robotics StackExchange | Archived questions

How do we align the robot's orientation each and every instant in delivering a PID controlled motion to a desired location x, y ?

ROS Developers!

Although its a basic conceptual stuck up, I am trying to implement a PID controller for the position control of the turtlebot w.r.t odom frame. From various sources I was able to come to some conclusions but still not a fully understandable concept. My control variable is again the velocity (both linear and angular). If anybody can direct me to some reference material which gives a glimpse of the control of the angular orientation of the robot to reach the desired location x, y or provide some basic conceptual guidance then it would be very helpful for me. or is there any built in packages which can be directly used please do direct me to the right forum.

thanks

Asked by Vignesh_93 on 2021-03-27 02:43:32 UTC

Comments

Answers

CLosing the question as its solution is already available online. Below is snipped of my version of the function of a proportional controller, since I had defined inside a class I will be having self, self can be removed if defined outside the class:

while (not self.destination):
            robotPosition, currentOrientation = self.getOdom()
            errorX = x - robotPosition.x
            errorY = y - robotPosition.y
            self.distance = math.sqrt(errorX**2 + errorY**2)
            print(f"The distance error is {self.distance}")
            self.requiredPathAngle = math.atan2(errorY, errorX)
            self.errorOrientation = self.requiredPathAngle - currentOrientation 
            if abs(self.requiredPathAngle - currentOrientation) > 0.1 and self.distance > 0.2:
                if self.requiredPathAngle > currentOrientation:
                    self.speed.angular.z = self.kp*abs(self.errorOrientation)*self.CONSTANT_ANGULAR_SPEED
                else:
                    self.speed.angular.z = -self.kp*abs(self.errorOrientation)*self.CONSTANT_ANGULAR_SPEED
                self.speed.linear.x = 0.0
            else:
                self.speed.angular.z = 0.0
                if self.distance > 0.2:
                    self.speed.linear.x = self.kp*self.distance*self.CONSTANT_LINEAR_SPEED
                else:
                    self.speed.linear.x = 0.0
                    self.destination = True
                    print(f"Destination is reached and the final position value is {robotPosition.x}, {robotPosition.y}")
            self.velocityPublisher.publish(self.speed)
            rospy.sleep(rate)

Asked by Vignesh_93 on 2021-03-31 06:44:06 UTC

Comments