ROS2-rviz2实例化机械臂
ROS2-rviz2实例化机械臂
摘要
本文基于ROS2 实现了机械臂在rviz2中的建模,实现过程真的很艰辛,没有ROS1的经验,ROS2的rviz2教程又很少,虽然rviz和rviz2打开后几乎一样,但是编译过程,launch文件的编写,其代表的含义都不一样。这也算是一个rviz2实例化的教程吧!
实现环境和对象
ROS版本:ROS2-foxy
机械臂:aubo-i5-机械臂(其urdf文件可在官网下载得到,后文会给出下载链接)
学习基础:学习过官网的基础教程,懂得创建、编译和运行package
教学开始
- 在dev_ws/src 下创建一个包命名为aubo_i5_simulation
ros2 pkg create aubo_i5_simulation --build-type ament_cmake --dependencies rclcpp
- 配置urdf和rviz文件
a. 进入dev_ws/src/aubo_i5_simulation,新建一个urdf文件夹,用来放urdf文件。
我们使用现成的urdf文件(下载地址:https://github.com/lg609/aubo_robot/blob/master/aubo_description/urdf/aubo_i5.urdf),下载到urdf文件夹,命名为aubo_i5.urdf
关于urdf文件的格式及含义这里简单解释一下,它就是一个模型文件。aubo_i5.urdf包含了机械臂的框架,比如节点和轴的信息,以及具体的几何数据。需要注意的是,这个urdf文件把几何结构用STL、DAE文件来表示的,比如:
<geometry>
<mesh filename="package://aubo_description/meshes/aubo_i5/collision/base_link.STL" />
</geometry>
因此,我们还需要补充一下这些文件。
b.在aubo_i5_simulation中再新建一个meshes文件夹,把这个链接(https://github.com/lg609/aubo_robot/tree/master/aubo_description/meshes)里的aubo_i5文件夹下载到meshes中。
c.注意我们这里包的名字是aubo_i5_simulation, 下载的urdf里meshes的路径是aubo_description下的,所以我们需要把urdf/aubo_i5.urdf里有关有关meshes的路径全部修改一下,把aubo_description改成aubo_i5_simulation。比如:
<geometry>
<mesh filename="package://aubo_i5_simulation/meshes/aubo_i5/collision/base_link.STL" />
</geometry>
d. 至此urdf文件算是搞定了,下面配置rviz文件,ROS2的默认rviz文件在/opt/ros/foxy/share/rviz_common下,复制该目录下的default.rviz到aubo_i5_simulation/urdf文件夹下。即跟urdf文件在同一文件夹下。
3.配置launch文件
在aubo_i5_simulation里新建一个launch文件夹,然后在launch文件夹里新建一个display.launch.py文件,其内容为下列代码:
import os
from ament_index_python.packages import get_package_share_directory
import launch
from launch.substitutions import Command, LaunchConfiguration
import launch_ros
import os
def generate_launch_description():
pkg_share=launch_ros.substitutions.FindPackageShare(package='aubo_i5_simulation').find('aubo_i5_simulation')
urdf_path =os.path.join(pkg_share, 'urdf/aubo_i5.urdf')
rviz_path =os.path.join(pkg_share, 'urdf/default.rviz')
with open(urdf_path, 'r') as infp:
robot_desc = infp.read()
rsp_params = {'robot_description': robot_desc}
robot_state_publisher_node = launch_ros.actions.Node(
package='robot_state_publisher',
executable='robot_state_publisher',
output='screen',
parameters=[rsp_params]
)
joint_state_publisher_node = launch_ros.actions.Node(
package='joint_state_publisher',
executable='joint_state_publisher',
name='joint_state_publisher',
output='screen',
condition=launch.conditions.UnlessCondition(LaunchConfiguration('gui'))
)
joint_state_publisher_gui_node = launch_ros.actions.Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
name='joint_state_publisher_gui',
output='screen',
condition=launch.conditions.IfCondition(LaunchConfiguration('gui'))
)
rviz_node = launch_ros.actions.Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
arguments=['-d', rviz_path],
)
return launch.LaunchDescription([
launch.actions.DeclareLaunchArgument(name='gui', default_value='True',
description='Flag to enable joint_state_publisher_gui'),
launch.actions.DeclareLaunchArgument(name='model', default_value=urdf_path,
description='Absolute path to robot urdf file'),
joint_state_publisher_node,
joint_state_publisher_gui_node,
robot_state_publisher_node,
rviz_node
])
note:这里用了一个joint_state_publisher_gui_node,需要在编译前安装好,安装命令:
sudo apt-get install ros-foxy-joint-state-publisher-gui
4.修改cmakelists.txt
打开cmakelists.txt,在ament_package()前面加上以下几行:
# Install launch files.
install(DIRECTORY
launch
meshes
urdf
DESTINATION share/${PROJECT_NAME}/
)
这是为了编译时把你自己建立的launch,meshes,urdf一起复制到执行文件夹内,不然编译后运行时会找不到相应的文件。
5.编译该包
在dev_ws下打开命令窗,输入:
colcon build --packages-select aubo_i5_simulation
配置启动文件
. install/setup.bash
执行launch文件
ros2 launch aubo_i5_simulation display.launch.py
- 这个时候会自动启动rviz2,打开后的界面是这样的
把左上角Fixed frame 里的map改为base_link
然后点击左下角add,找到robotmodel,添加进去
然后把robotmodel的选项按下图更改,机械臂就出来了
总结
本文没有讲的很细,只能说是初步实现了rviz2的建模,很多细节还是要靠自己理解!!!答主也在学习ROS2的过程中,以后也会陆续分享一些学习经验!与君共勉!