在做好电机的驱动后,接下来我们便可以把它移植到ROS平台上,移植的过程其实很简单,就是按照官方的例程订阅和发布消息。首先我们要确认我们的程序要订阅些什么内容,比如说很容易想到我们要订阅速度信息,并发布实际速度信息,等等。
如图所示是传统电机的驱动模型,因此我们移植到ROS平台上需要订阅cmd_vel(速度信息),和发布Odometry(里程计信息)。
在订阅了速度信息后,我的地盘是两车轮模型,我要把系统的速度分解到每个车轮上,因此参考网上的两车轮差速模型计算出每个车轮的速度。
在参考在GitHub上Forrest的电机实现后GitHub地址,我有了更深的理解:
基于串口通信的ROS小车基础控制器,功能如下:
1.实现ros控制数据通过固定的格式和串口通信,从而达到控制小车的移动
2.订阅了/cmd_vel主题,只要向该主题发布消息,就能实现对控制小车的移动
3.发布里程计主题/odm
首先我们可以参考里面的两车轮模型,由于我们订阅的是速度消息类型为Twist,查询文档(文档链接)后可知twist包含了六个数据,分别为线速度的xyz和角速度的xyz。因此我们参考解决方法:
void callback(const geometry_msgs::Twist & cmd_input)//订阅/cmd_vel主题回调函数
{
string port("/dev/ttyUSB0"); //小车串口号
unsigned long baud = 115200; //小车串口波特率
serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); //配置串口
angular_temp = cmd_input.angular.z ;//获取/cmd_vel的角速度,rad/s
linear_temp = cmd_input.linear.x ;//获取/cmd_vel的线速度.m/s
//将转换好的小车速度分量为左右轮速度
left_speed_data.d = linear_temp - 0.5f*angular_temp*D ;
right_speed_data.d = linear_temp + 0.5f*angular_temp*D ;
//存入数据到要发布的左右轮速度消息
left_speed_data.d*=ratio; //放大1000倍,mm/s
right_speed_data.d*=ratio;//放大1000倍,mm/s
for(int i=0;i<4;i++) //将左右轮速度存入数组中发送给串口
{
speed_data[i]=right_speed_data.data[i];
speed_data[i+4]=left_speed_data.data[i];
}
//在写入串口的左右轮速度数据后加入”/r/n“
speed_data[8]=data_terminal0;
speed_data[9]=data_terminal1;
//写入数据到串口
my_serial.write(speed_data,10);
}