最近在做AI+机器人的课程项目,因为平常用Unity比较多,所以就想着把Unity和ROS结合起来使用。上Github上面一查发现官方是有做适配的。虽然已经有一段时间没有更新了,但也还能用。搭建的步骤和在搭建过程中遇到的一些问题,在这里记录一下。
ROS-Unity介绍
ROS-Unity就是在原本独立的ROS和Unity之间建立一座桥梁,使其能够实现通讯。Unity官方提供了 ROS TCP Endpoint 和 ROS TCP Connector 来实现。其中,ROS TCP Endpoint 是一个ROS包,给外界提供了一个接口,ROS TCP Connector是一个Unity包,可以连接到前者提供的接口,这样就实现了ROS和Unity二者的连接。
ROS-Unity整体的架构可由下图表示:
官方的使用教程请参考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 [36mroscore[0m after the container is started
@docker run -it --rm --name ros_unity -p 12077:12077 -p 5005:5005 melodic /bin/bash
运行脚本,按照提示运行 roscore
,如图:
然后再新建一个脚本StartTerminal.bat
,用来在容器已经在运行的时候新建终端。我们在运行 ROS TCP Endpoint 的时候会用到它。内容如下:
@echo Use [36mrosrun ros_tcp_endpoint default_server_endpoint.py _tcp_port:=12077[0m 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
,其余设置维持默认不变就好。
测试运行
点击运行,不出意外的话就可以实现ROS和Unity的正常连接了。在Game视图的左上角有箭头的颜色是蓝色说明连接是正常的,红色则表明连接断开。同时,如果连接建立成功的话,在运行 ROS TCP Endpoint 的终端里面也是可以看到输出的。