RBSManager
一个用于处理与运行 ROSBridge 的机器人操作系统(ROS)主机的 WebSocket 连接的 Swift-native 库。用手机控制您的机器人。
它是我的早期 Objective-C 库 RBManager 的大幅改进版。有趣的事实,额外的 S 代表 Swift。
RBSManager 为不同的 ROS 功能调用提供了一个包装器
依赖项
RBSManager 依赖以下 Github 组件,通过 CocoaPod 安装
- Starscream -- 一个 Swift-native WebSocket 库
- ObjectMapper -- 一个将 JSON 数据转换为 Swift 对象的工具(由 ROS 消息系统使用)
感谢他们的开发者!
致谢
此外,还有一些已经贡献代码或消息定义的用户。也要感谢他们!
示例
要运行示例项目,请克隆仓库,然后从Example目录运行pod install
。示例项目连接到Turtlesim节点,并提供以下操作
- 演示一个订阅者以显示海龟的X、Y和Theta状态
- 旋转海龟图标以显示theta值的变化
- 使用左右、上、下按钮控制海龟以演示发布消息
- 使用服务调用演示重置turtlesim
- 接受动态主机值
- 使用自定义模式颜色选择器配置背景并设置参数服务调用
- 使用消息对象和警告视图进行海龟的传送
- 同时点击多个方向(在设备上更方便)以正确引导海龟
要求
- iOS 10+
- Swift 3+
- 运行着ROSBridge服务器的ROS master
- 如果您想在设备上测试,需要一个有效的Apple开发者账号
安装
RBSManager可通过CocoaPods获得。要安装它,只需将以下行添加到Podfile中
pod 'RBSManager'
用法
如前所述,该库本身的行为非常类似于RBManager。它包含一个单例对象,因此只需要一个管理器实例 -- RBSManager.sharedManager()
代理
管理器将在以下方法在不同点发布事件
func manager(_ manager: RBSManager, didDisconnect error: Error?)
func managerDidConnect(_ manager: RBSManager)
func manager(_ manager: RBSManager, threwError error: Error)
错误对象将要么来自套接字本身,要么与管理者功能相关。错误描述将包含有关错误的信息。
所有委托调用都在主UI线程上完成。处理和JSON处理都是在后台线程上完成的,以避免锁定界面。
消息
消息是ROS的核心组件,RBSManager通过实现Mappable
协议来处理消息。目前库中包含的消息数量较少,未来还将添加更多消息(我必须选择那些我认为最重要的消息)。只要自定义消息继承了RBSMessage
并正确遵循了Mappable
协议,就可以添加自定义消息。
消息通常应具有如Float64和String等基础对象类型,但也可以处理嵌套的RBSMessage类型。需要注意的是,嵌套的对象需要额外的设置来处理位置中的初始化方法。查看TwistMessage
类型,了解其工作原理。
Swift的工作方式意味着整体消息系统(主要涉及对象类型和类型转换)需要进行一些妥协,所以我希望随着时间的推移对其进行审查和改进。
订阅者
通过在管理者上调用以下方法创建新的订阅者
func addSubscriber(topic: String, messageClass: RBSMessage.Type, response: @escaping ((_ message: RBSMessage) -> (Void))) -> RBSSubscriber
- 话题 -- 订阅的ROS节点
- messageClass -- 收到的消息的类型声明(例如,使用
TwistMessage.self
) - response -- 接收消息的回调
示例
let turtleSubscriber = turtleManager?.addSubscriber(topic: "/turtle1/pose", messageClass: PoseMessage.self, response: { (message) -> (Void) in
// update the view with message data
self.updateWithMessage(message as! PoseMessage)
})
与RBManager
的代理模式不同,回调结构保持了更Swift类似的流程,并更好地允许多个订阅者在同一主题上订阅。订阅者对象还公开了大多数ROS选项,如队列长度和节流速率。
当管理者连接时,订阅者将自动订阅,但您可以手动连接/断开连接,分别通过调用.subscribe()
或.unsubscribe()
。
发布者
通过在管理者上调用以下方法创建新的发布者
func addPublisher(topic: String, messageType: String, messageClass: RBSMessage.Type) -> RBSPublisher
- 话题 -- 要发布的ROS节点
- messageType -- ROS期望的消息类型(例如,
geometry_msgs/Twist
) - messageClass -- 您将要发送的类类型(例如,
TwistMessage.self
)
示例
let turtlePublisher = turtleManager?.addPublisher(topic: "/turtle1/cmd_vel", messageType: "geometry_msgs/Twist", messageClass: TwistMessage.self)
单独创建新的消息对象,并通过将消息对象传递给.publish(_ message: RBSMessage)
发布它
当管理者连接时,将广告发布者,但您可以通过调用.advertise()
或.unadvertise()
来手动更改其状态。
服务调用
服务调用用于在ROS上执行操作,无论是否有参数和响应值。通过以下方法在管理器中创建一个新的服务调用:
func makeServiceCall(service: String) -> RBSServiceCall
- service -- 发起请求的ROS主题/节点
示例
let serviceCall = turtleManager?.makeServiceCall(service: "/reset")
可以调用 .send(_response: ((_response: RBSResponse) -> Void)?)
来触发服务调用。这个可选的响应回调可以接收服务调用响应并返回一个 RBSResponse
数据。
版本0.4迁移到 RBSResponse
数据类型,它包括关于请求的额外上下文。使用 response.values
来查找调用返回的数据。
示例
serviceCall?.send({ (response) -> (Void) in
if let values = response.values as? [String:Any], let value = values["value"] as? String {
self.number = Float64(value)
}
})
要将数据传递到服务调用本身,可以将数据分配给以下几个之一:dataArgument(字典)、messageArgument(RBSMessage对象)或arrayArgument(数组)
参数
管理器还可以通过生成具有预格式化属性的服务调用对象来处理设置和获取ROS参数。
func getParam(name: String) -> RBSServiceCall
func setParam(name: String, value: Any) -> RBSServiceCall
使用常规发送回调和接收数据。
设计考量
多个订阅者
在构建自定义机器人控制器时,我研究了多次订阅同一主题的最佳方法。当订阅者允许分配ID时,但返回值不尊重这些ID。在实践中,这意味着如果两个订阅者的刷新率不同,它们将以最快的指定速率都接收到消息。
为了解决这个问题,建议使用iOS通知模式来根据您的需求分配消息。一个单一的数据模型类型对象可以订阅每个独特的主题,并将消息与各个控制器共享。
工具
自定义消息生成器
为了方便起见,我包含了一个Python脚本来生成Swift消息文件。它并不完美,但大多数编译消息所必需的工作都能完成。它位于“工具”文件夹中。
python ./custom_messages.py [class name] [variables...n]
其中
- [class name] = 文件/类的名称(应包括Message以保持一致性)
- [variables...n] = 变量名和Swift类型,用冒号分隔
示例
python ./custom_messages.py ExampleMessage stringData:String floatData:Float intData:Int
路线图
这个库改变了我之前工作的很多事情,并且肯定会在一段时间内持续更新。请在构建项目时考虑到这一点,如果您认为这个库缺少某个功能,请与我联系。
- 填充所有标准的ROS消息类型
- 将基于Dictionary的参数处理全部转换为使用JSON映射的自定义对象
Actionlib
rosbridge项目没有提到对actionlib组件的支持。协议列在这里:此处。如果您正在寻找这个功能,我建议与该团队联系。
作者
wesgood, w [at] wesg [dot] ca, @wesgood
移动软件开发者,机电工程师,机器人爱好者。
许可
RBSManager 在 MIT 许可下提供。更多信息请查看 LICENSE 文件。
长话短说;请随意使用我的库做些酷炫的事情,但请与我分享,以便我了解它被用于什么。更好的是,在你的项目中包含对库的链接或致谢。