主要内容

代码生成的MATLAB编程

这个示例展示了从MATLAB®代码生成独立可执行文件的推荐工作流,该代码包含ROS接口。

先决条件

  • 这个例子需要MATLAB Coder™。

  • 您必须能够访问正确配置的C/ c++编译器。您可以使用墨西哥人设置cpp查看和更改默认编译器。有关详细信息,请参见改变默认的编译器

概述

ROS MATLAB函数的一个子集,如rossubscriber,rospublisher,rosrate金宝app支持c++代码生成。要从MATLAB代码创建一个独立的ROS节点,请遵循以下步骤:

  • 创建用于创建独立应用程序的入口点函数。入口点函数不能有任何输入,也不能返回任何输出。

  • 添加% # codegen指示MATLAB函数,指示它是用于代码生成的。该指令还允许MATLAB代码分析器识别特定于MATLAB的警告和错误,以进行代码生成。

  • 修改ROS功能,使用消息结构。

  • 识别不支持c++代码生成的MATLAB代码,并修改MATLAB代码以使金宝app用支持代码生成的函数或构造。

  • 创建一个MATLAB编码器配置对象,并指定硬件为“机器人操作系统(ROS)”

  • 使用codegen命令生成独立的可执行文件。

为订户生成代码

考虑下面的MATLAB代码。

函数mynode (numIterations)%mynode接收并显示sensor_msgs/JointState消息rosinit;%轨迹点即将发布子= rossubscriber (“/伺服”);%显示位置k = 1:numIterations msg = receive(sub);如果~ isempty(味精。Position(msg.Position(1))其他的disp (“收到空的消息…”);结束结束rosshutdown;结束

这个MATLAB代码接收sensor_msgs / JointState/伺服主题,并显示循环中位置的第一个元素。该函数有一个设置迭代次数的输入参数。创建独立的ROS节点,代码修改如下:

  • 消除输入参数numIterations使用一个循环。

  • 添加% # codegen指令。

  • 的消息类型rossubscriber调用。

  • 使用消息结构而不是消息类。

  • 消除rosinitrosshutdown不生成代码的调用。

  • 取代disp不支持代码生成的函数金宝app

注意,您只在MATLAB会话中执行一次rosinit和rosshutdown函数。避免rosinitrosshutdown用于独立部署的代码的函数。单机部署时,单个ROS节点不需要启动或停止ROS主节点。如果你需要包括rosinitroshutdown在MATLAB代码中为解释执行而调用,将它们声明为外在函数在入口点函数的顶部。

入口点函数不能接受任何输入或返回输出。一个独立的ROS节点可执行文件打算在MATLAB之外启动,比如从系统命令终端启动,因此不能接受任何MATLAB输入或返回MATLAB输出。

消除输入参数numIterations,替换无限循环循环。对于独立部署,生成的节点将一直运行,直到您从外部终止它。一个好的编程实践是替换循环用用于独立部署的循环。

rossubscriber函数需要将消息类型指定为用于代码生成的编译时常量。函数使用此信息创建的返回消息类型收到调用。的rossubscriber函数仅支持为消息结金宝app构生成代码。若要返回消息结构,请指定名称-值对参数,“DataFormat”、“结构”,创建订阅者时。

修改代码后,入口点函数的MATLAB代码如下:

函数mynode%mynode接收并显示sensor_msgs/JointState消息% # codegen%轨迹指向发布子= rossubscriber (“/伺服”,“sensor_msgs / JointState”,“DataFormat”,“结构”);%显示位置(1) MSG = receive(sub);如果~ isempty(味精。Position > 0)“位置= % f \ n”msg.Position (1))其他的流(“收到空的消息。\ n”);结束结束结束

创建一个MATLAB编码器配置使用机器人操作系统(ROS)硬件。设置HardwareImplementation。ProdHWDeviceType参数的MATLAB编码器配置对象的预期部署硬件。例如,如果您正在将生成的代码部署到Windows计算机集HardwareImplementation。ProdHWDeviceType“英特尔- > x86 - 64 (Windows64)”.要生成代码,执行以下命令:

cfg = coder.config (“exe”);cfg。硬件= coder.hardware (机器人操作系统(ROS));cfg.Hardware.DeployTo =“Localhost”;cfg.Hardware.BuildAction =“构建和运行”;cfg.HardwareImplementation.ProdHWDeviceType =“英特尔- > x86 - 64 (Windows64)”;cfg.HardwareImplementation.ProdLongLongMode = true;%对Int64或Uint64数据类型使用long longcodegenmynode配置cfg

你可以发送消息给mynode在ROS终端上使用如下命令:

rostopic pub /servo sensor_msgs/JointState -r 1 "{header:{seq: 0, stamp:{secs: 0,nsecs: 0},frame_id:""},name:["joint"],position:[150.0,100.0],velocity:[0.0,0.0],effort:[0,0]}"

为发布者生成代码

考虑下面的MATLAB代码。

函数mypubnode (updateRate)%mypubnode发布关节轨迹消息%建立出版商酒吧= rospublisher (“/ traj”,“trajectory_msgs / JointTrajectory”);%创建消息味精= rosmessage (“trajectory_msgs / JointTrajectory”);味精。JointNames {1} =“左”;味精。JointNames {2} =“对”;trajMsg = rosmessage (“trajectory_msgs / JointTrajectoryPoint”);r = rosrate (updateRate);(1) msg.Header.Stamp = rtime (“现在”);x =兰德;y =兰德;trajMsg。位置= [x y -x -y];味精。点数= [trajMsg trajMsg];发送(酒吧,味精);等待(r);结束结束

这个MATLAB代码发布trajectory_msgs / JointTrajectory消息/ traj的话题。您可以从外部设置消息发布速率。的trajectory_msgs / JointTrajectoryMessage是一个嵌套的消息,它有以下子字段:

> > rosmsg显示trajectory_msgs / JointTrajectorystd_msgs/Header Header char[] JointNames JointTrajectoryPoint[] Points

该消息可以容纳多个关节和多个轨迹点。如果关节的数量是每个关节的轨迹点的数量是N,trajMsg有尺寸1,trajMsg。职位有尺寸N1。对于这个例子,每个关节发布两个轨迹点。

该函数有一个设置迭代次数的输入参数。创建独立的ROS节点,代码修改如下:

  • 消除输入参数updateRate直接在函数体中指定它。

  • 添加% # codegen指令。

  • 使用消息结构而不是消息类。

  • 消除任何使用单元格字符串准备代码生成的消息字段。

  • 在正确的维度中增长消息结构的可变大小字段。

消除输入参数updateRate,在入口点函数体中使用常量字面值指定更新速率。修改updateRate,则必须从入口点函数重新生成代码。

修改rospublisher,rosmessagerosrate函数使用消息结构。的trajectory_msgs / JointTrajectory消息结构有一个字段,JointNames,类型为cell string。由于MATLAB Coder的限制,这种类型的消息字段不支持代码生成。金宝app来生成代码mypubnode功能,避免使用JointNames在代码生成中使用coder.target函数。

最初的mypubnode函数在错误维度中增长消息结构的可变大小字段。作为说明,创建一个类型的消息trajectory_msgs / JointTrajectory在MATLAB命令行。注意可变大小字段的第一个维度的大小是0,而第二个维度的大小是1:

味精= rosmessage (“trajectory_msgs / JointTrajectory”) msg = ROSJointTrajectory消息属性:MessageType:“trajectory_msgs / JointTrajectory”Header: [1×1 Header] Points: [0×1 JointTrajectoryPoint] JointNames: {0×1 cellshowdetails显示内容消息

维度为0 × 1的字段在第一个维度中增长。原始代码增长职位第二个维度中的字段,它在解释模式下工作,但不支持代码生成。金宝app如果您试图在错误维度中增长消息结构的可变大小字段,则会得到以下错误消息:

???这赋值一个“trajectory_msgs_JointTrajectoryPointStruct_T”价值一个“struct_T”类型。代码一代金宝app改变类型通过任务。检查作业输入类型规范类型不匹配。

修改代码后,入口点函数的MATLAB代码如下:

函数mypubnode%mypubnode发布关节轨迹消息% # codegen%建立出版商酒吧= rospublisher (“/ traj”,“trajectory_msgs / JointTrajectory”,“DataFormat”,“结构”);创建一个msg味精= rosmessage (“trajectory_msgs / JointTrajectory”,“DataFormat”,“结构”);如果isempty (coder.target)味精。JointNames {1} =“左”;味精。JointNames {2} =“对”结束trajMsg = rosmessage (“trajectory_msgs / JointTrajectoryPoint”,“DataFormat”,“结构”);r = rosrate (1);(1) msg.Header.Stamp = rtime (“现在”,“DataFormat”,“结构”);x =兰德;y =兰德;trajMsg。位置= [x;y;- x;- y);%在正确的维度中增长可变大小字段味精。点= [trajMsg;trajMsg];%在正确的维度中增长可变大小字段发送(酒吧,味精);等待(r);结束结束

创建一个MATLAB编码器配置使用机器人操作系统(ROS)硬件。设置HardwareImplementation。ProdHWDeviceType参数的MATLAB编码器配置对象的预期部署硬件。例如,如果您正在将生成的代码部署到Windows计算机集HardwareImplementation。ProdHWDeviceType“英特尔- > x86 - 64 (Windows64)”.要生成代码,请执行以下命令:

cfg = coder.config (“exe”);cfg。硬件= coder.hardware (机器人操作系统(ROS));cfg.Hardware.DeployTo =“Localhost”;cfg.Hardware.BuildAction =“构建和运行”;cfg.HardwareImplementation.ProdHWDeviceType =“英特尔- > x86 - 64 (Windows64)”;cfg.HardwareImplementation.ProdLongLongMode = true;%对Int64或Uint64数据类型使用long longcodegenmypubnode配置cfg

您可以检查由mypubnode使用rostopic回声/ traj命令。

相关的话题