Carsim、Simulink与Ros联合仿真(一)-实现联仿

一、前提条件

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

2、已完成Carsim与Simulink的联合仿真,并且运行成功。

我的Carsim与Simulink的联合仿真是根据设置的期望速度和carsim反馈发实车速度,通过PID控制得到期望加速度,然后再转化为每个车轮的驱动扭矩和车辆的制动压力,从而实现车辆的速度闭环控制。(可以自己设置一个简单的控制)

二、建立MATLAB与ROS通信

1、在ubuntu系统查看本机地址(虚拟机中)

在终端运行查看本机地址命令

ifconfig

 如果没有发现这个命令,运行:

sudo apt install net-tools

安装完net-tools后,重新运行ifconfig,如下所示,找到本机IP:192.168.159.129(我的是这个)

 2、将本机IP写入到.bashrc文件

 打开home文件夹,按Ctrl+h显示隐藏的文件,选择.bashrc并打开

打开后在最后加入以下命令(后面的IP改为你的虚拟机的IP),然后保存退出

export ROS_IP=192.168.159.129

3、打开ROS

在终端运行:

roscore

4、在Windows系统查看本机地址

找到命令提示符

在命令提示符运行:

ipconfig

找到本机IP: 192.168.165.53(我的是这个)

5、在MATLAB建立连接

在MATLAB的命令行窗口,运行:

setenv('ROS_MASTER_URI','http://192.168.159.129:11311')
setenv('ROS_IP', '192.168.165.53')
rosinit

(在运行rosinit之前,确保Ubuntu系统中的ROS正在运行)

在MATLAB中,如果你想关闭与ROS的连接,可以在MATLAB的命令行窗口使用以下命令:

rosshutdown

这个命令将关闭MATLAB与ROS master之间的连接,并且停止所有MATLAB中创建的ROS节点。如果你有发布者、订阅者或服务正在运行,它们都将被关闭。

在调用rosshutdown之前,确保你已经保存了所有必要的数据,因为关闭连接后,MATLAB将不再接收ROS消息或与ROS节点进行通信。

6、参考文件链接

http://t.csdnimg.cn/z1WAsicon-default.png?t=N7T8http://t.csdnimg.cn/z1WAs

三、在Simulink中发布和订阅话题topic

1、发布和订阅话题的模块

1.1 发布话题

在Simulink中,使用ROS Toolbox时,"Blank Message"模块、"Bus Assignment"模块和"Publish"模块通常一起使用来创建和发布ROS消息。如下所示,我将carsim的速度和期望的速度分别通过话题cmd_vel和cmd_vel_des发布。

Blank Message模块

可以自行选择需要的数据类型(但是要确保同一个话题的"Blank Message"模块、"Publish"模块和"Subscribe"模块的数据类型要一致)

Bus Assignment模块

将Blank Message模块和Bus Assignment模块连接以后,把“要赋值的元素”中的元素删除,把“总线中的元素”Data选择入“要赋值的元素”中(如果“总线中的元素”没有元素,需要点击一下运行)(不同的数据类型有不同的元素,需要自行尝试)

Publish模块

发布的话题topic的名称可以自己设置

1.2 订阅话题

在Simulink中,使用ROS Toolbox时,"Subscribe"模块和"Bus Selector"模块通常一起使用来接收和处理ROS消息。如下所示,我将订阅话题throttle_cmd和brake_cmd发布的扭矩和压力消息

Subscribe模块

保证订阅的话题名称和数据类型是与你需要的一致

Bus Selector模块

和Bus Assignment模块差不多

2、测试

如下所示,我把控制部分注释掉,通过发布两个话题和订阅两个话题(我订阅了三个,有一个加速度只是观测,不进行控制)来控制carsim

点击运行(确保MATLAB和ROS已连接)以后可以在观测区看到车辆的速度并没有被控制,这是因为还没有控制的话题发布,但是可以在MATLAB的命令行窗口输入指令:

rostopic list

可以看见订阅和发布的话题

3、参考文件链接

使用MATALB来辅助ROS开发时常用的simulink模块介绍 - 古月居 (guyuehome.com)

二、在Simulink中生成Ros的代码

通过生成的ros代码发布和订阅上面的话题

1、新建一个Simulink文件

将PID速度控制模块复制到新建的Simulink文件。

2、配置“模型设置”

在求解器选择--->类型--->定步长。

在求解器详细信息--->固定步长--->0.01。

在硬件实现--->Hardware board--->Robot Operating System (ROS)。

3、发布和订阅话题

和前面操作一样

4、编译成代码

(确保MATLAB和ROS已连接)

在文件夹会生成两个文件

5、Ubuntu系统文件配置

5.1 创建工作空间

在主文件夹打开终端,输入:

mkdir ros_simulink_ws

cd ros_simulink_ws/

mkdir src

5.2 复制文件

将在Windows生成的两个文件复制到下面的目录下

我会出现下面这个问题,选择“全部跳过”(有人知道这是什么问题,怎么解决,请在评论区告知,十分感谢)

5.3 提取文件

或者(当没有提取到此处这个选项时)

5.4 编译工作空间

catkin_make

5.5 设置环境变量

方法一:

source devel/setup.bash

方法二:

打开home文件夹,按Ctrl+h显示隐藏的文件,选择.bashrc并打开

打开后在最后加入以下命令(ros_simulink_ws是我的工作空间,改为自己的),然后保存退出

source ~/ros_simulink_ws/devel/setup.bash

四、ROS运行控制节点,Simulink运行联仿文件

(确保MATLAB和ROS已连接)

在Ubuntu系统新打开一个终端运行:

rosrun ros_pid_v ros_pid_v 

在Windows系统运行Simulink文件

运行结果(运行很慢,就不等运行完了)

参考文件链接

使用树莓派4B搭建简易的控制器硬件在环仿真平台_树莓派4b硬件在环hil联合仿真-CSDN博客

ROS-MATLAB/SIMULINK 基础笔记 - 知乎 (zhihu.com)

(垃圾信息,不一定有用)

mkdir ros_pid_v

tar zxvf ros_pid_v.tgz -C ~/ros_simulink_ws/src/ros_pid_v/

cd ~/ros_simulink_ws/

catkin_make

source devel/setup.bash

rosrun ros_pid_v ros_pid_v 

### OmegaConf 配置管理简介 OmegaConf 是一个强大的 Python 库,用于处理复杂的配置文件。它支持多种数据结构(如字典、列表)以及 YAML 文件的解析和操作。以下是有关如何使用 OmegaConf 的详细介绍。 #### 创建配置对象 可以通过 `OmegaConf.create` 方法创建一个新的配置对象。该方法可以接受字典、YAML 字符串或其他兼容的数据结构作为输入[^1]。 ```python import omegaconf from omegaconf import OmegaConf config_dict = {"database": {"host": "localhost", "port": 6379}} config = OmegaConf.create(config_dict) print(OmegaConf.to_yaml(config)) # 将配置转换为 YAML 格式的字符串 ``` #### 加载外部 YAML 文件 如果需要加载外部 YAML 文件,可使用 `OmegaConf.load` 方法。这使得程序能够轻松读取并应用存储在磁盘上的配置文件。 ```python yaml_file_path = "./example_config.yaml" file_conf = OmegaConf.load(yaml_file_path) # 打印加载后的配置内容 print(file_conf.database.host) # 输出 'localhost' ``` #### 合并多个配置源 当存在多个配置来源时(如默认设置与命令行参数),可以使用 `OmegaConf.merge` 来无缝合并它们。此功能允许开发者优先级较高的配置覆盖较低级别的配置项。 ```python default_configs = OmegaConf.create({"model": {"type": "resnet50"}}) cli_args = OmegaConf.from_dotlist(["model.type=vgg16"]) merged_config = OmegaConf.merge(default_configs, cli_args) assert merged_config.model.type == "vgg16" # 命令行参数成功覆盖默认值 ``` #### 动态更新配置 除了静态定义外,还可以通过访问器动态修改现有配置中的字段。这种灵活性非常适合运行时调整某些超参数或环境变量。 ```python dynamic_update = file_conf.copy() dynamic_update.database.port = 8080 print(dynamic_update.database.port) # 输出新的端口号 8080 ``` #### 错误处理机制 为了防止非法赋值破坏整个系统的稳定性,OmegaConf 提供了严格的模式控制选项。启用严格模式后,任何未声明过的键都将引发异常提示用户修正错误。 ```python strict_mode_enabled = file_conf.copy() strict_mode_enabled.set_struct(True) # 开启只读保护状态 try: strict_mode_enabled.new_field = True # 此处会抛出 AttributeError 异常 except AttributeError as e: print(f"Catch expected error: {e}") ``` --- ### 总结 以上展示了 OmegaConf 在不同场景下的典型用法,包括但不限于初始化配置实、加载外部资源、融合多层设定逻辑以及实施安全防护措施等方面的功能特性。希望这些子能帮助快速掌握其核心概念和技术要点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值