ROS学习笔记15 —— moveit与Gazebo联合仿真过程解析

1.基础

官方RRBOT案例:传送门

ros_control和controller:传送门

moveit配置:传送门

2.思路梳理

ros与gazebo/真实机器人通信架构

在这里插入图片描述

来个简化版的:
在这里插入图片描述
省略了机器人实体部分,其中Driver就负责moveit与真实机器人或者gazebo通信,真实机器人与gazebo仿真的区别就在于:

  • ① gazebo仿真时,这个Driver已经帮我们集成好了,我们只需要写个controller就可以实现通信!
  • ② 真实机器人中,如果是自己开发的机器人,这个Driver需要我们自己去编写

同理,其他仿真软件,由于没有帮我们集成好这个Driver,所以当我们使用其他仿真软件与ros联合使用时,就需要自己完成这个Driver的实现,这个过程和真实机器人中是相同的!

从上图可以看到,这个Driver负责控制命令的翻译、下发和机器人状态的反馈,牢牢记住这个图!!!

moveit架构

在这里插入图片描述

我们可以看到,JointTrajectoryAction部分,是通过Robot Controllers进行翻译的,而这个整体框架即 ros与gazebo/真实机器人通信架构 的细节部分!

moveit联合gazebo仿真时需要的控制器

使用MoveIt! Setup Assistant 配置完后,会有两个控制器文件,在moveit_config包的**/config**下:

  • fake_controllers.yaml:为了发布一个虚假的状态,来骗过moveit,目的是可以单独的在rviz里运行moveit
  • ros_controllers.yaml:里面配置了些与硬件接口和仿真相关的内容

但是这两个控制器文件不能达到我们联合仿真的目的!!!

古月君对MoveIt+Gazebo的仿真框架有个很生动的比喻:他把MoveIt下发的FollowJointTrajectory比喻成插头,把机器人接收轨迹Joint Trajectory Controller和状态反馈部分Joint State Controller比喻成插座,所以我们需要两个控制器来实现moveit和gazebo的联合仿真:

robot_control.yaml
myrobot:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50    
myrobot:
  arm_joint_controller:
    type: "position_controllers/JointTrajectoryController"
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6
    gains:
      joint_1:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_2:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_3:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_4:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_5:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_6:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}

启动控制器:

<launch>
    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
        respawn="false" output="screen">
		<param name="publish_frequency" type="double" value="50.0" />
		<param name="tf_prefix" type="string" value="" />
    </node>
    
	<!-- Robot state publisher -->
    <rosparam file="$(find robot_gazebo)/config/robot_control.yaml" command="load"/>
    <node name="arm_controller_spawner" 
    	  pkg="controller_manager" 
    	  type="spawner" 
    	  respawn="false"
          output="screen" 
          ns="/myrobot" 
          args="arm_joint_controller"/>
          
	<!-- joint_state_controller -->
    <rosparam file="$(find robot_gazebo)/config/robot_gazebo_joint_states.yaml" command="load"/>
    <node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
          output="screen" ns="/myrobot" args="joint_state_controller" />

</launch>
controllers.yaml
controller_manager_ns: controller_manager
controller_list:
  - name: myrobot/arm_joint_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: true
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6

启动控制器:
moveit_controller_manager.launch.xml

<launch>
	<!-- gazebo Controller -->
	<rosparam file="$(find robot_moveit_config)/config/controllers_gazebo.yaml"/>
	
    <arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager"/>
    <param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>
</launch>

注意:这些控制器文件中关节的名称和描述文件中必须统一!!!

3. 具体实现

描述文件

需要保证描述文件中已经添加gazebo_ros_control插件

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
  </plugin>
</gazebo>

已经添加transmission,尤其注意硬件接口的配置


参考文献:

障碍物。 首先,需要安装ROSGazebo,并确保ROSGazebo能够正常运行。 接下来,可以按照以下步骤进行操作: 1. 下载gazebo案例的房间模型,并将其保存到catkin工作空间的src目录中。 2. 在模型中添加障碍物,可以通过在模型中添加一个或多个物体来实现。可以使用ROS的模型编辑器或Gazebo提供的编辑器来添加障碍物。 3. 安装gmapping包,该包提供了建图和定位的功能。 ``` sudo apt-get install ros-<distro>-gmapping ``` 4. 在启动文件中,添加gmapping节点和机器人的初始位置。 ``` <node name="gmapping" pkg="gmapping" type="slam_gmapping" output="screen"> <param name="base_frame" value="base_link"/> <param name="odom_frame" value="odom"/> <param name="map_frame" value="map"/> <param name="map_update_interval" value="1.0"/> <param name="maxUrange" value="15.0"/> <param name="sigma" value="0.05"/> <param name="kernelSize" value="1"/> <param name="lstep" value="0.05"/> <param name="astep" value="0.05"/> <param name="iterations" value="5"/> <param name="lsigma" value="0.075"/> <param name="ogain" value="3.0"/> <param name="minimumScore" value="100"/> <param name="srr" value="0.1"/> <param name="srt" value="0.2"/> <param name="str" value="0.1"/> <param name="stt" value="0.2"/> <param name="linearUpdate" value="0.2"/> <param name="angularUpdate" value="0.1"/> <param name="temporalUpdate" value="1.0"/> <param name="resampleThreshold" value="0.5"/> <param name="particles" value="30"/> <param name="xmin" value="-5.0"/> <param name="ymin" value="-5.0"/> <param name="xmax" value="5.0"/> <param name="ymax" value="5.0"/> <param name="delta" value="0.05"/> <param name="llsamplerange" value="0.01"/> <param name="llsamplestep" value="0.01"/> <param name="lasamplerange" value="0.005"/> <param name="lasamplestep" value="0.005"/> <param name="tf_delay" value="0.5"/> <param name="got_map_topic" value="/map"/> </node> <node pkg="tf" type="static_transform_publisher" name="map_odom_broadcaster" args="0 0 0 0 0 0 map odom 100"/> <node pkg="tf" type="static_transform_publisher" name="base_laser_broadcaster" args="0 0 0.5 0 0 0 base_link laser 100"/> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"> <param name="publish_frequency" type="double" value="50.0" /> </node> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model robot -param /robot_description -x 0.1 -y 0.1 -z 0.0"/> ``` 5. 启动Gazebo和RViz。 ``` roslaunch my_gazebo_package my_world.launch roslaunch my_robot_description my_robot_rviz.launch ``` 6. 在RViz中,设置机器人的初始位置,并启动导航。 7. 在导航过程中,可以使用ROS的随机数生成器来随机设置目标点,然后在Gazebo中添加障碍物。 ``` # 生成随机坐标 x=$(python -c "import random; print(random.uniform(-5.0, 5.0))") y=$(python -c "import random; print(random.uniform(-5.0, 5.0))") # 发布目标点 rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped "header: seq: 0 stamp: secs: 0 nsecs: 0 frame_id: 'map' pose: position: x: $x y: $y z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.0 w: 1.0" -1 # 在Gazebo中添加障碍物 rosservice call /gazebo/spawn_sdf_model "model_name: 'obstacle' model_xml: '<?xml version='1.0'?> <sdf version='1.4'> <model name='obstacle'> <static>true</static> <link name='link'> <collision name='collision'> <geometry> <box> <size>0.5 0.5 0.5</size> </box> </geometry> </collision> <visual name='visual'> <geometry> <box> <size>0.5 0.5 0.5</size> </box> </geometry> <material> <script> <uri>file://media/materials/scripts/gazebo.material</uri> <name>Gazebo/Red</name> </script> </material> </visual> </link> <pose>$x $y 0 0 0 0</pose> </model> </sdf>' reference_frame: 'world' initial_pose: position: x: $x y: $y z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.0 w: 1.0" ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值