yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
RDK X3 Robot📖
01. About RDK-X3-Robot
1. Instructions
  • 1. Introduction
  • 2. FAQ
  • 3. Battery and charger use precautions
  • 4.TF card expand capacity
2. Common problem analysis
02. Assembly video
  • Part1-Install Motor
  • Part2-Install Battert Fixing Column
  • Part3-Install Motor Coupling
  • Part4-Install Mecanum wheel
  • Part5-Install Expansion Board
  • Part6-Wiring Show
  • Part7-Install Main Control Board
  • Part8-Install Car Top Plate and Antenna
  • Part9-Install OLED Screen
  • Part10-Install Depth Camera(Optional)
  • Part11-Install OLED Screen
  • Part12-Install HD Camera
  • Part13-Install Top Plate
  • Part14-Install Right Side Plate
  • Part15-Motor Wiring Show
  • Part16-lnstall Car Body
  • Part17-Install Battery
  • Part18-Install Lidar
03. Remote control tutorial
  • 1. The phone APP remote tutorial
  • 2. USB wireless controller remote tutorial
04. ROS functional tutorial
  • 1. Introduction of extension board
  • 2. Set up STM32 development environment
  • 3. Key control buzzer sound
  • 4. FreeRTOS application
  • 5. Serial communication
  • 6. SBUS model remote control
  • 7. CAN bus communication
  • 8. RGB color light strip
  • 9. Timer interrupt control PWM servo
  • 10. Control serial steering gear
  • 11. Nine-axis attitude sensor to obtain data
  • 12. Control motor forward and reverse
  • 13. The timer captures encoder data
  • 14. Theory of robot kinematics analysis
  • 15. PID control robot motion
05. Basic control tutorial
  • 1. Update the firmware of the expansion module
  • 2. Install the Python driver library
  • 3. Set the type of bottom car
  • 4. Open and close the APP program control
  • 5. Turn hotspot mode on and off
  • 6. The buzzer blows
  • 7. Control the motor forward and reverse
  • 8. Control robot movement
  • 9. OLED display
  • 10. Control fan and lamp effect
06. Development environment setup
  • 1. Virtual Machine
  • 2. Linux Basics
  • 3. Remote connection
  • 4. Multi-computer communication configuration
  • 5. Bind the device ID
  • 6. Image installation and backup
07. ROS2 Basic Course
  • 1. Introduction to ROS2
  • 2. ROS2 install Humble
  • 3. ROS2 development environment
  • 4. ROS2 workspace
  • 5. ROS2 function package
  • 6. ROS2 node
  • 7. ROS2 topic communication
  • 8. ROS2 service communication
  • 9. ROS2 action communication
  • 10. ROS2 custom interface message
  • 11. ROS2 parameter service case
  • 12. ROS2 meta-function package
  • 13. ROS2 distributed communication
  • 14. ROS2 DDS
  • 15. ROS2 time related API
  • 16. ROS2 common command tools
  • 17. ROS2 rviz2 use
  • 18. ROS2 rqt toolbox
  • 19. ROS2 Launch startup file configuration
  • 20. ROS2 recording and playback tool
  • 21. ROS2 URDF model
  • 22. ROS2 Gazebo simulation platform
  • 23. ROS2 TF2 coordinate transformation
08. Robot chassis control
  • 1. PID algorithm theory
  • 2. Robot information release
  • 3. Robot control
  • 4. Robot state estimation
  • 5. Robot calibration
  • 6. Robot trajectory tracking
  • 7. URDF model
09. Lidar courses
  • 1. Introduction and use of lidar
  • 2. Lidar obstacle avoidance
  • 3. Lidar following
  • 4. Lidar guard
  • 5. Patrol
  • 6. gmapping algorithm
  • 7. cartographer algorithm
  • 8. Navigation and obstacle avoidance
  • 9. App mapping and navigation
10. OpenCV courses
  • 1. Introduction to OpenCV
  • 2. OpenCV geometric transformation
  • 3. OpenCV image processing
  • 4. OpenCV image beautification
  • 5. Qr code creation and identification
11. MIPI camera course
  • 1. Camera driver
  • 2. Adjust the color HSV value
  • 3. Color recognition
  • 4. Color tracking
  • 5. Color follow
  • 6. Qr code command
  • 7. Face detection
  • 8. Object detection
  • 9. Visual Inspection -OpenCV
  • 10. Visual inspection - Deep learning
  • 11. Human tracking
  • 12. Gesture control
12. Depth Camera courses
  • 1. Use depth camera
  • 2. Calibration of camera internal reference
  • 3. ROS+OpenCV Foundation
  • 4. AR vision
  • 5. Color tracking
  • 6. Object tracking
13. Multi vehicle control
  • 1. Multi-vehicle synchronous control
  • 2. Multi-vehicle navigation
Remote login control
  • 1. VNC and SSH remote login
  • 2. Jupyter lab login and case code running
Download
  • RemoteCtrl_APP(iOS/Android))
  • Mapping_APP(iOS_Android)
  • Code
  • System File
  • VM_File
  • Manual
  • Software_File
  • Hardware_File
  • ROS2_Basic_VM
Download ZIP

Welcome to RDK X3 Robot repository

5. Robot calibration

5. Robot calibration

5. Robot calibration5.1. Description of program functions5.2. Program Code Reference Path5.3. Program Startup5.4. Core Source Code Parsing

 

5.1. Description of program functions

After the program is run, the dynamic parameter adjuster is used here to adjust the parameters to calibrate the linear and angular speed of the car. The intuitive embodiment of the calibration line speed makes the car go straight forward 1 meter, to see how far it actually runs and whether it is within the error range; The visual representation of calibration angular velocity allows the car to rotate 360 degrees to see if the Angle of rotation of the car is within the error range.

5.2. Program Code Reference Path

After SSH connection car, the location of the function source code is located at,

xxxxxxxxxx
#标定线速度源码# Calibration line speed source code
/userdata/yahboomcar_ws/src/yahboomcar_bringup/yahboomcar_bringup/calibrate_linear.py
#标定角速度源码# Calibration angular velocity source code
/userdata/yahboomcar_ws/src/yahboomcar_bringup/yahboomcar_bringup/calibrate_angular.py

5.3. Program Startup

After SSH connects to the car, terminal input,

xxxxxxxxxx
#启动底盘# Start chassis
ros2 launch yahboomcar_bringup yahboomcar_bringup_launch.py
#标定线速度# Calibrate the line speed
ros2 run yahboomcar_bringup calibrate_linear
#标定角速度# Calibrate the angular velocity
ros2 run yahboomcar_bringup calibrate_angular

Open the virtual machine terminal, input,

xxxxxxxxxx
#动态参数调节# Dynamic parameter adjustment
ros2 run rqt_reconfigure rqt_reconfigure

1684481464371

Take the calibration line speed as an example, click [start_test] car calibration x direction line speed, observe whether the car moved the test_distance distance, the default setting here is 1m, before calibration can customize the test distance, must be a decimal, set the click in the blank, the program will automatically write. If the car moves farther than the acceptable error range (the value of the tolerance variable), then the value of odom_linear_scale_correction is set. Here's what each parameter means,

ParametersMeanings
raterelease frequency(can need not modify)
test_distanceThe distance from which the line speed is tested
speedThe magnitude of the line speed
toleranceThe acceptable error
odom_linear_scale_correctionThe ratio factor
start_testTo start the test
directiondirection (linear velocity test X (1) Y direction (0))
base_framelistens for the parent coordinate of the TF transform
odom_framelistens for the sub-coordinate of the TF transformation

The variable Settings for testing angular velocity are roughly the same, but test_distance becomes test_angle and speed becomes angular velocity.

5.4. Core Source Code Parsing

This program mainly uses TF to monitor the transformation between coordinates to achieve, by monitoring the coordinate transformation between base_footprint and odom to let the robot know "how far I go now/how many degrees I turn now".

Take calibrate_linear.py as an example. The core code is as follows:

xxxxxxxxxx
#监听TF变换# Monitor TF transformation
def get_position(self):
    try:
        now = rclpy.time.Time()
        trans = self.tf_buffer.lookup_transform(self.odom_frame,self.base_frame,now)   
        return trans       
    except (LookupException, ConnectivityException, ExtrapolationException):
        self.get_logger().info('transform not ready')
        raise
        return
​
#获取当前的xy坐标,根据之前的xy坐标,计算距离
# Get the current xy coordinates and calculate the distance based on the previous xy coordinates
self.position.x = self.get_position().transform.translation.x
self.position.y = self.get_position().transform.translation.y
print("self.position.x: ",self.position.x)
print("self.position.y: ",self.position.y)
distance = sqrt(pow((self.position.x - self.x_start), 2) +
                pow((self.position.y - self.y_start), 2))
distance *= self.odom_linear_scale_correction

calibrate_angular.py core code is as follows:

xxxxxxxxxx
#这里同样是监听了TF变换,获取到了当前位姿信息,只不过这里还做了转换,把四元数转了欧拉角的转换,然后再返回
# Here is also listening to the TF transformation to obtain the current pose information, but here is also a conversion, the quaternion to the Euler Angle conversion, and then return
def get_odom_angle(self):
    try:
        now = rclpy.time.Time()
        rot = self.tf_buffer.lookup_transform(self.odom_frame,self.base_frame,now)   
        print("orig_rot: ",rot.transform.rotation) 
        cacl_rot = PyKDL.Rotation.Quaternion(rot.transform.rotation.x, rot.transform.rotation.y, rot.transform.rotation.z, rot.transform.rotation.w)
        #print("cacl_rot: ",cacl_rot)
        angle_rot = cacl_rot.GetRPY()[2]
        #print("angle_rot: ",angle_rot)
        return angle_rot
​
    except (LookupException, ConnectivityException, ExtrapolationException):
        self.get_logger().info('transform not ready')
        raise
        return
​
#计算旋转角度# Calculate the rotation Angle
self.odom_angle = self.get_odom_angle()
self.delta_angle = self.odom_angular_scale_correction * self.normalize_angle(self.odom_angle - self.first_angle)

The published TF transform is published in the base_node node, the code path is,

xxxxxxxxxx
/userdata/yahboomcar_ws/src/yahboomcar_base_node/src/base_node.cpp

This node will receive /vel_raw data, release odom data through mathematical calculation, and release TF transformation. The core code is as follows:

xxxxxxxxxx
#计算xy坐标以及xyzw四元数的值,xy两点坐标表示位置,xyzw四元数表示姿态
# Calculate the xy coordinates and the value of the xyzw quaternion, where the xy two-point coordinates represent the position and the xyzw quaternion represents the attitude
double delta_heading = angular_velocity_z_ * vel_dt_; //radians
double delta_x = (linear_velocity_x_ * cos(heading_)-linear_velocity_y_*sin(heading_)) * vel_dt_; //m
double delta_y = (linear_velocity_x_ * sin(heading_)+linear_velocity_y_*cos(heading_)) * vel_dt_; //m   
x_pos_ += delta_x;
y_pos_ += delta_y;
heading_ += delta_heading;
tf2::Quaternion myQuaternion;
geometry_msgs::msg::Quaternion odom_quat ; 
myQuaternion.setRPY(0.00,0.00,heading_ );
​
#发布TF变换# Release TF transform
geometry_msgs::msg::TransformStamped t;
rclcpp::Time now = this->get_clock()->now();
t.header.stamp = now;
t.header.frame_id = "odom";
t.child_frame_id = "base_footprint";
t.transform.translation.x = x_pos_;
t.transform.translation.y = y_pos_;
t.transform.translation.z = 0.0;
t.transform.rotation.x = myQuaternion.x();
t.transform.rotation.y = myQuaternion.y();
t.transform.rotation.z = myQuaternion.z();
t.transform.rotation.w = myQuaternion.w();
tf_broadcaster_->sendTransform(t);

 

Robot state estimation
Robot trajectory tracking

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文