jarvis_chan 发表于 2017-9-9 22:04:32

HCRbot 系列6──HCRbot 底层驱动 OpenCR 设置


庆祝论坛终于支持 Markdown 了!
庆祝论坛终于支持 Markdown 了!
庆祝论坛终于支持 Markdown 了!

赶紧来试一下。

这篇是 HCRbot 机器人系列的第 6 篇,主要将 HCRbot 机器人的底层设置,主要是代码层面的,因为 HCR 底层的电路连线,DFRobot 的 wiki 上面应该有了,此处就不再赘述。

下面是目前已经写好的所有篇章链接:

- HCRbot系列1──HCRbot简介:[https://mc.dfrobot.com.cn/thread-26938-1-1.html](https://mc.dfrobot.com.cn/thread-26938-1-1.html)
- HCRbot系列2──HCRbot硬件介绍与设置:[https://mc.dfrobot.com.cn/thread-26939-1-1.html](https://mc.dfrobot.com.cn/thread-26939-1-1.html)
- HCRbot系列3──HCRbot 上位机 PC 端软件设置:[https://mc.dfrobot.com.cn/thread-26975-1-1.html](https://mc.dfrobot.com.cn/thread-26975-1-1.html)
- HCRbot系列4──HCRbot下位机设置(树莓派版):[https://mc.dfrobot.com.cn/thread-27020-1-1.html](https://mc.dfrobot.com.cn/thread-27020-1-1.html)
- HCRbot系列5──HCRbot下位机设置(Odroid XU4版):[https://mc.dfrobot.com.cn/thread-27161-1-1.html](https://mc.dfrobot.com.cn/thread-27161-1-1.html)



下面开始正式篇章,关于 OpenCR 的介绍,请查看(https://github.com/ROBOTIS-GIT/OpenCR/wiki)。

官方例程中提供了 turtlebot 3 下位机的例程,我们只需对电机驱动部分做一些相应的更改,就可以满足控制 HCRbot 的需求了。详细代码可以参考[官方turtlebot 3例程](https://github.com/ROBOTIS-GIT/O ... ibraries/turtlebot3)。

首先 HCRbot 版本的底层驱动程序下载地址为:

[https://github.com/chenzhongxian/hcr_ros_firmware.git](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 * 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;
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");
}
```
- (https://github.com/ROBOTIS-GIT/OpenCR/wiki)
- (https://wiki.dfrobot.com.cn)
- (https://mc.dfrobot.com.cn/thread-11030-1-1.html)











Ash 发表于 2017-9-11 10:20:29

呦吼 感觉还不错哟

刘智勇 发表于 2018-6-6 16:32:48

您好 下载的代码在arduino打开后编译没有通过 您的软件包库文件是全的么 还是需要放到arduino library里面去呢?

铁熊 发表于 2018-6-6 18:02:26

刘智勇 发表于 2018-6-6 16:32
您好 下载的代码在arduino打开后编译没有通过 您的软件包库文件是全的么 还是需要放到arduino library里面 ...

要先设置OpenCR这块板子的哦,设置教程科技参考:http://emanual.robotis.com/docs/en/parts/controller/opencr10/#install-the-opencr-package-via-boards-manager
页: [1]
查看完整版本: HCRbot 系列6──HCRbot 底层驱动 OpenCR 设置