4. Motion Control Course
4.1 Coordinates System Establishing
4.1.1 Coordinate System Introduction
Regarding the design of the degrees of freedom for each leg of a quadruped robot, three actuators are distributed at the upper joints, while for the lower joint, driving force is transmitted through linkage or ball screw, which is beneficial for minimizing the inertia of lower legs and enhancing the dynamics motion performance.
When controlling the motion of ROSPug robot, the inverse kinematics can be employed by inputting the coordinates of the footholds for four legs. This allows the calculation of the rotational angles for all servos, thereby achieving the goal of controlling the walking motion of the robot dog.
Therefore, the coordinates system of ROSPug should be established in the beginning. When establishing the coordinates, take the center of four upper joints as the origin (0,0,0) and set the coordinates for the footholds of the four legs. During setting the coordinates, only the values for x-axis, y-axis and z-axis of the foothold coordinates need to be specified, as shown in the figure below.
4.1.2 Coordinate Instructions
For clarity, we’ll use the robot dog’s standing posture as an example. The coordinates for this standing position are shown in the box below:
In the image, Leg1, Leg2, Leg3, and Leg4 represent the positions of the robot dog’s four legs. From the robot dog’s perspective, the corresponding positions are shown in the table below:
| Leg1 | Leg2 | Leg3 | Leg4 |
|---|---|---|---|
| front right | front left | behind right | behind left |
The coordinates are in meters. For the ROSPug robot dog in its standing posture, the leg coordinates are (0.010, 0, -0.130). The Z-axis value of -0.130 means the foot contact point is 0.13 meters below the origin.
The X-axis value of 0.010 indicates the foot contact point is 0.010 meters from the origin along the X-axis.
The Y-axis coordinate is 0 by default. For lateral movement, such as moving right by 0.02 meters, the Y-axis coordinate should be -0.02 for the left leg and 0.02 for the right leg, and vice versa.
4.2 Inverse Kinematics Analysis
4.2.1 Inverse Kinematics Introduction
Inverse kinematics matters in ROSPug’s motion planning and control, because whether the inverse kinematics solution is fast and accurate directly affects the precision of ROSPug’s path planning and control. Therefore, fast and accurate inverse kinematics solution is essential.
For ROSPug, inverse kinematics involves solving the rotational angle of the upper joint and lower joint according to the foot coordinate. The joint distribution is as shown in the picture.
The rotational angle of the upper joint is controlled by 8 servos on ROSPug, as shown in the below picture.
The rotational angle of the lower joint is controlled by ID3, ID6, ID9 and ID12 servos on upper joints. Linkage mechanism is adopted in the control.
Per the inverse kinematics analysis, the solution procedure is divided into two steps:
(1) Calculate the position to which the upper and lower joints move based on the foot coordinates so as to solve the rotation angle of the corresponding servo.
(2) According to the rotation angle of servo, calculate the corresponding value, and then directly control the servo to rotate.
4.2.2 Project Analysis
Storage Path of Source Code
For better understanding, we will combine program control and inverse kinematics to analyze.
The source code of this program is stored in pug/src/pug_tutorial/scripts/intermediate_control_course/demo01_kinematics.py.
Operation Steps
Note
The entered command should be case sensitive, and Tab key can be used to complement key words.
(1) Turn on ROSPug, and access the robot system desktop using NoMachine.
(2) Click
to open the command line terminal.
(3) Enter command and press Enter to initiate the game.
python3 pug/src/pug_tutorial/scripts/intermediate_control_course/demo01_kinematics.py
(4) If want to close this game, press Ctrl+C. If it fails to close, please try again.
Program Outcome
Once the feature is activated, all servos on the ROSPug robot dog will adjust to their specified angles according to the set coordinates. The terminal will then show the positions of each servo and the coordinates of the robot dog’s foot contact points.
Program Analysis
The source code of this program is stored in: /home/pug/src/pug_tutorial/scripts/intermediate_control_course/demo01_kinematics.py
12 13 14 15 16 | # FR FL BR BL foot_locations = np.array([[-0.01, -0.01, -0.01, -0.01], # X [ 0.0, 0.0, 0.0, 0.0], # Y [-0.1, -0.1, -0.1, -0.1] # Z ]) |
Set coordinate
With ROSPug as the first-person perspective, FR, FL, BR and BL respectively represent its 4 legs.
| FR | FL | BR | BL |
|---|---|---|---|
| Front right | Front left | Behind right | Behind left |
Note
When setting coordinates, the range for the X-axis is ‘-0.15 to +0.15,’ and the range for the Z-axis is ‘-0.15 to -0.05.’
When the coordinate of X axis is set as 0, the line connecting foothold and the origin is perpendicular to the ground. If the coordinate of X axis is positive, the foothold is at the front.
The larger the coordinate of Z axis, the higher its feet lift, which means that the perpendicular distance between foothold and the origin is shorter.
Acquire servo angle
Calculate the servo angle through inverse kinematics.
24 | res = set_leg_ik(foot_locations.reshape(12).tolist()) |
Control servo to rotate
Calculate the pulse width of the servo according to the angle value so as to directly control servo rotation.
24 25 26 27 28 29 | res = set_leg_ik(foot_locations.reshape(12).tolist()) if res.success: joint_angle = res.joint_angle print('ik input:\n', foot_locations) print('ik output:\n', joint_angle) set_angle_pub.publish(joint_angle, 0.5) |
4.2.3 Inverse Kinematics Principles of a Quadruped Robot Dog (Using a Single Leg as an Example)
Before controlling the movement of a quadruped robot dog, it is essential to first understand the movement relationship of a single leg. In simple terms, the servos act as the driving mechanism, consisting of a hip joint servo, a thigh servo, and a calf servo.
During the calculation process, vector operations are performed using the rotation matrix R to find the 3D coordinates (x, y, z) of the end-effector relative to the hip joint center. The relationship between these coordinates and the joint angles is then used to calculate the rotation angles for the three servos. The process flowchart is shown below:
Conversion between Euler Angles and Rotation Matrix R
Euler Angles Definition: In the classical Cartesian coordinate system, which consists of the x, y, and z axes, the angles of rotation around each of these axes are collectively known as Euler angles.
| Parameter | Description | Meaning |
|---|---|---|
| Roll | Angle of Rotation About the X-axis | Roll angle |
| Pitch | Angle of Rotation About the Y-axis | Pitch angle |
| Yaw | Angle of Rotation About the Z-axis | Yaw angle |
The base coordinate system for the two left legs of the ROSpug robot dog uses a right-handed coordinate system, while the base coordinate system for the two right legs uses a left-handed coordinate system. The rotation transformation matrices for left-handed and right-handed coordinate systems are different.
For illustration, using the left-handed coordinate system as an example, the basic rotation matrix in this system can be calculated from the given Euler angles (p, h, b). For the right-handed coordinate system, the Euler angles (-p, -h, -b) should be used.
In the left-handed system, the rotation matrix Rx for a rotation of p°around the x-axis is:
In the left-handed coordinate system, the rotation matrix Ry for a rotation of h°around the y-axis is:
In the left-handed coordinate system, the rotation matrix Rz for a rotation of b°around the z-axis is:
The combined rotation matrix is defined as the matrix obtained by combining multiple rotations. For Euler angles in the Z-X-Y sequence, the corresponding combined matrix is R = Rz * Rx * Ry. The order of XYZ determines the rotation matrix definition; therefore, when the Euler angle sequence changes, the rotation matrix formula must be adjusted accordingly.
The rotation matrix corresponding to Euler angles (p, h, b) in the left-handed coordinate system (Z-X-Y sequence) is:
Calculation of the End-Effector Position Vector for a Single Leg
Identify the vectors necessary for calculating the end-effector position of the left front leg\(`\overset{\rightarrow}{A_{1}B_{1}}`\):
In the above diagram, since we are studying the standing posture control of the quadruped robot dog and O’ is given, the vectors OB1 and OO’ are known. In the equations from the diagram, vector O’A1 will change according to the rotation matrix R. Therefore, it needs to be multiplied by the rotation matrix before substitution into the calculations. Finally, we obtain the foot contact vector A1B1 relative to the center of the hip joint.
Calculation of the Rotation Angles for Single Leg Joint Servos
Once the coordinates of the foot contact point relative to the hip joint servo center are known, the rotation angles for each servo can be calculated using the inverse kinematics for the single leg.
Calculate the Rotation Angle γ for the Shoulder
In the yoz plane, given y, z, h (shoulder length), determine the intermediate variables: d, l, γ1, γ2.
Finally, calculate the rotation angle γ.
Solution process:
d=\(`\sqrt{y^{2} + z^{2}}`\)
l=\(`\sqrt{d^{2} - h^{2}}`\)
γ1=\(`{- arctan}\frac{h}{l}`\)
γ2=\(`{- arctan}\frac{y}{z}`\)
γ=γ2−γ1
Calculate the Rotation Angle β for the Calf
In the xoz plane, given l, x, hl (thigh length), and hu (calf length), determine the intermediate variable n. Then, calculate the final rotation angle β. The calculation process is as follows:
s=\(`\sqrt{l^{2} + x^{2}}`\)
(hu+n)2+m2=s2 (1)
n2+m2=hl2 (2)
Subtract Equation (2) from Equation (1) to obtain:
[(hu+n)2+m2]-(n2+m2)=s2-hl2
n=\(`\frac{s^{2} - {hl}^{2} - {hu}^{2}}{2hu}`\)
β=\(`{- arccos}\frac{n}{hl}`\)
Calculate the rotation angle α for the thigh
In the xoz plane, given l, x, hu (calf length), n, and s, determine the intermediate variables α1 and α2. Then, calculate the final rotation angle α. The calculation process is as follows:
α1=\(`{- arctan}\frac{x}{l}`\)
α2=\(`{- arccos}\frac{hu + n}{s}`\)
α=α1+α2
Using the calculations provided, once you have the coordinates of the foot contact point relative to the hip joint servo center, you can determine the rotation angles for each servo using the inverse kinematics for a single leg. However, for the quadruped robot dog, the coordinate systems differ between the legs: the right legs use a left-handed coordinate system, while the left legs use a right-handed coordinate system.
4.3 Gait Parameter Introduction
4.3.1 Gait Definition
Robot gait refers to the patterns and sequences of movement of a robot’s legs or other locomotion components. It describes how the robot moves, with common gait types including Trot, Walk, Amble, and Pace.
The table below lists some commonly used terms in gait descriptions:
| Term | Description |
|---|---|
| Phase Difference | The difference in movement timing between different legs, either leading or lagging. |
| Swing Phase | The phase where the leg is lifted and is in the air. |
| Support Phase | The phase where the leg is in contact with the ground. |
| Cycle | The complete process from one heel strike to the next heel strike on the same side during locomotion. |
| Gait Frequency | The number of gait cycles completed per unit of time. |
| Stride Length | The distance traveled by the foot from lift-off to landing within one cycle. |
| Step Length | The distance traveled by the body within one cycle. |
| Duty Cycle | The ratio of time a single leg spends in the support phase to the total gait cycle. |
4.3.2 Types of Gait
Classified by balance mode, ROSPug robot dog’s gaits can be divided into three types: static gait, dynamic gait, and quasi-static gait. Specifically, the static gait employed by ROSPug is the Walk gait, the dynamic gait is the Trot gait, and the quasi-static gait is the Amble gait.
The ROASug robot dog uses the following gaits:
Static Gait: Walk
Dynamic Gait: Trot
Quasi-static Gait: Amble
4.3.3 Leg Position
ROSPug’s four legs are numbered as below:
4.3.4 Introduction to Trot Gait
The Trot gait is a dynamic gait where diagonally opposite legs move in pairs. Specifically, Legs 1 and 2 move together, and Legs 3 and 4 move together. Ideally, each pair of diagonal legs lifts and touches the ground simultaneously. In the Trot gait, the sequence for the robot dog’s legs is 1 2 → 3 4 → 1 2. The control mechanism is illustrated in the diagram below:
(1) indicates the time when all four legs are on the ground.
(2) represents the time when a single leg is off the ground.
4.3.5 Introduction to Walk Gait
Walk gait is a static walking pattern where, throughout the movement, three legs are always in the support phase, and at most, one leg is in the swing phase. In the Walk gait for the robot dog, the sequential rotation of the four legs follows the order 1 → 2 → 3 → 4 → 1, as depicted in the diagram below:
In the diagram, the raised section represents leg lifting, ① indicates the time interval between front and rear legs, ② represents the duration when all four legs are in contact with the ground, and ③ represents the time when a single leg is lifted off the ground.
4.3.6 Introduction to Amble Gait
Amble gait is a quasi-static walking pattern, considered as an accelerated version of the Walk gait. Its characteristic feature is that during movement, at least two legs are in the support phase, with a maximum of two legs in the swing phase. In the Amble gait for the robot dog, the sequential rotation of the four legs follows the order 1 → 2 → 3 → 4 → 1, as illustrated in the diagram below:
In the diagram, the raised section represents leg lifting, ① indicates the time interval between front and rear legs, ② represents the duration when all four legs are in contact with the ground, and ③ represents the time when a single leg is lifted off the ground.
4.3.7 Parameters Within Program
The parameters for the robot dog’s movement consist of two main parts: motion parameters and gait parameters. Gait parameters include the total time in contact with the ground, the total time lifted off the ground, and the time interval between front and rear legs. Motion parameters encompass forward speed and turning speed.
When configuring, it is necessary to invoke the puppy_demo.py file, with the file path as follows: /home/pug/src/pug_driver/pug_control/scripts/pug_node.py.
Here is a detailed explanation of the parameters:
| Parameter | Explanation |
|---|---|
| overlap_time | The duration of all four knee joint endpoints in contact with the ground, measured in seconds. |
| swing_time | The duration of both knee joint endpoints lifted off the ground, measured in seconds. |
| clearance_time | Time interval between front and rear legs, measured in seconds. |
| z_clearance | When in motion, the distance in centimeters that the knee joint lifts the endpoint above the ground. |
4.4 Trot Gait Analysis and Implementation
4.4.1 Trot Gait Description
The Trot gait is a medium to low-speed dynamic gait characterized by the legs moving in a diagonal and cross pattern, simultaneously lifting and landing. This gait has a broad range of motion speeds, offering a balance between stability and speed, making it the most commonly used quadrupedal gait.
When the ROSPug is in Trot gait, the feet on the diagonal line touch the ground simultaneously. Using the diagram below as an example, let’s analyze and explain the Trot gait:
As shown in figure (a), legs 1 and 2 of the ROSPug lift and swing forward, while legs 3 and 4 support the body, ensuring the center of gravity is at the intersection of the diagonals. At this point, legs 1 and 2 are in the swing phase, while legs 3 and 4 are in the support phase.
As shown in figure (b), all four legs touch the ground simultaneously, with legs 1, 2, 3, and 4 all in the support phase.
As shown in figure (c), legs 3 and 4 lift and swing forward, while legs 1 and 2 support the body, ensuring the center of gravity is at the intersection of the diagonals. At this point, legs 3 and 4 are in the swing phase, while legs 1 and 2 are in the support phase.
As shown in figure (d), all four legs touch the ground simultaneously, with legs 1, 2, 3, and 4 all in the support phase.
When these four sets of actions (a), (b), (c), and (d) are completed, the ROSPug has completed one full cycle of movement.
4.4.2 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command to start the game.
python3 pug/src/pug_tutorial/scripts/base_control_course/demo01_trot_gait.py
(4) If you need to terminate the game, use short-cut Ctrl+C.
4.4.3 Program Outcome
After activating the game, the ROSPug will move in a trot gait, with diagonally paired legs in coordinated motion, lifting or landing simultaneously. The phase relationship is illustrated in the diagram below:
4.4.4 Parameters Analysis
The source code of this program is located in: /home/pug/src/pug_tutorial/scripts/base_control_course/demo01_trot_gait.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('trot_gait', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) #roll pitch yaw height x_shift stance_x stance_y run_time pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0.1, 0, 0, False) time.sleep(2) velocity_pub.publish(0, 0, 0, True) |
Publish Trot gait parameters using the gait_pub.publish() function.
18 | gait_pub.publish(0.2, 0.18, 0.02, 0.04) |
The parameters in parentheses are defined as follows:
(1) overlap_time: The time when all four legs are on the ground, measured in seconds.
(2) swing_time: The time when a single leg is off the ground, measured in seconds.
(3) clearance_time: The interval between the front and rear crossing leg phases, measured in seconds.
(4) z_clearance: The distance the robot dog’s toe should be raised during walking, measured in centimeters.
For the Trot gait, please note that when setting up, clearance_time must be set to 0. Furthermore, adhere to the following conditions for the Trot gait:
clearance_time = 0
overlap_time > 0
swing_time > 0
If a more detailed observation is desired, you can extend swing_time and overlap_time, but exercise caution. Increasing these times will slow down the frequency and may affect the stability of walking.
4.5 Amble Gait Analysis and Implementation
4.5.1 Amble Gait
The Amble gait is a static gait and can be considered as an accelerated version of the Walk gait. During motion, at least two legs are in the support phase, with a maximum of two legs in the swing phase.
Since the implementation process of the Amble gait is similar to that of the Walk gait, the sequence of swinging legs remains: Right Front -> Left Hind -> Left Front -> Right Hind, corresponding to the numbered sequence in the diagram: 1 -> 2 -> 3 -> 4.
The key distinction from Walk is that in the Walk gait, the second leg is lifted after the first leg is placed down. In contrast, the Amble gait begins lifting the second leg while the first leg is still in the air but not yet placed down. For example, after lifting the right front leg, the left rear leg begins to lift before the right front leg is placed down.
4.5.2 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command below to start the game.
python3 pug/src/pug_tutorial/scripts/base_control_course/demo02_amble_gait.py
(4) If you need to terminate the game, use short-cut Ctrl+C.
4.5.3 Program Outcome
The ROSPug moves in an Amble gait, where at least two legs are in the support phase, and a maximum of two legs are in the swing phase. The Amble gait can be likened to an accelerated version of the Walk gait. The phase relationship is illustrated in the diagram below:
4.5.4 Parameters Analysis
The source code of this program is located in: /home/pug/src/pug_tutorial/scripts/base_control_course/demo02_amble_gait.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('amble_gait', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.15, 0.05, 0.04) velocity_pub.publish(0.1, 0, 0, False) time.sleep(2) velocity_pub.publish(0, 0, 0, True) |
Publish Amble gait parameters using the gait_pub.publish() function.
18 | gait_pub.publish(0.2, 0.15, 0.05, 0.04) |
The parameters in parentheses have the following meanings:
(1) overlap_time: The time when all four legs are on the ground, measured in seconds.
(2) swing_time: The time when a single leg is off the ground, measured in seconds.
(3) clearance_time: The interval between the front and rear crossing leg phases, measured in seconds.
(4) z_clearance: The distance the robot dog’s toe should be raised during walking, measured in centimeters.
For the Amble gait, it is important to note that when configuring, adhere to the conditions of 0 < clearance_time < swing_time and overlap_time > 0. If a more detailed observation is desired, you can extend the clearance_time, swing_time, and overlap_time, but be cautious. Increasing these times will slow down the frequency, potentially impacting the stability of walking.
4.6 Walk Gait Analysis and Implementation
4.6.1 Walk Gait
The Walk gait is a static gait, meaning that at any given moment, at least three legs are on the ground, and at most, one leg is in the swing phase.
The sequence of swinging legs of ROSPug is as follows: Right Front -> Left Rear -> Left Front -> Right Rear, corresponding to the numbered sequence in the diagram: 1 -> 2 -> 3 -> 4. The analysis and explanation of the Walk gait will be illustrated using the diagram below as an example:
In Figure (a), as depicted, leg number 1 of the ROSPug robotic dog is raised and swung forward, while legs 2, 3, and 4 are used to support the body. At this moment, leg 1 is in the swing phase, and legs 2, 3, and 4 are in the support phase.
As shown in Figure (b), all four legs touch the ground simultaneously, with legs 1, 2, 3, and 4 all in the support phase.
Moving to Figure (c), leg number 2 of the ROSPug robotic dog is raised and swung forward, while legs 1, 3, and 4 support the body. Here, leg 2 is in the swing phase, and legs 1, 3, and 4 are in the support phase.
In Figure (d), all four legs touch the ground simultaneously again, with legs 1, 2, 3, and 4 in the support phase.
Proceeding to Figure (e), leg number 3 is raised and swung forward, with legs 1, 2, and 4 providing support. Leg 3 is in the swing phase, while legs 1, 2, and 4 are in the support phase.
As illustrated in Figure (f), all four legs touch the ground simultaneously, with legs 1, 2, 3, and 4 in the support phase.
In Figure (g), leg number 4 is raised and swung forward, while legs 1, 2, and 3 support the body. Leg 4 is in the swing phase, and legs 1, 2, and 3 are in the support phase.
Finally, as shown in Figure (h), all four legs touch the ground simultaneously once again, with legs 1, 2, 3, and 4 in the support phase.
Upon completing these eight sets of actions (a, b, c, d, e, f, g, and h), the ROSPug robotic dog has completed one full cycle of movement.
4.6.2 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command to start the game.
python3 pug/src/pug_tutorial/scripts/base_control_course/demo03_walk_gait.py
(4) If you need to terminate the game, use short-cut Ctrl+C.
4.6.3 Program Outcome
After initiating the game, the ROSPug will move forward in a Walk gait, ensuring that at any given moment, three legs are always on the ground, with at most one leg lifted. The phase relationship is depicted in the diagram below:
4.6.4 Parameters Analysis
The source code of this program is located in: /home/pug/src/pug_tutorial/scripts/base_control_course/demo03_walk_gait.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('walk_gait', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.24, 0.12, 0.05, 0.04) velocity_pub.publish(0.1, 0, 0, False) time.sleep(2) velocity_pub.publish(0, 0, 0, True) |
Publish Walk gait parameters using the gait_pub.publish() function.
18 | gait_pub.publish(0.24, 0.12, 0.05, 0.04) |
The parameters in parentheses have the following meanings:
(1) overlap_time: The time when all four legs are on the ground, measured in seconds.
(2) swing_time: The time when a single leg is off the ground, measured in seconds.
(3) clearance_time: The interval between the front and rear crossing leg phases, measured in seconds.
(4) z_clearance: The distance the robot dog’s toe should be raised during walking, measured in centimeters.
In the Walk gait, it is essential to note that when configuring, adherence to the conditions clearance_time > swing_time and overlap_time > 0 is necessary. If a more detailed observation is desired, you can extend the clearance_time, swing_time, and overlap_time. However, be cautious, as increasing these times will slow down the frequency, potentially affecting the stability of walking.
4.7 Stepping in Place under Trot Gait
To get detailed introduction to Trot gait, please refer to the document saved in 4.4 Trot Gait Analysis and Implementation.
4.7.1 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command below to start the game.
python3 pug/src/pug_tutorial/scripts/base_control_course/demo04_stay.py
(4) If you need to terminate the game, use short-cut Ctrl+C.
4.7.2 Program Outcome
After activating the game, the ROSPug will perform Trot Gait stepping in place, with diagonally paired legs in coordinated motion, simultaneously lifting or landing in the same spot. The phase relationship is illustrated in the diagram below:
4.7.3 Parameters Analysis
The source code of this program is located in: /home/pug/src/pug_tutorial/scripts/base_control_course/demo04_stay.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('stay', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0, 0, 0, False) time.sleep(3) velocity_pub.publish(0, 0, 0, True) |
Publish movement parameters using the velocity_pub.publish() function.
20 | velocity_pub.publish(0, 0, 0, False) |
(1) The first parameter 0 is the linear velocity in the x direction, in meters per second (m/s).
(2) The second parameter 0 is the linear velocity in the y direction, in meters per second (m/s).
(3) The third parameter 0 is the angular velocity, in meters per second (m/s).
(4) The fourth parameter False is the operation state; set to True to stop movement.
Additionally, if the ROSPug robot dog shows positional drift during stationary stepping, you can correct this by adjusting its center of gravity. For detailed information on center of gravity adjustment, refer to 4.14 Center of Gravity Adjustment.
4.8 Turning under Trot Gait
For a detailed explanation of the Trot gait, please refer to the document located in the 4.4 Trot Gait Analysis and Implementation.
This program will build upon the Trot gait, allowing the ROSPug to move forward and turn by modifying the corresponding parameters.
4.8.1 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command to start the game.
python3 pug/src/pug_tutorial/scripts/base_control_course/demo05_trot_turn.py
(4) If you need to terminate the game, use short-cut Ctrl+C.
4.8.2 Program Outcome
In the Trot gait, ROSPug will continuously turn in the specified direction.
4.8.3 Parameters Analysis
The source code of the program is saved in /home/pug/src/pug_tutorial/scripts/base_control_course/demo05_trot_turn.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/usr/bin/env python3 # coding=utf8 import time import math import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('trot_turn', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0.1, 0, math.radians(15), False) time.sleep(4) velocity_pub.publish(0, 0, 0, True) |
Use the velocity_pub.publish() function to publish movement parameters:
21 | velocity_pub.publish(0.1, 0, math.radians(15), False) |
(1) The first parameter, 0.1, sets the linear velocity in the x direction, measured in meters per second (m/s).
(2) The second parameter, 0, sets the linear velocity in the y direction, measured in meters per second (m/s).
(3) The third parameter, math.radians(15), specifies the angular velocity, measured in radians per second (rad/s).
(4) The fourth parameter, False, indicates the operation state; set this to True to stop movement.
Adjust these parameters to change the robot’s speed.
Revise the Gait
Publish the Trot gait parameters using the gait_pub.publish() function.
16 | pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) |
The parameters in parentheses are defined as follows:
(1) The first parameter, overlap_time, represents the duration during which all four legs of the ROSPug are on the ground, measured in seconds.
(2) The second parameter, swing_time, indicates the time when a single leg of the robotic dog is off the ground, measured in seconds.
(3) The third parameter, clearance_time, denotes the interval between the front and rear crossing leg phases of the robotic dog, measured in seconds.
(4) The fourth parameter, z_clearance, signifies the distance the robotic dog’s toe should be raised during walking, measured in centimeters.
4.9 Explanation of Pose (Static) Parameters
4.9.1 Pose Description
Pose describes the orientation and rotational state of a robot in space. For the ROSPug robot dog, pose parameters define its initial stance, including standing height, pitch angle, roll angle, and other related measurements.
4.10 Robot Horizontal Movement
When controlling the ROSPug robot dog during walking, adjusting the movement parameters allows you to control the robot’s horizontal movement.
4.10.1 Operation Steps
Note
The entered command should be case sensitive, and Tab key can be used to complement key words.
(1) Start the ROSPug, and connect to NoMachine remote system desktop.
(2) Click
to open the command line terminal.
(3) Enter command below to set the direction and speed of ROSPug’s movement.
python3 pug/src/pug_tutorial/scripts/intermediate_control_course/demo02_horizontal_move.py
(4) If want to close this game, press Ctrl+C. If it fails to close, please try again.
4.10.2 Program Outcome
After the game starts, ROSPug will move horizontally based on the set speed.
4.10.3 Program Analysis
The source code is saved in: /home/pug/src/pug_tutorial/scripts/intermediate_control_course/demo02_horizontal_move.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('horizontal_move', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0, 0.06, 0, False) time.sleep(2) velocity_pub.publish(0, -0.06, 0, False) time.sleep(2) velocity_pub.publish(0, 0, 0, True) |
Publish movement parameters using the velocity_pub.publish() function.
20 21 | velocity_pub.publish(0, 0.06, 0, False) time.sleep(2) |
(1) The first parameter 0 is the linear velocity in the x direction, in meters per second (m/s).
(2) The second parameter 0.06 is the linear velocity in the y direction, in meters per second (m/s).
(3) The third parameter 0 is the angular velocity, in meters per second (m/s).
(4) The fourth parameter False is the operation state; set to True to stop movement.
Here, a y-direction linear velocity of 0.06 m/s is published, with a delay of 2 seconds. Then, a y-direction linear velocity of -0.06 m/s is published, with another 2-second delay, achieving lateral movement of the robot dog. You can adjust the velocity to change the speed of lateral movement.
4.11 Omnidirectional Movement
While controlling the ROSPug robot dog, you can achieve omnidirectional movement by adjusting its motion parameters.
4.11.1 Operation Steps
Note
The entered command should be case sensitive, and Tab key can be used to complement key words.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Click
to open the command line terminal.
(3) Enter the following command to initiate the game.
python3 pug/src/pug_tutorial/scripts/intermediate_control_course/demo03_omnidirection_move.py
(4) If want to close this game, press Ctrl+C. If it fails to close, please try again.
4.11.2 Program Outcome
Once play mode is activated, the ROSPug robot dog will move to the front-left for 2 seconds, then to the back-right for another 2 seconds, following the preset directions.
4.11.3 Program Analysis
The source code of this program is saved in: /home/pug/src/pug_tutorial/scripts/intermediate_control_course/demo03_omnidirection_move.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('omnidirection_move', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0.06, 0.06, 0, False) time.sleep(2) velocity_pub.publish(-0.06, -0.06, 0, False) time.sleep(2) velocity_pub.publish(0, 0, 0, True) |
Use the velocity_pub.publish() function to set movement parameters:
20 21 | velocity_pub.publish(0.06, 0.06, 0, False) time.sleep(2) |
(1) The first parameter, 0.06, is the linear velocity in the x direction (m/s).
(2) The second parameter, 0.06, is the linear velocity in the y direction (m/s).
(3) The third parameter, 0, is the angular velocity (rad/s).
(4) The fourth parameter, False, indicates the running state; set it to True to stop the robot.
In this example, the robot dog moves with x and y velocities of 0.06 m/s for 2 seconds, then changes to -0.06 m/s for both directions for another 2 seconds, resulting in diagonal movement. Adjust these speed values to achieve movement in different directions.
4.12 Speed Adjustment
While controlling the ROSPug robot dog, you can adjust the movement parameters to modify its walking speed.
4.12.1 Operation Steps
Note
The entered command should be case sensitive, and Tab key can be used to complement key words.
(1) Turn on ROSPug, and access the robot system desktop using NoMachine.
(2) Click
to open the command line terminal.
(3) Enter the following command to initiate the game.
python3 pug/src/pug_tutorial/scripts/intermediate_control_course/demo04_move_speed_adjustment.py
(4) If want to close this game, press Ctrl+C. If it fails to close, please try again.
4.12.2 Program Outcome
Once the play mode is activated, the ROSPug robot dog will walk at the set speed, with speed changes occurring during its movement.
4.12.3 Program Analysis
The source code of this program is saved in: /home/pug/src/pug_tutorial/scripts/intermediate_control_course/demo04_move_speed_adjustment.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('move_speed', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0.05, 0, 0, False) time.sleep(2) velocity_pub.publish(0.12, 0, 0, False) time.sleep(2) velocity_pub.publish(0.05, 0, 0, False) time.sleep(2) velocity_pub.publish(0, 0, 0, True) |
Use the velocity_pub.publish() function to set movement parameters:
20 21 22 23 24 | velocity_pub.publish(0.05, 0, 0, False) time.sleep(2) velocity_pub.publish(0.12, 0, 0, False) time.sleep(2) |
(1) The first parameter, 0.05, represents the linear velocity in the x direction (m/s).
(2) The second parameter, 0.00, represents the linear velocity in the y direction (m/s).
(3) The third parameter, 0, represents the angular velocity (rad/s).
(4) The fourth parameter, False, indicates whether the robot is running; set to True to stop the robot.
In this example, the robot dog will first move at an x-direction velocity of 0.05 m/s for 2 seconds. It will then switch to an x-direction velocity of 0.12 m/s for 2 seconds, before returning to 0.05 m/s for another 2 seconds. This sequence creates a variation in speed during the robot dog’s movement.
4.13 Height Adjustment
While controlling the ROSPug robot dog, you can adjust the parameters to modify its walking height. For detailed information on these parameters, see the document ‘4.9 Explanation of Pose (Static) Parameters’.
4.13.1 Operation Steps
Note
The input command is case-sensitive, and keywords can be auto-completed using the Tab key.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Click
to open the command line terminal.
(3) Enter the following command to initiate the game.
python3 pug/src/pug_tutorial/scripts/intermediate_control_course/demo05_move_height_adjustment.py
(4) If want to close this game, press Ctrl+C. If it fails to close, please try again.
4.13.2 Program Outcome
Once play mode is activated, the ROSPug robot dog will lower its body height while walking forward.
4.13.3 Program Analysis
The source code of this program is saved in /home/pug/src/pug_tutorial/scripts/intermediate_control_course/demo05_move_height_adjustment.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/usr/bin/env python3 # coding=utf8 import time import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('move_height', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0.01, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0.06, 0, 0, False) for i in range(30): pose_pub.publish(0, 0, 0, -0.15 + i*0.001, 0, 0, 0, 0) time.sleep(0.1) velocity_pub.publish(0, 0, 0, True) |
Use the velocity_pub.publish() function to set movement parameters:
20 21 22 23 24 | velocity_pub.publish(0.06, 0, 0, False) for i in range(30): pose_pub.publish(0, 0, 0, -0.15 + i*0.001, 0, 0, 0, 0) time.sleep(0.1) |
(1) The first parameter, 0.06, is the linear velocity in the x direction (m/s).
(2) The second parameter, 0.00, is the linear velocity in the y direction (m/s).
(3) The third parameter, 0, is the angular velocity (rad/s).
(4) The fourth parameter, False, indicates the running state; set to True to stop the robot.
22 23 24 | for i in range(30): pose_pub.publish(0, 0, 0, -0.15 + i*0.001, 0, 0, 0, 0) time.sleep(0.1) |
Use the pose_pub.publish() function to set pose parameters.
The height parameter is set to -0.15 + i*0.001, representing the foot position along the z-axis in meters.
In this program, the x-direction velocity is set to 0.06 m/s. While the robot moves forward, the pose parameters are adjusted to change the body height, allowing the robot dog to modify its height while moving.
4.14 Center of Gravity Adjustment
4.14.1 Center of Gravity Explanation
The center of gravity of the robot dog is located at a point that is evenly distributed from front to back and left to right of the body. Therefore, during walking, it maintains a dynamic balance and requires continuous adjustments of other body parts to keep the center of gravity within a stable threshold.
In general situations, there is no need to adjust the default center of gravity of the robot dog. However, when it needs to fulfill additional development requirements, it is essential to maintain the center of gravity within a stable threshold to avoid deviations or tilting of the body.
This can be understood similar to how a person’s center of gravity is different when walking normally compared to walking while carrying or carrying something. Thus, this illustrates the significance of adjusting the center of gravity.
4.14.2 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command below to initiate the game.
python3 pug/src/pug_tutorial/scripts/advanced_control_course/demo01_gravity_center_adjustment.py
(4) If you need to terminate this game, you can use short-cut Ctrl+C. If the program cannot be terminated, please retry.
4.14.3 Program Outcome
After enabling the game, the ROSPug robot dog will walk forward with a forward tilt in the Trot gait.
4.14.4 Program Analysis
The source code is saved in: /home/pug/src/pug_tutorial/scripts/advanced_control_course/demo01_gravity_center_adjustment.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/usr/bin/env python3 # coding=utf8 import time import math import rospy from pug_control.msg import Velocity, Pose, Gait rospy.init_node('trot_gait', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) gait_pub = rospy.Publisher('/pug_control/gait', Gait, queue_size=1) velocity_pub = rospy.Publisher('/pug_control/velocity_move', Velocity, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) gait_pub.publish(0.2, 0.18, 0.02, 0.04) velocity_pub.publish(0.06, 0, 0, False) for i in range(40): pose_pub.publish(0, 0, 0, -0.13, 0 + i*0.001, 0, 0, 0) time.sleep(0.1) for i in range(40): pose_pub.publish(0, 0, 0, -0.13, 0.04 - i*0.001, 0, 0, 0) time.sleep(0.1) velocity_pub.publish(0, 0, 0, True) |
Use the pose_pub.publish() function to send pose parameters.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | for i in range(40): pose_pub.publish(0, 0, 0, -0.13, 0 + i*0.001, 0, 0, 0) time.sleep(0.1) for i in range(40): pose_pub.publish(0, 0, 0, -0.13, 0.04 - i*0.001, 0, 0, 0) time.sleep(0.1) for i in range(40): pose_pub.publish(0, 0, 0, -0.13, 0 + i*0.001, 0, 0, 0) time.sleep(0.1) for i in range(40): pose_pub.publish(0, 0, 0, -0.13, 0.04 - i*0.001, 0, 0, 0) time.sleep(0.1) |
(1) The parameter x_shift, defined as 0 + i*0.001, specifies the X-axis position of each leg in meters.
In this program, the robot dog moves forward at a speed of 0.06 m/s. During movement, the pose parameters adjust each leg’s position along the X-axis, creating a shifting effect where the robot’s center of gravity moves backward and then returns to its original position.
4.15 Twisting
4.15.1 Program Logic
The body twisting of the robot is mainly achieved by controlling the robot’s posture, i.e., changing the robot’s roll, pitch, and yaw angles to induce a twisting motion in the body.
Specifically, it can be divided into the following types of twisting movements:
(1) Left and right tilt (Roll): Changing the robot’s roll angle to tilt the body left or right around the forward axis.
(2) Up and down pitching (Pitch): Changing the robot’s pitch angle to make the body pitch up or down around the lateral axis.
(3) Left and right rotation (Yaw): Changing the robot’s yaw angle to make the body rotate left or right around the vertical axis.
(4) Combined twist: Simultaneously changing multiple angles to generate more complex twisting movements, for example, simultaneously changing roll and pitch to create a helical twisting effect.
(5) Dynamic twist: Continuously changing angles to create dynamic twisting movements, for example, sinusoidally changing the roll angle to achieve body oscillation.
The body’s twisting actions can fully demonstrate the flexibility of quadruped robots and are important indicators for assessing robot control performance. Good twisting capability is also crucial for the adaptability of quadruped robots in complex environments.
4.15.2 Operation Steps
Note
The input command should be case sensitive, and users can Tab to complement keywords.
(1) Start the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command below to start the game.
python3 pug/src/pug_tutorial/scripts/advanced_control_course/demo02_wave_body.py
(4) If you need to terminate this game, you can use short-cut Ctrl+C. If the program cannot be terminated, please retry.
4.15.3 Program Outcome
The ROSPug quadruped robot dog will repeatedly sway back and forth before returning to its original stance.
4.15.4 Parameters Analysis
The source code of this program locates in /home/pug/src/pug_tutorial/scripts/advanced_control_course/demo02_wave_body.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/usr/bin/env python3 # coding=utf8 import time import math import rospy from pug_control.msg import Pose rospy.init_node('wave_body', log_level=rospy.INFO) pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) time.sleep(0.1) pose_pub.publish(0, 0, 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) for i in range(3): pose_pub.publish(0, math.radians(-15), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) pose_pub.publish(0, math.radians(0), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) pose_pub.publish(0, math.radians(15), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) pose_pub.publish(0, math.radians(0), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) |
Publish pose parameters using the pose_pub.publish() function.
17 18 19 20 21 22 23 24 25 26 | for i in range(3): pose_pub.publish(0, math.radians(-15), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) pose_pub.publish(0, math.radians(0), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) pose_pub.publish(0, math.radians(15), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) pose_pub.publish(0, math.radians(0), 0, -0.13, 0, 0, 0, 0.5) time.sleep(0.5) |
(1) The pitch parameter, set to math.radians(15), defines the pitch angle of the robot dog’s body in radians.
In this program, the pitch angle is adjusted continuously, enabling the robot dog to alternate between looking up, looking straight ahead, and looking down.
4.16 IMU Calibration
4.16.1 IMU (Inertial Measurement Unit) Introduction
An IMU (Inertial Measurement Unit) measures an object’s orientation angles (angular rates) and acceleration along three axes. It includes a gyroscope and an accelerometer, offering 6 degrees of freedom to capture angular velocity and acceleration in three-dimensional space.
4.16.2 Operation Steps
When the node receives the first IMU message, it will instruct you to hold the IMU in a specific orientation and press Enter to record the measurement. After completing the measurements for all 6 orientations, the node will calculate the calibration parameters and save them to the specified YAML file. Follow the detailed steps below:
Note
The input command should be case sensitive, and you can Tab to complement the keywords.
(1) Power on the robot and connect it to the remote control software NoMachine.
(2) Click-on
to open the command-line terminal.
(3) Execute the command below to initiate the app auto-start service.
sudo systemctl stop pug_bringup.service
(4) Run the following command to launch the IMU calibration.
roslaunch pug_peripherals imu_calibrate.launch
(5) When prompted, position the robot with its right side facing up and press Enter.
Note
The initial direction is defined as the front, and all subsequent orientations should be based on this initial direction.
After successfully calibrating each direction, you will see the following prompt:
(6) Position the robot with its left side facing up and press Enter.
(7) Position the robot with its rear side facing up and press Enter.
(8) Position the robot with its front side facing up and press Enter.
(9) Align the robot so that it is facing upwards. Once the robot is securely fixed in this position, press Enter.
Note
When adjusting the robot’s vertical orientation, it may become unstable or bump into objects. It is advisable to hold the robot steady to avoid damaging the depth camera or screen.
(10) Position the robot with its bottom facing up. Once the robot is securely fixed in this position, press Enter.
(11) When you see the prompt indicating calibration is complete, the process is finished.
(12) After calibration, you can enter a command to display the model’s three-axis orientation. Tilt the robot forward, backward, left, and right, and check whether the model’s tilt direction matches the robot’s tilt direction.
roslaunch pug_peripherals imu.launch debug:=true
4.17 ROS Robot Pose Detection
4.17.1 Program Logic
When controlling the state of the ROSPug, you can adjust its posture. Similarly, you can invoke the MPU6050 sensor function to detect the current posture of the robot dog.
Posture mainly includes parameters such as roll (roll angle), pitch (pitch angle), yaw (yaw angle), height (height of the robot dog), and more.
The source code is saved in: /home/pug/src/pug_tutorial/scripts/advanced_control_course/demo03_self_balance01.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/usr/bin/env python3 # encoding: utf-8 import rospy from sensor_msgs.msg import Imu from scipy.spatial.transform import Rotation as R class SelfBalancingNode: def __init__(self): rospy.init_node("self_balancing_node") rospy.Subscriber("/imu", Imu, self.imu_callback, queue_size=2) def imu_callback(self, imu_msg): try: q = imu_msg.orientation r = R.from_quat((q.x, q.y, q.z, q.w)) x, y, z = r.as_euler('xyz', degrees=True) rospy.loginfo("Pitch:{:>6.2f}°, Roll:{:>6.2f}°, Yaw:{:>6.2f}°".format(x, y, z)) except Exception as e: rospy.logerr(str(e)) if __name__ == "__main__": try: SelfBalancingNode() rospy.spin() except Exception as e: rospy.logerr(str(e)) |
4.17.2 Operation Steps
Note
Command input must strictly distinguish between uppercase and lowercase letters, as well as spaces.
(1) Restart the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Execute the command below to initiate the game.
python3 pug/src/pug_tutorial/scripts/advanced_control_course/demo03_self_balance01.py
(4) If you need to terminate this program, use short-cut Ctrl+C on LX terminal.
4.17.3 Program Outcome
After initiating the game, open the terminal, then you can check the current pose parameters of ROSPug robot dog.
4.17.4 Program Analysis
The source code of this program is saved in: /home/pug/src/pug_tutorial/scripts/advanced_control_course/demo03_self_balance01.py
Subscribe to IMU Topic
7 8 9 10 | class SelfBalancingNode: def __init__(self): rospy.init_node("self_balancing_node") rospy.Subscriber("/imu", Imu, self.imu_callback, queue_size=2) |
Subscribe to the /imu topic using the Subscriber() function, with self.imu_callback() as the callback function.
Callback Function
12 13 14 15 16 17 18 19 | def imu_callback(self, imu_msg): try: q = imu_msg.orientation r = R.from_quat((q.x, q.y, q.z, q.w)) x, y, z = r.as_euler('xyz', degrees=True) rospy.loginfo("Pitch:{:>6.2f}°, Roll:{:>6.2f}°, Yaw:{:>6.2f}°".format(x, y, z)) except Exception as e: rospy.logerr(str(e)) |
(1) Use imu_msg.orientation to obtain the quaternion data from the IMU.
(2) Convert the quaternion to a rotation matrix using the from_quat() function.
(3) Then, calculate the angles from the rotation matrix using the as_euler() function.
4.18 ROS Robot Pose Self-Balancing
4.18.1 Program Logic
The overall process of this program is as follows:
(1) Firstly, it is necessary to initialize the posture parameters of the robot dog, including roll (roll angle), pitch (pitch angle), yaw (yaw angle), height (height of the robot dog), and other parameters, to determine the initial posture of the robot dog.
(2) Then, call the QMI8658 sensor function to obtain real-time posture parameters of the robot dog and save the records.
(3) Finally, based on the changes in posture parameters, reconfigure the pitch and roll angles of the robot dog. Through inverse kinematics calculations, obtain the rotation angles of the servo motors, and control the servos to rotate to the specified angles, thus completing the self-balancing function of the robot dog.
4.18.2 Operation Steps
Note
Command input must strictly distinguish between uppercase and lowercase letters, as well as spaces.
(1) Restart the robot, and access the robot system desktop using NoMachine.
(2) Double-click
to open the command-line terminal.
(3) Then execute the command to initiate the pose self-balancing program.
python3 pug/src/pug_tutorial/scripts/advanced_control_course/demo04_self_balance02.py
(4) If you need to terminate this program, use short-cut Ctrl+C on LX terminal.
4.18.3 Program Outcome
Note
When tilting the robot dog, the pitch angle range is from -25° to 25°, and the roll angle range is from -20° to 20°.
Once you start the process, IMU calibration will begin. The calibration is complete when you hear the buzzer signal. During this period, ensure that the ROSPug remains stationary.
After calibration, the ROSPug will automatically adjust its posture according to the surface’s tilt to maintain an upright stance.
4.18.4 Program Parameters Analysis
The source code of this program is saved in: /home/pug/src/pug_tutorial/scripts/advanced_control_course/demo04_self_balance02.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #!/usr/bin/env python3 # encoding: utf-8 import time import math import rospy from pug_sdk import buzzer, pid from sensor_msgs.msg import Imu from pug_control.msg import Pose from scipy.spatial.transform import Rotation as R from ros_robot_controller.msg import BuzzerState class SelfBalancingNode: def __init__(self): rospy.init_node('self_balancing') self.pid_pitch = pid.PID(0.1, 0.0, 0.0002) self.pid_roll = pid.PID(0.13, 0.0, 0.0002) self.pitch = 0 self.roll = 0 self.init_finish = False self.pitch_init = 0 self.roll_init = 0 self.count = 0 self.imu_sub = rospy.Subscriber('/imu', Imu, self.imu_callback, queue_size=2) self.pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) self.buzzer_pub = rospy.Publisher('/ros_robot_controller/set_buzzer', BuzzerState, queue_size=1) time.sleep(0.1) self.pose_pub.publish(0, 0, 0, -0.13, 0, 0, 0, 1) time.sleep(1.5) |
Initialize Publishers and Subscribers
23 24 | self.imu_sub = rospy.Subscriber('/imu', Imu, self.imu_callback, queue_size=2) self.pose_pub = rospy.Publisher('/pug_control/pose', Pose, queue_size=1) |
(1) Subscribe to the /imu topic using the Subscriber() function, with self.imu_callback() as the callback function.
(2) Publish pose messages to the /pug_control/pose topic using the Publisher() function.
Calculate Orientation Angles
32 33 34 | q = imu_msg.orientation r = R.from_quat((q.x, q.y, q.z, q.w)) x, y, z = r.as_euler('xyz') |
(1) Obtain the IMU data quaternion from imu_msg.orientation.
(2) Convert the quaternion to a rotation matrix using the from_quat() function.
(3) Calculate the angles from the rotation matrix using the as_euler() function.
Control Robot Self-Balancing
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | if self.init_finish: self.pid_pitch.SetPoint = self.pitch_init self.pid_roll.SetPoint = self.roll_init if abs(x - self.pitch_init) < 0.04: x = self.pitch_init self.pid_pitch.update(x) if abs(y - self.roll_init) < 0.02: y = self.roll_init self.pid_roll.update(y) try: self.pitch -= self.pid_pitch.output self.roll += self.pid_roll.output pitch_limit = 0.35 roll_limit = 0.30 self.roll = roll_limit if self.roll > roll_limit else (-roll_limit if self.roll < -roll_limit else self.roll) self.pitch = pitch_limit if self.pitch > pitch_limit else (-pitch_limit if self.pitch < -pitch_limit else self.pitch) self.pose_pub.publish(self.roll, self.pitch, 0, -0.13, 0, 0, 0, 0) |
(1) Use the PID algorithm to calculate the roll and pitch angles.
(2) Publish the pose message with self.pose_pub.publish(self.roll, self.pitch, 0, -0.13, 0, 0, 0, 0) to control the robot’s self-balancing.
(3) The parameters self.roll and self.pitch represent the roll and pitch angles, calculated using PID.
4.19 Wireless Handle Control
4.19.1 Preparation
Note
Please ensure that the handle receiver is inserted before turning on the wireless handle. If it is already plugged in, disregard this step. Also, when inserting the battery, pay attention to distinguish between the positive and negative terminals.
(1) Insert the handle receiver into any USB interface on ROSPug. Generally, the handle receiver has already been inserted to the robot before leaving the factory.
(2) Please bring your own two AAA dry batteries. And insert them into the battery slot.
4.19.2 Device Connection
(1) Start ROSPug. After the robot starts successfully, turn on the handle. At this time, two LED lights will flash simultaneously.
(2) Please wait for a while. Then the robot will pair with the handle automatically. After successful pairing, the green light will keep lighting up and red LED light goes out.
Note
If the handle doesn’t connect to the robot within 30s or there is no operation on the handle within 5 minutes after turning on, it will enter sleep mode. And you can press “START” to activate the handle.