使用python,通过串口ROS直接控制电机驱动器(7)

在做好电机的驱动后,接下来我们便可以把它移植到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);
}

 

猜你喜欢

转载自blog.csdn.net/zengqz123/article/details/86507678