V-REP ROS教程-indigo

本教程将尝试以简单的方式解释如何根据 ROS Indigo 和 Catkin 设置,启用 V-REP ROS。

首先,你应该确保你已经完成了官方的 ROS 教程,至少是初学者部分,并且你已经安装了 Catkin 工具。然后,假设你安装了最新的Ubuntu,安装了 ROS Indigo,并设置了工作区文件夹。这里还参考有关 ROS 安装的官方文档。

通过 RosInterface(libv_repExtRosInterface.so),V-REP 支持常规 ROS 功能。 Linux发行版应包含已在 V-REP/compiledRosPlugins 中编译的文件,但首先需要将其复制到 V-REP/,否则将无法加载。但是,您可能会遇到插件加载问题,具体取决于您的系统特性:确保始终检查 V-REP 的终端窗口,以获取有关插件加载操作的详细信息。启动 V-REP 时会加载插件。只有当 roscore 正在运行时,ROS 插件才成功加载和初始化(roscore 是 ROS 主控)。

如果无法加载插件,那么你应该重新编译它。它是开源的,可以根据需要进行修改,以支持特定功能或扩展其功能。有4个包:

v_repExtRosInterface:此包是 RosInterface,它将被编译为“.so”文件,并由 V-REP 使用。

ros_bubble_rob2:这是一个非常简单的机器人控制器的包,它通过 RosInterface 连接到 V-REP。该节点将负责在演示场景ontrolTypeExamples.ttt 中控制红色机器人

vrep_skeleton_msg_and_srv 和 vrep_plugin_skeleton:这两个包可用于为 V-REP 创建自己的特定 ROS 插件(例如,支持特定机器人的 ROS 消息)。

应将上面的包复制到 catkin_ws/src 文件夹中。确保 ROS 知道这些包,即您可以切换到上面的包文件夹:

$ roscd vrep_ros_interface
$ roscd ros_bubble_rob2
$ roscd vrep_skeleton_msg_and_srv
$ roscd vrep_plugin_skeleton

要构建包,请导航到 catkin_ws 文件夹并键入:

$ export VREP_ROOT=~/path/to/v_rep/folder
$ catkin build

就这样生成了包并将其编译为可执行文件或库。将创建的文件复制并粘贴到 V-REP 安装文件夹中。插件现在可以使用了!

现在打开一个终端并启动 ROS 主控:

$ roscore

打开另一个终端,移动到 V-REP 安装文件夹并启动 V-REP。这是你应该拥有的(或类似的):

$ ./vrep.sh
License file 'v_rep':
---> ok
Simulator launched.
Plugin 'BubbleRob': loading...
Plugin 'BubbleRob': load succeeded.
Plugin 'K3': loading...
Plugin 'K3': load succeeded.
Plugin 'RemoteApi': loading...
Plugin 'RemoteApi': load succeeded.
Plugin 'RosInterface': loading...
Plugin 'RosInterface': load succeeded.

成功加载 RosInterface 后,检查可用节点。会给出下面信息:

$ rosnode list
/rosout
/vrep_ros_interface

在空 V-REP 场景中,选择一个对象,然后使用 [Menu bar --> Add --> Associated child script --> non threaded] 。将非线程子脚本附加到该对象。打开该脚本的脚本编辑器,并使用以下内容替换内容:

function subscriber_callback(msg)
    -- This is the subscriber callback function
    sim.addStatusbarMessage('subscriber receiver following Float32: '..msg.data)
end

function getTransformStamped(objHandle,name,relTo,relToName)
    -- This function retrieves the stamped transform for a specific object
    t=sim.getSystemTime()
    p=sim.getObjectPosition(objHandle,relTo)
    o=sim.getObjectQuaternion(objHandle,relTo)
    return {
        header={
            stamp=t,
            frame_id=relToName
        },
        child_frame_id=name,
        transform={
            translation={x=p[1],y=p[2],z=p[3]},
            rotation={x=o[1],y=o[2],z=o[3],w=o[4]}
        }
    }
end

function sysCall_init()
    -- The child script initialization
    objectHandle=sim.getObjectAssociatedWithScript(sim.handle_self)
    objectName=sim.getObjectName(objectHandle)
    -- Check if the required RosInterface is there:
    moduleName=0
    index=0
    rosInterfacePresent=false
    while moduleName do
        moduleName=sim.getModuleName(index)
        if (moduleName=='RosInterface') then
            rosInterfacePresent=true
        end
        index=index+1
    end

    -- Prepare the float32 publisher and subscriber (we subscribe to the topic we advertise):
    if rosInterfacePresent then
        publisher=simROS.advertise('/simulationTime','std_msgs/Float32')
        subscriber=simROS.subscribe('/simulationTime','std_msgs/Float32','subscriber_callback')
    end
end

function sysCall_actuation()
    -- Send an updated simulation time message, and send the transform of the object attached to this script:
    if rosInterfacePresent then
        simROS.publish(publisher,{data=sim.getSimulationTime()})
        simROS.sendTransform(getTransformStamped(objectHandle,objectName,-1,'world'))
        -- To send several transforms at once, use simROS.sendTransforms instead
    end
end

function sysCall_cleanup()
    -- Following not really needed in a simulation script (i.e. automatically shut down at simulation end):
    if rosInterfacePresent then
        simROS.shutdownPublisher(publisher)
        simROS.shutdownSubscriber(subscriber)
    end
end

上面的脚本将发布模拟时间,并同时订阅它。它还将发布附加对象的脚本转换。您应该能够看到模拟时间用:

$ rostopic list

 

要查看邮件内容,您可以输入:

$ rostopic echo /simulationTime

现在加载演示场景 rosInterfaceTopicPublisherAndSubscriber.ttt,然后运行模拟。附加到 Vision_sensor 的子脚本中的代码将启用发布者,流式传输视觉传感器的图像,并启用订阅者,监听相同的流。订户将读取的数据应用于被动视觉传感器,该传感器仅用作数据容器。所以 V-REP 是流数据,同时收听相同的数据!这就是发生的事情:

V-REP ROS教程-indigo_第1张图片

尝试实验一下代码。您还可以使用以下命令可视化 V-REP 流的图像:

$ rosrun image_view image_view image:=/visionSensorData

如果您一直在传输更简单的数据,那么您也可以通过以下方式对其进行可视化:

$ rostopic echo /visionSensorData

现在停止模拟并加载演示场景 controlTypeExamples.ttt,然后运行模拟。该场景说明了 V-REP 当前支持的主要 7 种控制方法。机器人是简单的,并且为了简化目的也以简单的方式表现。运行模拟并观察通过 RosInterface 控制的红色机器人:

V-REP ROS教程-indigo_第2张图片

附加到红色机器人并以非线程方式运行的子脚本负责以下操作:

确定一些物体句柄(例如电机接头句柄和接近传感器句柄)

验证是否加载了 RosInterface

添加标题

启动电机速度订阅者

启动传感器发布者和模拟时间发布者

最后启动客户端应用程序。 使用一些主题名称作为参数调用应用程序,以便它知道要监听和订阅的主题。 客户端应用程序(rosBubbleRob2)然后通过 ROS 接管红色机器人的控制。

在模拟运行时,复制并粘贴红色机器人几次(好吧,实际上是任何一个机器人!)。 请注意,每个副本都是直接操作且独立的。 这是V-REP的众多优势之一。

在模拟运行时,复制并粘贴红色机器人几次(好吧,实际上是任何一个机器人!)。请注意,每个副本都是直接操作且独立的。这是V-REP的众多优势之一。

现在停止模拟并打开一个新场景,然后将下面的模型拖入其中:Models/tools/rosInterface helper tool.ttm。此模型由单个自定义脚本构成,该脚本提供以下主题发布者和订阅者:

startSimulation 主题:可以通过在此主题上发布 std_msgs :: Bool 消息来启动模拟。

pauseSimulation 主题:可以通过在此主题上发布 std_msgs :: Bool 消息来暂停模拟。

stopSimulation 主题:可以通过在此主题上发布 std_msgs :: Bool 消息来停止模拟。

enableSyncMode 主题:通过在此主题上发布 std_msgs :: Bool 消息,启用/禁用同步模拟模式。

triggerNextStep 主题:通过在此主题上发布 std_msgs :: Bool 消息,在同步模拟模式下触发下一个模拟步骤。

simulationStepDone 主题:类型为 std_msgs :: Bool 的消息将在每个模拟过程结束时发布。

simulationState 主题:std_msgs :: Int32 类型的消息将定期发布。 0 表示模拟停止,1 表示正在运行,2 表示暂停。

simulationTime 主题:将定期发布 std_msgs :: Float32 类型的消息,指示当前的模拟时间。

查看自定义脚本的内容,可以完全自定义用于各种目的。尝试从命令行生成主题消息,例如:

$ rostopic pub /startSimulation std_msgs/Bool true --once
$ rostopic pub /pauseSimulation std_msgs/Bool true --once
$ rostopic pub /stopSimulation std_msgs/Bool true --once
$ rostopic pub /enableSyncMode std_msgs/Bool true --once
$ rostopic pub /startSimulation std_msgs/Bool true --once
$ rostopic pub /triggerNextStep std_msgs/Bool true --once
$ rostopic pub /triggerNextStep std_msgs/Bool true --once
$ rostopic pub /triggerNextStep std_msgs/Bool true --once
$ rostopic pub /stopSimulation std_msgs/Bool true --once

要显示当前模拟时间,您可以键入:

$ rostopic echo /simulationTime

最后,请务必查看 V-REP 中的远程 API 功能:与 ROS 类似,它允许远程功能执行,快速数据流来回,使用非常简单,轻量级,跨平台,可用 7种不同的语言。 在某些情况下,它是有趣的 ROS 的替代品。

参考资料

1.V-REP官方文档:http://www.coppeliarobotics.com/helpFiles/

你可能感兴趣的:(机器人仿真V-REP,V-REP,官方教程,机器人仿真)