从Unity Robotics Hub入门Unity-ROS

news2024/11/23 21:34:22

0.简介

对于Unity而言,其拥有非常完备的物理特性,这对于机器人仿真是非常有用的,但是实际上Unity和ROS之间的通信一直是摆在两者之间的难题,正好看到宇宙爆肝锦标赛冠军写的这个系列,所以个人想参照为数不多的资料来进行整理,并完成这个系列的文章。“Unity Robotics Hub”是一种基于Unity环境的机器人模拟工具、教程、资源以及文档信息的资料库。机器人工作者可以在模拟场景中使用Unity。

1. 环境安装

1.1 安装 Docker

卸载旧的docker版本

sudo apt-get update
sudo apt-get remove docker docker-engine docker.io containerd runc

允许apt命令可以使用HTTPS访问Docker repository

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

在这里插入图片描述
添加Docker官方的GPG key

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

在这里插入图片描述
验证key(搜索后8位即可显示完成秘钥):

sudo apt-key fingerprint 0EBFCD88

设置repository版本为stable并更新软件列表

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update

开始安装docker

sudo apt-get install docker-ce docker-ce-cli containerd.io

安装完成后,在命令行输入docker --version;出现docker版本信息即表示安装成功。

1.2 Unity安装

从官网(Unity官网)下载Unity Hub。
在这里插入图片描述
或者直接通过命令行安装

sudo sh -c 'echo "deb https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'
wget -qO - https://hub.unity3d.com/linux/keys/public | 
sudo apt-key add -
sudo apt updatesudo apt-get install unityhub

然后安装安装Unity Editor,进入网址。然后点Unity Editor就行。接着把下载好文件的解压。然后打开Unity Hub,点Locate,选择你Unity Editor文件夹下的Unity即可
在这里插入图片描述

2. 安装Unity Robotics包

这个小节用来提供关于安装Unity Robotics软件包的简短说明。

  1. 创建或打开一个Unity项目,值得注意的是如果需要添加URDF-Importer,请确保你使用的是2020.2.0+版本的Unity Editor。

  2. 打开Window -> Package Manager菜单

  3. 在Package Manager窗口中,找到并单击窗口左上角的+按钮。选择Add package from git URL…
    在这里插入图片描述

  4. 输入所需包的git URL。注意:你可以在git url的末尾添加一个版本标签,比如#v0.4.0或#v0.5.0,来声明一个特定的包版本,或者排除这个标签来从包的主分支获取最新的版本。

    • 对于ROS-TCP-Connector,输入https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector
    • 对于URDF-Importer,输入https://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer
  5. 点击 Add.

在这里插入图片描述
在上面项目导入成功的情况下,在Unity的功能面部中会出现对应的Robotics功能选项,点击Robotics->ROS Setting面板
在这里插入图片描述

3. Unity Robotics Hub安装

开发环境的需要的环境如下:

  1. Unity版本2020.2+
  2. URDF导入的repo
  3. 拥有ROS环境

接着就可以开始安装环境了

git clone --recurse-submodules https://github.com/Unity-Technologies/Unity-Robotics-Hub.git

下面官方文档中提供了两种方法,第一种是使用Docker,另外一种就是直接在本地安装环境。

3.1 Docker安装

启动Docker守护进程。我们可以使用系统无关的docker info命令可以验证docker是否正在运行。如果Docker守护进程当前没有运行,此命令将抛出Server: ERROR,否则将打印适当的系统范围信息。

构建提供的ROS Docker映像:

cd /PATH/TO/Unity-Robotics-Hub/tutorials/pick_and_place &&
git submodule update --init --recursive &&
docker build -t unity-robotics:pick-and-place -f docker/Dockerfile .

这里提供的Dockerfile使用ROS Melodic基本镜像并安装必要的包,将提供的ROS包和子模块复制到容器中,并构建ROS工作区。

启动新建的Docker容器

docker run -it --rm -p 10000:10000 unity-robotics:pick-and-place /bin/bash

3.2 手动设置

导航到这个下载的repo的/PATH/ to /Unity-Robotics-Hub/tutorials/pick_and_place/ROS目录,然后在ROS Melodic环境中运行以下命令

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install python-pip ros-melodic-robot-state-publisher ros-melodic-moveit ros-melodic-rosbridge-suite ros-melodic-joy ros-melodic-ros-control ros-melodic-ros-controllers ros-melodic-tf2-web-republisher
sudo -H pip install rospkg jsonpickle

ROS Noetic用户应运行

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install python3-pip ros-noetic-robot-state-publisher ros-noetic-moveit ros-noetic-rosbridge-suite ros-noetic-joy ros-noetic-ros-control ros-noetic-ros-controllers
sudo -H pip3 install rospkg jsonpickle

如果您在导入新的ROS包之后还没有构建和源化ROS工作区,请导航到您的ROS工作区,并运行catkin_make && source devel/setup.bash。确保没有错误。

3.3 ros_tcp_endpoint

打开一个容器的终端,导航到 ~/catkin_ws ,执行

source devel/setup.bash
roslauch ros_tcp_endpoint endpoint.launch tcp_ip:=127.0.0.1 tcp_port:=10000 # 将127.0.0.1替换为所需的ip,将10000替换为所需要的端口号。

4. URDF文件导入

为了检查整个物理模型是否导入,我们需要检查以下几点项目设置:

打开菜单“Window→Package Manager”,确认是否导入了“URDF Importer”(在上面已经完成安装)。在Unity中导入“URDF”,使用“URDF Importer”。
在这里插入图片描述

在菜单“Edit→Project Settings→Physics”中确认“SolverType”是“TemporalGaussSeidel”。以防止关节不稳定的动作由默认的求解器引起。
在这里插入图片描述
然后下面就是对场景进行设置:

  1. 将“Asssets/Prefabs”中的“Table”、“Target”、“TargetPlacement”拖拽到Hierarchy窗口。
  2. 将MainCamera的Transform设定如下。

・Position : (0, 1.4, -0.7)
・Rotation : (45, 0, 0)
・Rotation : (1, 1, 1)

在这里插入图片描述
接下来导入URDF

  1. 在Project窗口右键点击URDF文件“Assets/niryo_one/niryo_one”,选择“Import Robot form Selected URDF file”

…详情请参照古月居

``` 成功后,会显示以下信息
[INFO] [1634298752.158262]: Starting server on 172.17.0.2:10000
  1. 在Unity编辑器中按Play按钮。

  2. 按Publish键。相关数据会在ROS主题中公布。

  3. 确认正在运行roslaunch的终端。并输出了相关数据。

I heard:
joints: [-0.00016236382361967117, -0.007215713616460562, -0.0010509941494092345, 0.01564762368798256, 0.00016680661065038294, 0.00013635685900226235]
pick_pose: 
 position: 
   x: -0.157005697489
   y: -0.216008037329
   z: 0.643718481064
 orientation: 
   x: -1.49643722125e-06
   y: -0.707106769085
   z: 1.49643722125e-06
   w: -0.707106769085
place_pose: 
 position: 
   x: -0.187000006437
   y: 0.216000005603
   z: 0.639999985695
 orientation: 
   x: -0.499999970198
   y: -0.499999970198
   z: 0.499999970198
   w: -0.499999970198

我们看一下代码就可以发现在,代码中我们发布了NiryoMoveitJointsMsg。这个msg信息中保存着以下信息。

·Joint的角度(float[])
·Target姿势(vector+quaternion)
·TargetPlacement的姿势(vector+quaternion)

下面是本例子的注释

using System;
using RosMessageTypes.Geometry;
using RosMessageTypes.NiryoMoveit;
using Unity.Robotics.ROSTCPConnector;
using Unity.Robotics.ROSTCPConnector.ROSGeometry;
using Unity.Robotics.UrdfImporter;
using UnityEngine;

// 发布者
public class SourceDestinationPublisher : MonoBehaviour
{
    // 关键数
    const int k_NumRobotJoints = 6;

    // tf
    public static readonly string[] LinkNames =
        { "world/base_link/shoulder_link", "/arm_link", "/elbow_link", "/forearm_link", "/wrist_link", "/hand_link" };

    // Topic节点名称
    [SerializeField]
    string m_TopicName = "/niryo_joints";

    // 作为object传入的参数
    [SerializeField]
    GameObject m_NiryoOne;
    [SerializeField]
    GameObject m_Target;
    [SerializeField]
    GameObject m_TargetPlacement;
    readonly Quaternion m_PickOrientation = Quaternion.Euler(90, 90, 0);

    // 关节
    UrdfJointRevolute[] m_JointArticulationBodies;

    // ROS连接命名
    ROSConnection m_Ros;

    void Start()
    {
        // ROS连接准备
        m_Ros = ROSConnection.GetOrCreateInstance();

        // 发布者的生成
        m_Ros.RegisterPublisher<NiryoMoveitJointsMsg>(m_TopicName);

        // 关节信息获取
        m_JointArticulationBodies = new UrdfJointRevolute[k_NumRobotJoints];
        var linkName = string.Empty;
        for (var i = 0; i < k_NumRobotJoints; i++)
        {
            linkName += LinkNames[i];
            m_JointArticulationBodies[i] = m_NiryoOne.transform.Find(linkName).GetComponent<UrdfJointRevolute>();
        }
    }

    // パ发布的程序
    public void Publish()
    {
        // 信息的定义
        var sourceDestinationMessage = new NiryoMoveitJointsMsg();

        // Joint角度的传输
        for (var i = 0; i < k_NumRobotJoints; i++)
        {
            sourceDestinationMessage.joints[i] = m_JointArticulationBodies[i].GetPosition();
        }

        // Target姿态的传输
        sourceDestinationMessage.pick_pose = new PoseMsg
        {
            position = m_Target.transform.position.To<FLU>(),
            orientation = Quaternion.Euler(90, m_Target.transform.eulerAngles.y, 0).To<FLU>()
        };

        // TargetPlacement姿态的传输
        sourceDestinationMessage.place_pose = new PoseMsg
        {
            position = m_TargetPlacement.transform.position.To<FLU>(),
            orientation = m_PickOrientation.To<FLU>()
        };

        // 根据connection发布topic
        m_Ros.Publish(m_TopicName, sourceDestinationMessage);
    }
}

7. 参考链接

https://github.com/Unity-Technologies/Unity-Robotics-Hub

https://www.guyuehome.com/40908

https://codeantenna.com/a/I1dRyJjemI

https://github.com/Unity-Technologies/Robotics-Object-Pose-Estimation

https://github.com/Unity-Technologies/articulations-robot-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年创新药行业研究报告

第一章 行业概况 创新药&#xff0c;也称为原研药&#xff0c;是一个相对于仿制药的概念&#xff0c;指的是从机理开始源头研发&#xff0c;具有自主知识产权&#xff0c;具备完整充分的安全性有效性数据作为上市依据&#xff0c;首次获准上市的药物。新药上市要经历化合物的发…

学个Antenna:Matlab天线工具箱知多少(二)

学个Antenna是以天线仿真和调试为主&#xff0c;理论原理为辅的干货天线技术专栏&#xff0c;包括天线入门知识以及各类天线的原理简介、仿真软件建模、设计、调试过程及思路。如有想看到的内容或技术问题&#xff0c;可以在文尾写下留言。 ​摘要&#xff1a; 上节推文学个Ant…

A-Level商务例题解析及练习Sources of finance

今日知识点&#xff1a;Sources of finance 例题 Q: Discuss the benefits and drawbacks to a business of using only internal sources of finance to fund expansion. 解析 Answers could include:Outline of types of internal funding sources, such as building up rese…

我与足球以及世界杯的过往

中东土豪卡塔尔斥资2000亿举办的世界杯正在如火如荼的进行中&#xff0c;我也是几乎一场不落的看完了每一场的比赛直播【最近都没怎么更文。。。】&#xff0c;目前小组赛已经结束&#xff0c;我们也见证了很多球星的落寞背影与不甘&#xff0c;也见证了新星的天赋与成长&#…

E语言基本特征码/时钟反调试/窗体push大法

E语言基本特征码/时钟反调试/窗体push大法 该篇文章有以下内容&#xff1a; 1. 易语言字符串比较函数 test edx,3 F7C203000000 2. 按钮事件特征码&#xff1a;FF55FC5F5E,可以被修改恒成立 3. 易语言体 FF 25 4. 时钟的反调试 5. Push窗体大法 一、利用 test…

Qt-FFmpeg开发-音频解码为PCM文件(9)

Qt-FFmpeg开发-使用libavcodec API的音频解码示例&#xff08;MP3转pcm&#xff09; 文章目录Qt-FFmpeg开发-使用libavcodec API的音频解码示例&#xff08;MP3转pcm&#xff09;1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x…

关于 registerForActivityResult()的使用方法,不能说详细,只能说略懂得例子

目录 1.情况说明 2.registerForActivityResult()的使用方法 1.情况说明 startActivityForResult();函数过时 使用了 registerForActivityResult()进行了代替 2.registerForActivityResult()的使用方法 数据来源 (2条消息) registerForActivityResult()的使用方法例子_发狂…

西北工业大学算法实验机试复习

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

TC申请是否需要银行转账记录?

【TC申请是否需要银行转账记录&#xff1f;】 答案是毫无疑问的。 根据TE官网公开的文件CCS Certification Procedures V3.0 里面关于TC申请所需的文件指引E2.1.1f&#xff1a;&#xff08;如图&#xff09; 企业在申请与TE相关的认证项目&#xff08;例如GRS/RCS等等&#xf…

iptables 命令和 iptables.service 服务 有什么关系 ?

写在前面 关于iptables 命令 和 iptabls.service 的一些疑惑理解不足小伙伴帮忙指正 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&#xff0c;心里寂寞而凄凉&#xff0c;感到自己的生命被剥夺了。当时我是个年轻人&#xff0c;但我害怕这样生活下去&…

企业级大数据平台智能运维好帮手——星环科技多模数据平台监控软件Aquila Insight

Aquila Insight介绍 Aquila Insight是星环科技推出的一款多模数据平台监控软件&#xff0c;为企业运维团队提供了一套统一、完整、便捷的智能化运维解决方案。通过丰富的仪表盘管理、告警与通知管理、实时和历史查询语句运行分析、计算和存储引擎的统一监控、完整的日志收集过滤…

编程内功心法「底层原理系列」 回归与本质,让本文带你认识什么是计算机软件系统

前提概要 如果希望可以把计算机编程技术提升到另外一个高度&#xff0c;,那么想要搞清楚什么是软件设计&#xff0c;首先就要理解什么是计算机软件&#xff0c;在这之后&#xff0c;再去考虑为什么对软件进行设计&#xff0c;以及在通常情况下应该怎样设计软件。 什么是计算机…

计算机毕业设计:基于HTML学校后台用户登录界面模板源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

KT148A语音芯片SOP外挂功放芯片8002D的说明_V1

目录 一、简介 KT148A语音芯片内置8欧姆0.5W的功放&#xff0c;所以一般的应用场景&#xff0c;播放一些提示音音量是足够的。但是有的需求还需要驱动更大的扬声器&#xff0c;实现更大的播放音量&#xff0c;这里我们给出解决方案。KT148AHAA8002D的组合 二、硬件电路如下-K…

防抖和节流

使用场景&#xff1a; 防抖在连续的事件&#xff0c;只需触发一次回调的场景有&#xff1a; 搜索框搜索输入。只需用户最后一次输入完&#xff0c;再发送请求。 窗口大小resize。只需窗口调整完成后&#xff0c;计算窗口大小。防止重复渲染。 登录、发短信等按钮避免用户点击太…

云原生周刊 | 美国国防部发布零信任战略与路线图

美国国防部发布了到 2027 年截止的零信任战略与路线图&#xff0c;总共有 45 项能力&#xff0c;最终目标是“安全的国防部信息企业”。 开源项目推荐 Extism Extism 是一个 WebAssembly 插件实现框架&#xff0c;它可以给你的应用开发出各种各样的 WebAssembly 插件&#xf…

HTML网页设计——轮滑运动体育类人物介绍主题12页面毕业设计网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]JAVA毕业设计商店管理系统(系统+LW)

[附源码]JAVA毕业设计商店管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

电池供电遥测终端RTU 遥测终端机 低功耗遥测采集终端 智能远传 防水IP68

平升电子电池供电遥测终端RTU/遥测终端机/低功耗遥测采集终端是基于4G、5G、NB-IoT网络实现数据采集、远程传输、分析计算、越限报警的智能设备&#xff0c;具有功耗低、IP68防水等特点。特别适合用在无供电条件、防水防尘要求高的监测现场。 随着通信网络更迭、产品持续改进&…

在线文档协同办公-开箱即用demo

在线文档协同办公-开箱即用demo服务安装&#xff08;略&#xff09;下面开始集成打开文件保存文件共同编辑展示一下集成后的效果图服务安装&#xff08;略&#xff09; 这里可以参考前几篇博客内容 Linux版 windows版 下面开始集成 打开文件 1.创建一个空的html文件。 添加…