庆祝论坛终于支持 Markdown 了!
庆祝论坛终于支持 Markdown 了!
庆祝论坛终于支持 Markdown 了!
赶紧来试一下。
这篇是 HCRbot 机器人系列的第 6 篇,主要将 HCRbot 机器人的底层设置,主要是代码层面的,因为 HCR 底层的电路连线,DFRobot 的 wiki 上面应该有了,此处就不再赘述。
下面是目前已经写好的所有篇章链接:
下面开始正式篇章,关于 OpenCR 的介绍,请查看OpenCR wiki。
官方例程中提供了 turtlebot 3 下位机的例程,我们只需对电机驱动部分做一些相应的更改,就可以满足控制 HCRbot 的需求了。详细代码可以参考官方turtlebot 3例程。
首先 HCRbot 版本的底层驱动程序下载地址为:
https://github.com/chenzhongxian/hcr_ros_firmware.git
大家可以先下载代码,然后对照着看。
相较于 turtlebot 3 下位机的例程,本系统主要修改如下几处地方:
- hcr_core.ino 文件中 IMU 的位置,即
tf
相关的参数,大家根据自己的安装位置修改即可;
- hcr_core_config.h 文件中的一些机器人参数,比如尺寸、电机参数等;
- hcr_motor_driver.ino 文件中的电机驱动函数。
hcr_core 文件
这个文件中,是 HCRbot 机器人下位机的核心代码,实现了与上位机的 ROS 通信,包括接收上位机的控制命令,并将下位机的传感器数据发送给上位机,比如 编码器数据、IMU 数据。大家主要关注 IMU 相关参数设置即可,其他的基本不用改。
下面是 IMU 位置参数修改:
// HCR IMU
tfs_msg.transform.translation.x = -0.12;
tfs_msg.transform.translation.y = 0.0;
tfs_msg.transform.translation.z = 0.17;
tfbroadcaster.sendTransform(tfs_msg);
大家可以按照自己的实际安装位置来设置。
hcr_core_config 文件
这个文件主要设置机器人物理结构尺寸等相关参数,大家根据实际情况修改就行,如果大家也是用 HCR 的话,应该基本上不需要改。
下面是 HCR 机器人相关物理参数设置,大家根据参数命名和注释,应该都能看明白:
/*******************************************************************************
* Robot geometric parameters
*******************************************************************************/
#define WHEEL_RADIUS 0.068 // meter (HCR : 0.068, BURGER : 0.033, WAFFLE : 0.033)
#define WHEEL_CIRCUMFERENCE 0.427256601 // meter (HCR : 0.427. BURGER : 0.207)
#define WHEEL_SEPARATION 0.275 // meter (HCR : 0.275, BURGER : 0.160, WAFFLE : 0.287)
#define TURNING_RADIUS 0.1375 // meter (HCR : 0.1375, BURGER : 0.080, WAFFLE : 0.1435)
#define ROBOT_RADIUS 0.220 // meter (HCR : 0.220, BURGER : 0.105, WAFFLE : 0.220)
/*******************************************************************************
* Encoder parameters
*******************************************************************************/
#define ENCODER_MIN -2147483648 // raw
#define ENCODER_MAX 2147483648 // raw
#define ENCODER_TICK 2652.0 // encoder tick per revolution: 13 * 51 * 4 (HCR : 663, BURGER : 4096)
/*******************************************************************************
* Wheel definition
*******************************************************************************/
#define LEFT 0
#define RIGHT 1
/*******************************************************************************
* Velocity parameters
*******************************************************************************/
// HCR
#define VELOCITY_CONSTANT_VALUE 140.430503752 // V = r * w = r * (RPM * 2 * pi / 60)
// = 0.068 * RPM * 0.10472
// RPM = V * 140.430503752
// BURGER and WAFFLE
// #define VELOCITY_CONSTANT_VALUE 1263.632956882 // V = r * w = r * RPM * 0.10472
// = 0.033 * 0.229 * Goal RPM * 0.10472
// Goal RPM = V * 1263.632956882
#define LIMIT_X_MAX_VELOCITY 130 // Limit RPM values of Motor
#define MAX_LINEAR_VELOCITY 0.30 // maxRPM / VELOCITY_CONSTANT_VALUE, m/s (HCR : < 1.0, BURGER : 0.22)
#define MAX_ANGULAR_VELOCITY 1.50 // MAX_LINEAR_VELOCITY / TURNING_RADIUS, rad/s (HCR : < 7.3, BURGER : 2.84)
#define VELOCITY_STEP 0.01 // m/s
#define VELOCITY_LINEAR_X 0.01 // m/s
#define VELOCITY_ANGULAR_Z 0.1 // rad/s
#define SCALE_VELOCITY_LINEAR_X 1
#define SCALE_VELOCITY_ANGULAR_Z 1
// HCR
#define TICK2RAD 0.002369225 // 2 * pi / ENCODER_TICK = 0.002369225f
// BURGER
// #define TICK2RAD 0.001533981 // 0.087890625[deg] * 3.14159265359 / 180 = 0.001533981f
#define DEG2RAD(x) (x * 0.01745329252) // *PI/180
#define RAD2DEG(x) (x * 57.2957795131) // *180/PI
其他参数设置,大家可以自行看 hcr_core_config.h 文件。
其他细节修改,请阅读源文件,修改过的地方,我都做了注释。
hcr_motor_driver 文件
这个文件主要包含了对 HCRbot 机器人电机的驱动程序。
/*******************************************************************************
* motor driver
*******************************************************************************/
void speedControl(int M1Speed, int M2Speed)
{
// 异步转速,驱动器接收到执行指令才开始驱动电机
Serial2.print("1,SVR,1,");
Serial2.println(M1Speed, DEC);
Serial2.print("1,SVR,2,");
Serial2.println(M2Speed, DEC);
Serial2.println("1,AVR,1,1"); // 执行异步转速
}
void readEncoder()
{
// Serial2.println("1,CER"); // 清除所有故障信息
char inString[14];
Serial2.println("1,GEP,1");
Serial2.setTimeout(10);
Serial2.readBytes(inString, 13);
sensor_state_msg.left_encoder = atoi(inString);
Serial2.println("1,GEP,2");
Serial2.setTimeout(10);
Serial2.readBytes(inString, 13);
sensor_state_msg.right_encoder = atoi(inString);
// Debug
Serial4.print("e");
Serial4.print("\t");
Serial4.print(sensor_state_msg.left_encoder);
Serial4.print("\t");
Serial4.print(sensor_state_msg.right_encoder);
Serial4.print("\n");
}
void cleanEncoder()
{
Serial2.println("1,CER"); // 清除所有故障信息
Serial2.println("1,CEP,1");
Serial2.println("1,CEP,2");
}