ROS#学习记录(ROS Comunicate with Unity3D by websocket)

连接ROS(注意两台电脑一定要链接在同一个局域网内)

本人使用两台电脑,一台是Windows一台是Ubuntu16.04.

  • 首先,在Ubuntu系统终端输入ifConfig,查看Ubuntu电脑的IP地址。
  • 重新开启一个终端窗口,运行roscore
  • 开启rosbridge_websocket,输入命令行roslaunch rosbridge_server rosbridge_websocket.launch
  • 打开rqt
  • 在Unity客户端里面创建一个空物体命名为RosConnector
    在这里插入图片描述
  • 添加Ros Connector脚本输入Ubuntu电脑的IP地址,并添加你要发布消息的Publisher
    在这里插入图片描述

4.开发者文件

1.ROS-Unity坐标系统转换

Unity中世界坐标系使用左手系,y轴向上;然而,ROS中世界坐标系使用右手系,Z轴向上。

坐标轴转换:

坐标轴UnityROS
ForwardZX
RightX-Y
UpYZ
Rotationclockwisecounter-clockwise

在这里插入图片描述

ROS#中的脚本TransformExtensions.cs通过在两个平台上保持向前-向左-向上的约定来处理坐标系统转换。

例如:ROS2Unity

public static Vector3 Ros2Unity(this Vector3 vector3)
{
    return new Vector3(-vector3.y, vector3.z, vector3.x);
}

2.如何添加新的消息类型(Message Types)

这一节,目的是解释如何在ROS#中添加新的消息类型。

  • 所有的ROS#消息和服务都被定义在命名空间RosSharp.RosBridgeClient.Message里面,它们执行抽象类Message.cs。
  • 所有的ROS#消息有连续的字符串叫RosMessageName作为类的属性,它代表了它们在ROS中的名字(如:“sensor_msgs/JointState”,“std_msgs/Float32”)其他的消息字段应该是C#类属性(.Net JSON序列化API所需要的)。要确保字段名字是ROS和ROS#是一致的,尤其是大小写
  • ROS中services由Request和Response构成。在ROS#中,他们被分成两个不同的类。例如:std/_srvs/SetBool将被分成SetBoolRequest和SetBoolResponse。
  • ROS中actions由goal,result,feedback构成,遵循ROS生成action消息的约定,在ROS#中,action消息被分成7个类。例如:actionlib_tutorials/Fibonacci将被分成FibonacciAction, FibonacciGoal, FibonacciActionGoal, FibonacciResult, FibonacciActionResult, FibonacciFeedback and FibonacciActionFeedback message classes.
  • 生成的操作消息类继承对应的基类:Libraries/RosBridgeClient/BaseMessages/Actions.
  • Messages, services and actions生成之后有自己的文件夹, 命名在他们的包名之下. 如:Nav/msg and Nav/srv.

2.1 用本地的ROS Message文件在Unity3D中生成消息类型。

选择合适的子菜单在RosBridgeClient > Auto Generate Messages/Services/Actions menu,依据输入的文件类型。你可以选择去生成single message,messages of a package,或者所有的消息。
在这里插入图片描述
1.Single message
在这里插入图片描述
在这个窗口寻扎 Browse File…一旦消息文件被选择了,包名被假设为ROS文件夹的名字, 但是也可手动更改名字。

  1. Package message
    在这里插入图片描述
    与上一个是相同的步骤,仅仅不同的是你将要选择一个ROS文件夹。
    3.Directory message
    在这里插入图片描述
    这个工具是将路径下的一个或者多个package自动生成message。

2.2 用控制台工具生成ROS message文件。

无需Unity3D也可以成成消息类型。你可以使用你最喜欢的控制台工具自动生成custom messages。
从github中clone到本地ros-sharp1.5:
在这里插入图片描述
在这里插入图片描述
1.找到RosSharp.sln,在VS中编译

  • 打开Libraries\RosSharp.sln

  • In Build > Configuration Manager select:
    Active Solution Configuration: Release
    Active Solution Platform: Any CPU
    在这里插入图片描述

  • Click Build > Build Solution
    在这里插入图片描述
    2.在你的Unity工程里面更新RosBridgeClient.dll
    Copy RosBridgeClient.dll

  • 从==…Libraries\RosBridgeClient\bin\Release==

  • 到==…\Unity3D\Assets\RosSharp\Plugins==

3.你可以创造一个 publisher or a subscriber脚本在目录Assets\RosSharp\Scripts\RosCommunication之下。

2.3通过RosbridgeClient library手动生成消息类型

感觉和第二种方法一样的,个人认为第一种、第二种方法会了就可以了

3.RosBridgeClient协议

RosBridgeClient旨在保持通用的通信协议,可以通过实现简单且简约的IProtocol接口来添加新协议:

public interface IProtocol
{
    void Connect();
    void Close();
    bool IsAlive();
    void Send(byte[] data);
    event EventHandler OnReceive;
}

通过传入要使用的IProtocol接口实现来实例化RosSocket。

例如:

string uri = "ws://xxx.xxx.xxx.xxx:9090";
RosSocket rosSocket = new RosSocket(new RosBridgeClient.Protocols.WebSocketNetProtocol(uri));

尽管ROS#当前带有两个基于WebSocket的IProtocol实现,但是请注意,IProtocol不一定需要是WebSocket客户端。

当前现有的协议接口执行:
1.WebSocketNetProtocol
WebSocket 客户端基于 .NET ClientWebSocket 类。

  • available since .NET Framework 4.5 only
  • requires Windows 8 and above

2.WebSocketSharpProtocol
A wrapper for websocket-sharp.

  • the original WebSocket client used in ROS#
  • requires additional assembly websocket-sharp.dll
  • not compatible with e.g. UWP
  1. WebSocketUWPProtocol
    A WebSocket client for UWP using Windows.NetWorking.Sockets.

a running ROS# version with this protocol is hosted on @dwhit 's fork.

暂时需要这么多内容,后续有需要其他的部分继续补充这篇博客。

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值