连接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轴向上。
坐标轴转换:
坐标轴 | Unity | ROS |
---|---|---|
Forward | Z | X |
Right | X | -Y |
Up | Y | Z |
Rotation | clockwise | counter-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文件夹的名字, 但是也可手动更改名字。
- 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
- WebSocketUWPProtocol
A WebSocket client for UWP using Windows.NetWorking.Sockets.
a running ROS# version with this protocol is hosted on @dwhit 's fork.
暂时需要这么多内容,后续有需要其他的部分继续补充这篇博客。