最新消息:

2.4 从Simulink中创建单独的ROS节点

ROS1/一代机器人系统 少儿编程 2485浏览 0评论

本例程向用户展示如何从Simulink模型生成和编译一个单独的ROS节点。

2.4.1 引言

在本例,用户将会配置一个模型为一个单独的ROS节点生成C++代码,将会转换代码到Ubuntu Linux系统,编译ROS节点并运行。

2.4.2 预备知识

这个例程需要嵌入式编码器;

必须要有Ubuntu Linux系统用于编译和运行生成的C++代码,用户可以使用自己的Ubuntu系统,或使用机器人系统工具箱的Linux虚拟机例程(相关说明将在“4.2开始使用Gazebo和仿真TurtleBot”)。

复习“2.3使能ROS机器人的反馈控制”例程。

2.4.3 任务1-配置模型以生成代码

本任务中,用户将会配置一个模型为单独的ROS节点生成C++代码,该模型将是在“2.3使能ROS机器人的反馈控制”例程介绍的比例控制器。

打开“proportional controller model”“ robotExROSFeedbackControlExample”,选择“Edit > Select All”,然后“Edit > Copy”。

打开一个新的Simulink模型,选择“Edit > Paste”。

点击“Simulation > Model Configuration Parameters”。

在配置参数对话框的“Code Generation”面板,设置“SySTEM target file”为“ert.tlc”并点击“Apply”。然后,从“Target hardware”选择“Robot Operating SySTEM (ROS)”,再次点击“Apply”。观察到“ToolChain”被设置为“Catkin”。

2.4 从Simulink中创建单独的ROS节点

图2.4.1

在配置参数对话框的“Solver”面板,确保解算机(Solver)的“Type”设置为“Fixed-step”,并设置“Fixed-step size”为0.05。在生成的代码中,“Fixed-step size”定义了实际的时间步进,以秒为单位,用于模型的更新循环(参阅About Model Execution)。该值可以设置更小(如0.001或0.0001),但是本例0.05就已经足够了。

2.4 从Simulink中创建单独的ROS节点

2.4.2

参数配置对话框的“Coder Target”让用户定制生成的C++代码,“Package Information”组包含的信息将会被包含在生成的ROS节点的“package.xml”文件。更改“Maintainer name”为“ROS Example User”。

2.4 从Simulink中创建单独的ROS节点

2.4.3

点击“OK”关闭配置参数对话框,并保存模型的文件名为“RobotController.slx”。

2.4.4 任务2-生成C++ROS节点

(1)在MATLAB中,更改当前的文件夹到一个临时的位置,用户拥有写的权限。

(2)代码生成过程,首先准备为仿真准备模型,以确认所有的块都正确初始化。该准备工作需要已经启动有效的ROS主控节点。如果用户想要执行代码生成,选择“Tools > Robot Operating System (ROS) > Configure Network Addresses”,然后设置“ROS Master”和“Node Host”的“Network Address”的值为“Default”。

2.4 从Simulink中创建单独的ROS节点

2.4.4

(3)在MATLAB命令行中输入“rosinit”,创建一个本地的ROS主控节点。

(4)点击“Code > C/C++ Code > Build Model”,如果用户发现任何有关总线类型不匹配,则关闭模型,从基本MATLAB工作空间中清除所有变量,再重新打开模型。

(5)一旦编译完成,用户将会在当前文件夹看到两个文件:“RobotController.tgz”(包含C++代码的归档文件)和“build_ros_model.sh”(用于提取和编译C++代码的shell脚本)。

2.4 从Simulink中创建单独的ROS节点

2.4.5

2.4.5 任务3-转换文件到ROS系统

本任务假设用户正在使用带有机器人系统工具箱例程的Linux虚拟机,虚拟机被配置接收SSH和SCP的连接。如果用户使用自己的Linux系统,则向系统管理员咨询一个安全的方式转换文件。

(1)确保用户的宿主系统(包含“RobotController.tgz”和“build_ros_model.sh”文件的系统)拥有SCP客户端,对于Windows系统,下一步假设已经安装了PuTTY SCP客户端(pscp.exe)。

(2)使用SCP转换“RobotController.tgz”和“build_ros_model.sh”到用户的Linux虚拟机上的根目录(用户名是“user”,密码是“password”)。下面是示例的转换指令运行在宿主系统(用虚拟机的IP地址替换指令中的“192.168.60.163”):

如果宿主系统是Windows:

pscp.exe RobotController.tgz build_ros_model.sh user@192.168.60.163:

如果宿主系统是Linux或者Mac OS X

scp RobotController.tgz build_ros_model.sh user@192.168.60.163:

注意:“build_ros_model.sh”文件并不是模型特有的,所以只需被转换一次。

2.4.6 任务4-编译ROS节点

(1)在Linux系统,执行如下的命令以创建一个Catkin工作空间,只需做一次。(如果用户已经有一个Catkin工作空间,可以直接使用该工作空间)。

mkdir -p ~/catkin_ws_simulink/src

cd ~/catkin_ws_simulink/src

catkin_init_workspace

(2)在Linux系统执行如下的指令以解压缩并编译ROS节点

cd ~

./build_ros_model.sh RobotController.tgz ~/catkin_ws_simulink

2.4 从Simulink中创建单独的ROS节点

2.4.6

(3)生成的源码在“~/catkin_ws_simulink/src/robotcontroller/”下,查看“package.xml”的内容。

(4)使用如下的指令验证节点的可执行文件,如果可执行文件成功创建,指令将会列出有关可执行文件的信息。

file ~/catkin_ws_simulink/devel/lib/robotcontroller/robotcontroller_node

2.4 从Simulink中创建单独的ROS节点

2.4.7

2.4.7 任务5-运行和验证ROS节点

本任务中,用户将会运行新建立的ROS节点并使用基于MATLAB的机器人仿真器验证节点的表现。

(1)在Ubuntu Linux系统,启动ROS主控节点,如果指令返回错误“roscore”已经存在,那么进行下一步。

roscore &

(2)在宿主系统,根据如下代码启动基于MATLAB的机器人仿真器(参阅2.2从Simulink连接到ROS使能的机器人),该仿真器发布到“/odom”话题。

rosinit(’192.168.60.163′) % replace with IP address of ROS master

ExampleHelperRobotSimulator

(3)在Ubuntu Linux系统,运行新建立的ROS节点,该节点对从“/odom”话题接收到的新消息作出反应。

~/catkin_ws_simulink/devel/lib/robotcontroller/robotcontroller_node

(4)在Ubuntu Linux系统,打开一个新的终端并使用“rostopic list”和“rosnode info”验证节点是活动的。

2.4 从Simulink中创建单独的ROS节点

2.4.8

(5)在宿主计算机,验证仿真机器人向目标运动(“Desired Position”在模型中由常量指定),一旦机器人到达目的地则停止。当机器人停止,点击“ExampleHelperRobotSimulator”图像窗口上的“Randomize Location”,这将使机器人移动到一个随机的位置,那么机器人又要从该位置向目的地移动。

(6)一旦用户完成验证,可以通过根据如下步骤清除系统状态。

在宿主计算机,关闭“ExampleHelperRobotSimulator”图像窗口并在MATLAB命令行输入“rosshutdown”。

在Ubuntu Linux系统,运行下面的指令:

pkill -f robotcontroller

pkill -f roscore

2.4.8 高级话题和故障排除

指定处理器生成代码:如果用户使用其它产品(如计算机视觉系统工具箱)的块,生成代码可能包括处理器指定最优化,导致在Linux上建立ROS节点时的编译问题。这种情况下,用户需要让Simulink知道生成的代码编译的平台,可以通过模型配置参数对话框的“Hardware Implementation”面板实现。

2.4 从Simulink中创建单独的ROS节点

2.4.9

需要的包:机器人系统工具箱包含许多ROS消息类型(如Baxter或PR2),是标准ROS发布的一部分。如果用户的Simulink模型包含非标准或用户自己的消息类型,用户将会成功地仿真和生成代码。然而,为了使用“build_ros_model.sh”建立生成的ROS节点,用户首先需要下载并安装所有需要的包。下面是一种实现方式(假设需要的包是“baxter_core_msgs”)。

更新可用包列表:

sudo apt-get update

搜索ROS baxter包的列表(例如,ros-hydro-baxter-core-msgs)

apt-cache search baxter

下载并安装需要的包:

sudo apt-get install ros-hydro-baxter-core-msgs

任务模式:Simulink既可以生成多任务模式也可生成单任务模式(参阅“Time-Based Scheduling and Code Generation”)。默认情况下,使用单任务模式(单线程for all the rates)生成ROS节点,不带有实时线程调度。这允许生成ROS节点不需要“sudo”权限的执行,但是会导致更少的可预料的表现。

如果用户需要更多可预料的表现,用户可以配置模型以使用多任务。在配置参数对话框的“Solver”面板,设置“Tasking mode for periodic sample times”为“MultiTasking”。生成代码过程中,这将为模型中的每个等级创建一个单独的线程,并为线程使用优先级调度。

2.4 从Simulink中创建单独的ROS节点

图2.4.10

为了运行ROS节点,用户需要按下述使用“sudo”:

sudo -E ~/catkin_ws_simulink/devel/lib/robotcontroller/robotcontroller_node

2.4.9 总结

本例程向用户如何配置配置Simulink模型以为单独的ROS节点生成C++代码,以及如何转换、建立和验证ROS节点。

 

转自公众号:
Robot404

您必须 登录 才能发表评论!