本文讲述如何使用rviz2显示urdf模型,环境是WSL Ubuntu 24.04,ROS2是Jazzy版本
一 准备URDF文件
这里写一个简单的机械臂urdf文件,名为robot.urdf
<?xml version="1.0"?><robotname="test_arm"><linkname="base_link"><visual><originxyz="0 0 0"rpy="0 0 0"/><geometry><boxsize="0.2 0.2 0.2"/></geometry><materialname="blue"><colorrgba="0 0 1 0.8"/></material></visual></link><jointname="joint1"type="revolute"><parentlink="base_link"/><childlink="link1"/><originxyz="0 0 0.1"rpy="0 0 0"/><axisxyz="0 0 1"/><limitlower="-3.14"upper="3.14"effort="10.0"velocity="1.0"/></joint><linkname="link1"><visual><originxyz="0 0 0.15"rpy="0 0 0"/><geometry><boxsize="0.16 0.16 0.3"/></geometry><materialname="red"><colorrgba="1 0 0 0.8"/></material></visual></link></robot>这个是一个关节joint1,2个link:base_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_publisher
robot_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. 运行rviz2
source/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.pub=self.create_publisher(JointState,"/joint_states",10)self.timer=self.create_timer(0.5,self.timer_cb)self.angle=0.0deftimer_cb(self):msg=JointState()# 关键:填充时间戳msg.header.stamp=self.get_clock().now().to_msg()msg.header.frame_id=""msg.name=["joint1"]msg.position=[self.angle]self.pub.publish(msg)self.angle+=0.2ifself.angle>3.14:self.angle=-3.14defmain():rclpy.init()node=JointPub()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if__name__=="__main__":main()运行后发现模型可以旋转