Carsim、Simulink与Ros联合仿真(二)-自定义消息数据类型

3 篇文章 0 订阅
2 篇文章 0 订阅

前言

在上一个联合仿真中每一次发送一个数据就要建立一个话题太麻烦了,而自带的数据类型太多了,我不熟悉,所以我想写一个属于carsim的数据类型用于三者联仿。

一、前提条件

1、在Windows系统已安装Carsim、MATLAB,在VMware虚拟机已安装Ubuntu,在Ubuntu中安装了Ros。

2、MATLAB 2020b以上的版本自带了ROS Toolbox Interface for ROS Custom Messages 工具,如果低于这个版本就需要自行下载(比较麻烦,我没弄,我用的是MATLAB 2022b)。

二、创建包含自定义数据类型的ROS功能包

1、创建功能包

在上个博客的工作空间的src文件目录下打开终端,运行:

catkin_create_pkg carsim_msgs roscpp rospy std_msgs

 就生成了如下所示的carsim_msgs文件夹

2、在carsim_msgs文件夹目录下创建msg文件夹

3、在msg文件夹下创建Carsim.msg文件

文件首字母大写,不能包含_下划线等符号

4、在Carsim.msg文件中添加消息数据类型

# 车辆通用属性
float64 speed               # 整车速度,单位为米/秒
float64 acceleration        # 整车加速度,单位为米/秒²
float64 target_speed        # 车辆目标速度,单位为米/秒
float64 throttle            # 油门输入,0到1的百分比
float64 brake               # 刹车输入,0到1的百分比
string car_name             # 车辆模型名称
float64 front_wheel_angle   # 前轮转角,单位为弧度
float64 steering_wheel_angle # 方向盘转角,单位为弧度

# 电动汽车特有属性
float64 motor_rpm           # 电动机转速,每分钟转数
float64 motor_temperature   # 电动机温度,单位为摄氏度
float64 motor_torque        # 电动机扭矩,单位为牛顿米

# 四轮独立驱动特有属性
float64 motor_torque_FL     # 前左电动机扭矩,单位为牛顿米
float64 motor_torque_FR     # 前右电动机扭矩,单位为牛顿米
float64 motor_torque_RL     # 后左电动机扭矩,单位为牛顿米
float64 motor_torque_RR     # 后右电动机扭矩,单位为牛顿米
bool wheel_drive_status_FL  # 前左车轮驱动状态,true表示驱动
bool wheel_drive_status_FR  # 前右车轮驱动状态,true表示驱动
bool wheel_drive_status_RL  # 后左车轮驱动状态,true表示驱动
bool wheel_drive_status_RR  # 后右车轮驱动状态,true表示驱动
float64 wheel_rpm_FL        # 前左轮转速,单位为转/分钟
float64 wheel_rpm_FR        # 前右轮转速,单位为转/分钟
float64 wheel_rpm_RL        # 后左轮转速,单位为转/分钟
float64 wheel_rpm_RR        # 后右轮转速,单位为转/分钟

# 四轮独立转向特有属性
float64 steering_angle_FL   # 前左车轮转向角度,单位为弧度
float64 steering_angle_FR   # 前右车轮转向角度,单位为弧度
float64 steering_angle_RL   # 后左车轮转向角度,单位为弧度
float64 steering_angle_RR   # 后右车轮转向角度,单位为弧度
bool wheel_turning_FL       # 前左车轮转向状态,true表示正在转向
bool wheel_turning_FR       # 前右车轮转向状态,true表示正在转向
bool wheel_turning_RL       # 后左车轮转向状态,true表示正在转向
bool wheel_turning_RR       # 后右车轮转向状态,true表示正在转向

# 车辆大地坐标系下的位置和偏航角
float64 position_x          # 车辆在大地坐标系下的X坐标
float64 position_y          # 车辆在大地坐标系下的Y坐标
float64 yaw                 # 车辆在大地坐标系下的偏航角,单位为弧度

# 车辆目标路径的坐标和偏航角
float64 target_path_x       # 目标路径上的X坐标
float64 target_path_y       # 目标路径上的Y坐标
float64 target_yaw          # 目标路径上的偏航角,单位为弧度

# 车辆自身的姿态
float64 roll                # 车辆的横滚角,单位为弧度
float64 pitch               # 车辆的俯仰角,单位为弧度
float64 yaw_rate            # 车辆的横摆角速度,单位为弧度/秒

5、修改CMakeLists.txt文件

主要是添加依赖,下面标红的是需要添加修改的

find_package(catkin REQUIRED COMPONENTS
  message_generation
  message_runtime

  roscpp
  std_msgs
)

add_message_files(
  FILES
  Carsim.msg
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES carsim_msgs
 CATKIN_DEPENDS roscpp std_msgs message_runtime message_generation
#  DEPENDS system_lib
)

下面是我的CMakeLists.txt文件内容

cmake_minimum_required(VERSION 3.0.2)
project(carsim_msgs)


find_package(catkin REQUIRED COMPONENTS
  message_generation
  message_runtime
  roscpp
  std_msgs
)

add_message_files(
  FILES
  Carsim.msg
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES carsim_msgs
 CATKIN_DEPENDS roscpp std_msgs message_runtime message_generation
#  DEPENDS system_lib
)

include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

6、修改package.xml文件

在package.xml文件的相应位置加入:

  <build_depend>message_generation</build_depend>
  <build_depend>message_runtime</build_depend>

  <exec_depend>message_generation</exec_depend>
  <exec_depend>message_runtime</exec_depend>

下图是我的

7、编译

在上个博客的工作空间ros_simulink_ws的目录下打开终端,运行:

catkin_make

8、参考文件链接

ros2话题的发布者和订阅者——ubuntu20.04+自定义话题接口类型_ros2 输出自定义话题-CSDN博客

三、在MATLAB创建ROS的自定义数据类型

1、复制功能包

自己新建一个文件夹ROS_matlab(自命名的),记住路径:D:\ROS_matlab

把carsim_msgs文件夹复制到这个文件夹

确保只保留 Carsim.msg 和 package.xml 这两个文件。

2、修改Carsim.msg文件

把注释全部删除,不能有中文


float64 speed              
float64 acceleration        
float64 target_speed        
float64 throttle           
float64 brake               
string car_name             
float64 front_wheel_angle   
float64 steering_wheel_angle


float64 motor_rpm           
float64 motor_temperature   
float64 motor_torque        


float64 motor_torque_FL     
float64 motor_torque_FR     
float64 motor_torque_RL     
float64 motor_torque_RR     
bool wheel_drive_status_FL  
bool wheel_drive_status_FR  
bool wheel_drive_status_RL  
bool wheel_drive_status_RR  
float64 wheel_rpm_FL       
float64 wheel_rpm_FR      
float64 wheel_rpm_RL        
float64 wheel_rpm_RR       


float64 steering_angle_FL  
float64 steering_angle_FR   
float64 steering_angle_RL  
float64 steering_angle_RR   
bool wheel_turning_FL       
bool wheel_turning_FR       
bool wheel_turning_RL       
bool wheel_turning_RR       


float64 position_x          
float64 position_y          
float64 yaw                


float64 target_path_x     
float64 target_path_y    
float64 target_yaw         


float64 roll               
float64 pitch              
float64 yaw_rate           

3、修改package.xml文件

这里package.xml 中功能包名称必须和文件所在文件夹名称一致

4、使用MATLAB生成ROS消息

指定该程序包的位置,并使用rosgenmsg命令生成自定义消息文件

在MATLAB命令行窗口输入:

folderpath='D:/ROS_matlab/'

rosgenmsg(folderpath)

会得到下面的结果(如果报错,编译之前要先下载一个c++编译器,(visual studio就可以,最好用这个),下载之后再在命令行中输入mex -setup cpp,MATLAB会自动寻找编译器;并且注意要把,msg,action,srv文件中的中的注释删掉,否则会报错。还有极大概率会遇到编码问题,这个时候查看报错中显示的日志文件,根据日志文件来修改MATLAB中相关的python文件,把其中读取文件的格式改为“UTF-8”。,具体内容在后面的链接中

在ROS_matlab文件夹下会生成一个文件夹matlab_msg_gen_ros1

5、保存路径

 将生成的MATLAB消息代码路径添加到MATLAB路径

addpath('D:\ROS_matlab\matlab_msg_gen_ros1\win64\install\m')

将自定义消息文件夹添加到MATLAB路径中。这可以通过在MATLAB命令窗口执行以下命令:

savepath

刷新所有消息类定义,这需要清除工作区。在MATLAB命令窗口执行以下命令:

clear classes

rehash toolboxcache

重启MATLAB

6、参考文件链接

关于Matlab/Simulink 中ROS学习总结(二)自定义 ROS message 类型_simulink添加自定义msg-CSDN博客MATLAB使用Ros自定义消息类型_使用matlab接受ros自定义消息-CSDN博客

四、在Simulink中使用自定义的数据类型

1、建立MATLAB与ROS的连接

与上一个博客一样

2、确保有自定义的数据类型

在MATLAB命令行窗口通过命令看一下有没有自定义的数据类型:

rosmsg list

看一下自定义的消息类型

rosmsg show carsim_msgs/Carsim 

没有问题

3、修改Simulink文件中的模块设置

如上所示,修改完的简化了很多

4、编译、运行

与上一个博客一样,这里就不说了

5、遇到的问题

1、报错

Sample time mismatch. When a Bus Creator or Bus Assignment block outputs a nonvirtual bus, all of the signals driving its input ports must have the same sample time. This restriction applies even if the elements of the object defining the bus specify an inherited (-1) sample time. The sample time (0.0005) of the signal driving '输入端口 3' of 'demo1_cortol_v/Bus Assignment1' does not match the sample time (0) of the block.

这是因为我在carsim设置的仿真步长为0.0005,把demo1_cortol_v.slx的仿真步长设置为0.0005就可以了

2、车速没有跟上期望车速

分别运行demo1_cortol_v.slx文件和ros节点,通过rostopic list命令看一下他们发出的话题一不一样

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值