)
本文讲述如何使用rviz2显示urdf模型环境是WSL Ubuntu 24.04ROS2是Jazzy版本一 准备URDF文件这里写一个简单的机械臂urdf文件名为robot.urdf?xml version1.0?robotnametest_armlinknamebase_linkvisualoriginxyz0 0 0rpy0 0 0/geometryboxsize0.2 0.2 0.2//geometrymaterialnamebluecolorrgba0 0 1 0.8//material/visual/linkjointnamejoint1typerevoluteparentlinkbase_link/childlinklink1/originxyz0 0 0.1rpy0 0 0/axisxyz0 0 1/limitlower-3.14upper3.14effort10.0velocity1.0//jointlinknamelink1visualoriginxyz0 0 0.15rpy0 0 0/geometryboxsize0.16 0.16 0.3//geometrymaterialnameredcolorrgba1 0 0 0.8//material/visual/link/robot这个是一个关节joint12个linkbase_link蓝色立方体和link1红色立方体。关节把这2个link连接在一起base_link是根link。二 安装需要的程序首先是安装ROS2 Jazzy可以参考官方文档记住是安装ros-jazzy-desktop里面包含了rviz2然后安装joint_state_publisher_gui该程序提供了一个界面来让关节运动方便调试sudoaptupdatesudoaptinstall-yros-jazzy-joint-state-publisher-gui三 测试1. 运行robot_state_publisherrobot_state_publisher是ros2自带的可以使用它把urdf文件内容publish到topic: “/robot_description”source/opt/ros/jazzy/setup.bash ros2 run robot_state_publisher robot_state_publisher --ros-args-probot_description:$(catrobot.urdf)这里参数robot_description的值就是robot.urdf的内容可以根据robot.urdf的位置加上路径2. 运行joint_state_publisher_gui运行下面命令source/opt/ros/jazzy/setup.bash ros2 run joint_state_publisher_gui joint_state_publisher_gui弹出窗口如下显示关节名joint1和urdf文件里定义的一样这个界面的第一个按钮Randomize是用来给关节生成随机位置Center则是让关节复位joint_state_publisher_gui是通过向/joint_state发送位置速度等信息继而让关节运动3. 运行rviz2source/opt/ros/jazzy/setup.bash rviz2弹出界面后点击Fixed Frame然后选择base_link这个是robot.urdf文件里定义的根link最后点击左下角的Add然后选择RobotModel添加完毕后在Description Topic里选择/robot_description选择好之后久可以在rviz2中间的窗口中看到这个模型可以通过鼠标滚轮靠近这个模型。最后通过joint_state_publisher_gui上的滑块来控制joint1运动同时会发现这个模型也在动4. 自定义运动脚本如果想通过自己写的python脚本让模型运动那就需要先关闭joint_state_publisher_gui然后使用如下简单脚本#!/usr/bin/env python3importrclpyfromrclpy.nodeimportNodefromsensor_msgs.msgimportJointStateclassJointPub(Node):def__init__(self):super().__init__(joint_publisher)self.pubself.create_publisher(JointState,/joint_states,10)self.timerself.create_timer(0.5,self.timer_cb)self.angle0.0deftimer_cb(self):msgJointState()# 关键填充时间戳msg.header.stampself.get_clock().now().to_msg()msg.header.frame_idmsg.name[joint1]msg.position[self.angle]self.pub.publish(msg)self.angle0.2ifself.angle3.14:self.angle-3.14defmain():rclpy.init()nodeJointPub()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if__name____main__:main()运行后发现模型可以旋转