0. 简介

在面对ROS这个软件时,我们会尝试着设计更多的可视化软件用于仿真,以展示我们算法程序的效果。作者就在这里向大家展示6种二次开发和可视化平台。下面我们以ROS2为主来一一说明。

1. RVIZ2

rviz2作为我们最常用的可视化软件,其也支持插件的开发使用,具体使用方法也和ROS1类似,这里之前写过一篇ros1 如何开发rviz plugin插件的文章,这里就不展开叙述了。下图为小米cyberdog铁蛋的rviz2的示意图,其使用和ROS1没有差别。
在这里插入图片描述

2. RQT

RQT作为和RVIZ2一样经常使用的软件,其也具有插件开发的能力。作为一个RQT的plugin插件,其结构大致如下
在这里插入图片描述
其中CMakeLists,packag.xml与其他ros包无明显差异

plugin.xml表示了此插件在rqt中的显示方式,也就是说可以在plugin菜单找到它

resource文件中MyPlugin.ui是用QT designer设计的UI界面

script文件中的rqt_mypkg是一个Python脚本,负责启动这个插件

按照官网的顺序:

  1. 修改package.xml,填入export语句让我们的plugin能够被系统找到进行调用。

  2. 创建plugin.xml ,描述plugin,最重要的是,在rqt_gui界面中的分组与顺序。

  3. setup.py 通过ROS的catkin, 利用CMake 来将脚本文件放在一个不在PATH中但是又跟package关联的文件夹下让系统找得到。

  4. 修改CMakeLists.txt

  5. 创建src/rqt_mypkg,添加__init__.py和my_module.py

  6. 界面元素及布局 MyPlugin.ui

经过这六步,我们就可以用Plugins->Logging->My plugin label菜单在rqt的框架内添加新一个my_plugin实例,并得到一个自定义的RQT插件了
在这里插入图片描述

3. gazebo

与rviz2和rqt一样,gazebo也是ROS1中经常使用的其在功能上也没有什么差别,这里可以参照创客制造的一篇小文章来入门。如果使用过ROS1的同学,可以无缝衔接到ROS2中
在这里插入图片描述

4. V-rep/CoppeliaSim

第三种是V-rep/CoppeliaSim与ROS2完成的数据通信,瑞雷老师在这篇文章中详细介绍了这部分的工作。通过下载simExtROS2Interface的foxy版本,并利用该功能包生成.so文件。
在这里插入图片描述
相较于我们常见的gazebo而言,V-rep/CoppeliaSim的好处是其可以更加便捷的完成代码的配置与二次开发,同时该软件支持lua或者python语言的开发与撰写。

5. Webots

Webots 作为一种界面与仿真兼具的软件,其可以通过对真实世界中机器人的传感器、执行器的仿真得到一个更加符合真实情况的结果,这也为实机测试省去了大量的麻烦,之前Webot与ROS一开始还不兼容,目前Webots已经全面的拥抱ROS2。从官方的例子我们可以看到webots的上手难度越来越低,中间件直接连通了,只需要你通过简单的调用即可完成车辆在仿真环境中的运动。官方的文档已经讲得很详细了,这里也不过多的去展开讲述,等作者啥时候研究这块后再详细展开吧。

import rclpy
from geometry_msgs.msg import Twist

HALF_DISTANCE_BETWEEN_WHEELS = 0.045
WHEEL_RADIUS = 0.025

class MyRobotDriver:
    def init(self, webots_node, properties):
        self.__robot = webots_node.robot

        self.__left_motor = self.__robot.getDevice('left wheel motor')
        self.__right_motor = self.__robot.getDevice('right wheel motor')

        self.__left_motor.setPosition(float('inf'))
        self.__left_motor.setVelocity(0)

        self.__right_motor.setPosition(float('inf'))
        self.__right_motor.setVelocity(0)

        self.__target_twist = Twist()

        rclpy.init(args=None)
        self.__node = rclpy.create_node('my_robot_driver')
        self.__node.create_subscription(Twist, 'cmd_vel', self.__cmd_vel_callback, 1)

    def __cmd_vel_callback(self, twist):
        self.__target_twist = twist

    def step(self):
        rclpy.spin_once(self.__node, timeout_sec=0)

        forward_speed = self.__target_twist.linear.x
        angular_speed = self.__target_twist.angular.z

        command_motor_left = (forward_speed - angular_speed * HALF_DISTANCE_BETWEEN_WHEELS) / WHEEL_RADIUS
        command_motor_right = (forward_speed + angular_speed * HALF_DISTANCE_BETWEEN_WHEELS) / WHEEL_RADIUS

        self.__left_motor.setVelocity(command_motor_left)
        self.__right_motor.setVelocity(command_motor_right)

在这里插入图片描述

6. Unity

Unity作为一种非常通用的平台,其可以构建并部署到Windows 10、Mac OS或Linux等任意主流操作系统。而使用的Unity Robotics软件包带有许多现成的接口,能让你轻松与ROS或ROS2的交换信息。

Unity For ROS2这个软件,是Robotec.AI公司开源的ROS2的一个原生(native)应用,它不像其它有些应用那样,使用ROS1-Brdige包来做到所谓的支持ROS2,它是真真正正地从RCL Robot Client Layer衍生做出来的。这样做的最大的一个好处,就是你可以把这个仿真功能直接加载到你自己的node中,而且可以无损地使用ROS2系统中对于性能、稳定性等等方面的一些优势实现。

不过呢,这个软件使用的是C#语言,因此需要安装rclcs库,而且对于Linux开发者多少有些不太友好。

在这里插入图片描述

https://hermit.blog.csdn.net/article/details/121993391

https://blog.csdn.net/yaked/article/details/118420240

https://blog.csdn.net/huyaoyu/article/details/82134378

https://www.guyuehome.com/14068

https://docs.ros.org/en/rolling/Tutorials/Advanced/Simulators/Webots.html

https://www.ncnynl.com/archives/202110/4745.html

https://zhuanlan.zhihu.com/p/403640687