简介

在进行无人车的规划、控制算法调试时,直接在实车上进行不仅危险且效率低下,一个好的运动学仿真平台将会加速开发进度。Carsim非常适合进行车辆动力学仿真,但是只能运行在Windows系统上,好在它可以连接Simulink。而无人车的规划、控制算法通常运行在Linux系统上,各个模块通常使用ROS进行连接。本篇文章提供一种方法,将ROS 、 Simulink、carsim进行互联,完成规划、控制算法的动力学仿真。

准备工作

a、硬件基础:PC1和PC2使用路由器连接同一局域网

b、PC1为Ubuntu系统,运行规划、控制算法,各模块使用ROS进行通信

c、PC2为Windows系统,运行Simulink和Carsim

1、PC1上的ROS节点建立

建立两个ROS节点,一个为 Talker 负责发送车辆的转向、油门、刹车指令,一个为 Listener接收车辆的位姿信息,(此处msgs仅为示例,需结合具体的工程项目建立相应的node和topic)

Talker节点

//talker.cpp
#include <stdio.h>
#include "ros/ros.h"
#include "geometry_msgs/Pose2D.h"
#include "std_msgs/Float64.h"

int main(int argc,char **argv)
{
    ros::init(argc,argv,"talker1");
    ros::NodeHandle n;
    ros::Publisher chatter_pub = n.advertise<geometry_msgs::Pose2D>("control",10);
    ros::Rate loop_rate(10);           
    float count = 0;
    while(ros::ok())
    {
        geometry_msgs::Pose2D msg;
        msg.x = count * 0.01;      // 油门开度
        msg.y = 0.5;               //方向盘扭矩 
        msg.theta = 0;             //刹车气缸的压强
        ROS_INFO("%f",msg.x);
        //printf("%f\n",msg.data);
        chatter_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
        ++count;

        if (msg.x > 1)
        {
            count = 0;
        }
    }
    return 0;
}

Listener节点

//listenner.cpp
#include <stdio.h>
#include "ros/ros.h"
#include "geometry_msgs/Pose2D.h"
void chatterCallback(const geometry_msgs::Pose2D& msg)
{
    //ROS_INFO("I heard:[%f]",msg );
    ROS_INFO("I heard:",msg );
    printf("%f\n",msg.x);
    printf("%f\n",msg.y);
    printf("%f\n",msg.theta);
}
int main(int argc,char **argv)
{
    ros::init(argc,argv,"listener1");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("simulink_pose",1,chatterCallback);
    ros::spin();
    return 0;
}

进入主文件夹,使用从Ctrl + H快捷键显示隐藏的文件

双击 .bashrc文件,在末尾加入两行代码

192.168.0.101为PC1的IP地址

2、Carsim的通道设置

输入通道分别为油门开度、方向盘扭矩、刹车压力

输出通道分别为X、Y、Yaw、速度、方向盘转角

3、PC2上的Simulink模型的搭建

参考资料

Simulink模型

该simulink模型的下载链接

接收节点

进入simulink library browser中的ROS工具箱,添加subscribe工具箱,并双击,将弹出如下的窗口

a、选择topic的来源

b、 编辑topic的名称,输入/control,与ROS的talker节点里的topic对应

c、选择msg的类型,与talker节点里的topic的msg对应

总线选择器的设置

添加总线选择器模块bus selector,以subscribe的msg引脚作为它的输入,并双击进行参数设置

使用select按钮进行bus selector输出引脚的定义

发送节点的定义

从Simulink library browser中的ROS工具箱添加空白消息模块blank message,该模块用于创建ROS消息,并双击进行参数设置

Message类型与ROS中的listener节点中的消息类型一致

从Simulink library browser中添加bus assignment模块,并双击打开如下窗口,使用select按钮进行输出通道设置

从Simulink library browser中的ROS工具箱添加publish模块,并双击进行参数设置

Topic为/simulink_pose,与ROS中的listener节点的话题名字对应 Message的类型与listener节点的消息类型对应

4、PC2的IP设置

选择Simulink菜单栏中的tools项,如下图所示进入到Configure Network Address项

上述操作将弹出以下窗口

红色圈为PC1的IP地址

5、启动

a、首先启动PC1上的ROS收发节点

b、PC2:在MATLAB的命令窗口输入以下指令,启动Simulink中的节点

其中192.168.0.101为PC1的IP地址,192.168.0.100为PC2的IP地址