如何在ROS2 Humble中用虚拟控制器结合MoveIt2实现RViz轨迹可视化?
可行,以下是具体操作步骤
1. 准备MoveIt2配置包
确保你已为目标机器人生成MoveIt2配置包(可通过moveit_setup_assistant工具创建),配置包需包含机器人URDF/SRDF、运动学插件配置等核心文件。
2. 启动无控制器模式的move_group节点
启动move_group时通过参数跳过控制器加载,仅启用轨迹可视化相关功能,在终端执行:
ros2 launch <你的机器人MoveIt配置包> move_group.launch.py use_sim_time:=False load_robot_description:=True load_controller:=False
load_controller:=False:禁用ROS2控制器加载use_sim_time:=False:使用系统时间(无需Gazebo仿真时间)
3. 配置RViz的MoveIt2可视化插件
启动RViz:
rviz2
在RViz中完成以下配置:
- 添加
RobotModel插件,设置Robot Description为robot_description,确认机器人模型正常显示 - 添加
MotionPlanning插件(MoveIt2轨迹可视化核心):- 在
Planning Scene选项卡中,将Planning Scene Topic设为/move_group/monitored_planning_scene - 在
Planned Path选项卡中,勾选Show Robot Visual和Show Trail,分别用于显示机器人轨迹跟随预览和轨迹路径
- 在
4. 生成并可视化轨迹
方式一:通过RViz插件手动规划
- 在
MotionPlanning插件的Planning选项卡中,选择目标规划组(如arm) - 拖动机器人末端执行器到目标位姿,点击
Plan按钮,MoveIt2会自动规划轨迹并在RViz中实时展示虚拟机器人的运动预览 - 点击
Execute,此时不会驱动物理机器人,但RViz内的虚拟机器人会完整复现轨迹执行过程
方式二:通过代码发布预定义轨迹
若有预定义轨迹,可编写ROS2节点将轨迹发布到/move_group/display_planned_path话题,RViz会自动接收并可视化。示例Python代码片段:
import rclpy from rclpy.node import Node from moveit_msgs.msg import DisplayTrajectory from trajectory_msgs.msg import JointTrajectory class TrajectoryVisualizer(Node): def __init__(self): super().__init__('trajectory_visualizer') self.publisher_ = self.create_publisher(DisplayTrajectory, '/move_group/display_planned_path', 10) # 构造示例轨迹(替换为你的实际轨迹数据) display_traj = DisplayTrajectory() display_traj.trajectory_start.joint_state.name = ["joint_1", "joint_2", "joint_3"] display_traj.trajectory_start.joint_state.position = [0.0, 0.0, 0.0] traj = JointTrajectory() traj.joint_names = ["joint_1", "joint_2", "joint_3"] traj.points = [ {'positions': [0.5, 0.5, 0.5], 'time_from_start': {'sec': 1}}, {'positions': [1.0, 0.0, 1.0], 'time_from_start': {'sec': 2}} ] display_traj.trajectory.append(traj) self.publisher_.publish(display_traj) self.get_logger().info("轨迹已发布,RViz将开始可视化") def main(args=None): rclpy.init(args=args) node = TrajectoryVisualizer() rclpy.spin_once(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()
运行该节点后,RViz会自动展示发布的轨迹。
关键注意事项
- 忽略
move_group启动时的控制器相关报错(因已禁用控制器加载) - 若机器人模型无法显示,通过
ros2 param list检查robot_description参数是否正确加载 - 确保配置包中的运动学插件(如
KDLKinematicsPlugin)配置正确,否则无法生成轨迹
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

