一、urdf模型
参考链接:https://blog.csdn.net/weixin_45168199/article/details/105755388
这部分直接看参考链接就可以,主要思路如下
1、把sw中的零散零件按照机器人中连杆的分类整合成几个大零件
2、把几个大零件整合成装配体,并设置若干坐标系和旋转轴
3、安装sw的urdf插件,将零件输出为urdf软件包,注意包名要命名为英文
- 这部分有一个要注意的地方,导出文件夹的时候要导出英文名字的文件,不然到ubuntu里面有可能乱码
- 生成的文件夹就是一个独立的软件包,但是一般也不会启动这个节点,主要还是作为后面moveit和ros_control查找模型时比较方便。我这里删除了一些部分,只保留了会用到的。
* 这里对模型的urdf文件做了一点修改,去除了碰撞体。可能是因为模型本身出现了干涉,到后来使用moveit的时候,会认为一支有碰撞。
二、使用moveit的生成ui
参考链接:https://blog.csdn.net/qq_44940689/article/details/138214260
1、先创建工作空间并编译
- 实际上,导入urdf的软件包时,已经创建了工作空间和src文件夹了,这里直接编译一下即可
colcon build
- 编译完成后引入环境变量
. ./install/setup.bash
- 创建一个等一下要存放moveit生成代码的文件夹moveit_test
2、使用moveit图形界面开始生成代码
ros2 run moveit_setup_assistant moveit_setup_assistant
这部分也是跟着上面的参考链接走就行,需要注意以下几点:
- 一定要设置初始位置,否则规划器无法解算
- 要设置moveit_controller,这个东西联系了moveit的规划输出和ros_conrol的控制输入
- 写邮箱的时候格式要对,否则代码不能用
3、具体效果
- 编译之后直接运行即可
ros2 launch moveit_test demo.launch.py
- 我这里发现这个末端没法直接拖动,可能是因为自由度不够导致的,所以直接在joints中修改角度进行测试
三、moveit_test软件包分析
* 这个软件包中只有两个文件夹,一个是启动文件夹,一个是配置文件夹
1、启动文件
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_demo_launchdef generate_launch_description():moveit_config = MoveItConfigsBuilder("erobot", package_name="moveit_test").to_moveit_configs()return generate_demo_launch(moveit_config)
- 这是demo那个启动文件,整体逻辑是读取config文件夹的配置,然后这个启动文件返回一个启动描述对象的实例
- 这个实例本身并没有启动的代码,只是返回一个类似于launch文件的东西。可能是ros2的launch命令也可以接收这种类型了。
2、配置文件
- 配置文件相对复杂一点,以erobot.urdf.xacro文件为入口,调用了其他配置和资源文件。配置文件是以xacro的语言写的,这种xml语言,大概知道意思就行,一般不会有太复杂的东西。
(1)erobot.urdf.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="erobot"><xacro:arg name="initial_positions_file" default="initial_positions.yaml" /><!-- Import erobot urdf file --><xacro:include filename="$(find erobot)/urdf/motor_robot.urdf" /><!-- Import control_xacro --><xacro:include filename="erobot.ros2_control.xacro" /><xacro:erobot_ros2_control name="FakeSystem" initial_positions_file="$(arg initial_positions_file)"/></robot>
- 这个文件首先定义了一个初始位置文件地址变量initial_positions_file,然后引入了两个xacro描述文件,分别是机器人模型和控制器,最终宏定义了一个控制器。
(2)erobot.ros2_control.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro"><xacro:macro name="erobot_ros2_control" params="name initial_positions_file"><xacro:property name="initial_positions" value="${load_yaml(initial_positions_file)['initial_positions']}"/><ros2_control name="${name}" type="system"><hardware><!-- By default, set up controllers for simulation. This won't work on real hardware --><plugin>mock_components/GenericSystem</plugin></hardware><joint name="link1_joint"><command_interface name="position"/><state_interface name="position"><param name="initial_value">${initial_positions['link1_joint']}</param></state_interface><state_interface name="velocity"/></joint><joint name="link2_joint"><command_interface name="position"/><state_interface name="position"><param name="initial_value">${initial_positions['link2_joint']}</param></state_interface><state_interface name="velocity"/></joint></ros2_control></xacro:macro>
</robot>
- 这个文件就是描述erobot_ros2_control的,代码中引入了控制器插件,并定义了控制器的关节接口,也就是一个位置命令和两个位置和速度状态接口。