Windows平台下Unity-ROS环境搭建

最近在做AI+机器人的课程项目,因为平常用Unity比较多,所以就想着把Unity和ROS结合起来使用。上Github上面一查发现官方是有做适配的。虽然已经有一段时间没有更新了,但也还能用。搭建的步骤和在搭建过程中遇到的一些问题,在这里记录一下。

ROS-Unity介绍

ROS-Unity就是在原本独立的ROS和Unity之间建立一座桥梁,使其能够实现通讯。Unity官方提供了 ROS TCP EndpointROS TCP Connector 来实现。其中,ROS TCP Endpoint 是一个ROS包,给外界提供了一个接口,ROS TCP Connector是一个Unity包,可以连接到前者提供的接口,这样就实现了ROS和Unity二者的连接。

ROS-Unity整体的架构可由下图表示:

004_01.png

官方的使用教程请参考ROS–Unity Demo Setup,各种不同平台的操作方法和注意事项还是很详细的,推荐去看一看。本文只记录一下Windows平台的搭建过程。

ROS端准备

ROS端有两种准备方法,一是使用预先准备好的整合包,二是在自己已有的ROS环境里面装上 ROS TCP Endpoint。这里我用第一种方法。整合包的文件在 Robotics Hub 仓库里面的 tutorials/ros_unity_integration/ros_docker路径下,可以把仓库整个clone下来或者在releases里面下载下来。

这个Dockfile在Windows下直接构建会出错,所以需要先对它进行一点改动:

...
ENV ROS_WORKSPACE=/catkin_ws

# 新增一行,安装dos2unix
RUN sudo apt-get update && sudo apt-get install -y dos2unix
...
#COPY docker/tutorial /

# 修改一行,使用dos2unix来处理setup.sh后再运行
RUN dos2unix /setup.sh && chmod +x /setup.sh && /setup.sh && rm /setup.sh

WORKDIR $ROS_WORKSPACE
...

回到tutorials\ros_unity_integration目录下,使用如下命令构建Docker镜像:

docker build -t melodic -f ros_docker/Dockerfile .

然后坑就来了,在Windows系统中如果使用 ROS TCP Endpoint 为ROS分配的10000端口,大概率会和其他的进程发生冲突。所以我们需要把这个端口改掉。这里选择12077来作为我们的TCP端口。在任意位置上新建StartContainer.bat来方便后续运行容器,内容如下:

@echo Run roscore after the container is started
@docker run -it --rm --name ros_unity -p 12077:12077 -p 5005:5005 melodic /bin/bash

运行脚本,按照提示运行 roscore,如图:

004_02.png

然后再新建一个脚本StartTerminal.bat,用来在容器已经在运行的时候新建终端。我们在运行 ROS TCP Endpoint 的时候会用到它。内容如下:

@echo Use rosrun ros_tcp_endpoint default_server_endpoint.py _tcp_port:=12077 to setup Unity-ROS communication
@docker exec -it ros_unity /bin/bash

运行该脚本,在新的终端里面执行 rosrun ros_tcp_endpoint default_server_endpoint.py _tcp_port:=12077。这里通过向rosrun传递运行参数,手动指定了TCP端口。执行完如果出现 Starting server on 0.0.0.0:12077 的输出,就是运行成功了。

Unity端准备

Unity-ROS官方项目使用的版本是2021.2,我在测试的时候使用了2022.3.17,也是能够正常使用的。

准备的操作很简单,同样有两种方式:直接从Git导入和通过源文件导入。直接从Git仓库导入的话,在Package Manager里面点击Add from git URL,输入https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector即可。如果从源文件导入,可以在 ROS TCP Connector 仓库里面找到com.unity.robotics.ros-tcp-connector这个文件夹,整个放入Unity项目的Packages文件夹。(参考之前关于自定义Package的文章

进入一个场景,新建一个GameObject,挂上ROS Connection脚本,记得把端口改为12077,其余设置维持默认不变就好。
004_03.png

测试运行

点击运行,不出意外的话就可以实现ROS和Unity的正常连接了。在Game视图的左上角有箭头的颜色是蓝色说明连接是正常的,红色则表明连接断开。同时,如果连接建立成功的话,在运行 ROS TCP Endpoint 的终端里面也是可以看到输出的。
004_04.png

posted @ 2024-02-01 20:07  DevBobcorn  阅读(103)  评论(0编辑  收藏  举报