移动机器人仿真梳理

xiaoxiao2025-04-17  10

最近系统重装,重新配置仿真环境,因此再次梳理一下

假设ubuntu16中已经安装完ros-kinetic.

1、仿真环境配置

建立ros工作空间:

source /opt/ros/kinetic/setup.bash sh creat_pkg.sh mkdir -p ~/ros_gazebo/src cd ~/ros_gazebo catkin_make source ~/ros_gazebo/devel/setup.bash echo $ROS_PACKAGE_PATH #输出/home/jk/ros_gazebo/src:/opt/ros/kinetic/share

新建package:

cd ~/ros_gazebo/src/ catkin_create_pkg my_ros_sim std_msgs rospy roscpp cd ~/ros_gazebo/ catkin_make

运行以下命令,看看是否缺少一些包。

roslaunch turtlebot_gazebo turtlebot_world.launch roslaunch turtlebot_teleop keyboard_teleop.launch roslaunch turtlebot_gazebo gmapping_demo.launch roslaunch turtlebot_rviz_launchers view_navigation.launch

安装对应的缺少的包到src下(turtlebot_simulator包含turtlebot_gazebo,turtlebot_interactions包含turtlebot_rviz_launchers)

cd ~/ros_gazebo/src git clone https://github.com/turtlebot/turtlebot_simulator.git git clone https://github.com/turtlebot/turtlebot.git git clone https://github.com/turtlebot/turtlebot_interactions.git

编译:

#可能需要安装以下包 sudo apt-get install ros-kinetic-joy catkin_make

 

2、下载model,修改launch

下载:gazebo_model,并解压到~/.gazebo下,如下图:

cd ~/.gazebo/ tar -xzvf models.tar.gz

2.1 修改turtlebot_world.launch

<launch> <!--有修改--> <arg name="gui" default="true"/> <arg name="world_file" default="$(env TURTLEBOT_GAZEBO_WORLD_FILE)"/> <arg name="base" value="$(optenv TURTLEBOT_BASE kobuki)"/> <!-- create, roomba --> <arg name="battery" value="$(optenv TURTLEBOT_BATTERY /proc/acpi/battery/BAT0)"/> <!-- /proc/acpi/battery/BAT0 --> <arg name="stacks" value="$(optenv TURTLEBOT_STACKS hexagons)"/> <!-- circles, hexagons --> <!--<arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR kinect)"/> --> <!-- kinect, asus_xtion_pro --> <!--有修改--> <arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR hokuyo)"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="use_sim_time" value="true"/> <arg name="debug" value="false"/> <arg name="gui" value="$(arg gui)" /> <arg name="world_name" value="$(arg world_file)"/> </include> <include file="$(find turtlebot_gazebo)/launch/includes/$(arg base).launch.xml"> <arg name="base" value="$(arg base)"/> <arg name="stacks" value="$(arg stacks)"/> <arg name="3d_sensor" value="$(arg 3d_sensor)"/> </include> <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"> <param name="publish_frequency" type="double" value="30.0" /> </node> <!-- Fake laser --> <node pkg="nodelet" type="nodelet" name="laserscan_nodelet_manager" args="manager"/> <!--有修改--> <!--<node pkg="nodelet" type="nodelet" name="depthimage_to_laserscan" args="load depthimage_to_laserscan/DepthImageToLaserScanNodelet laserscan_nodelet_manager"> <param name="scan_height" value="10"/> <param name="output_frame_id" value="/camera_depth_frame"/> <param name="range_min" value="0.45"/> <remap from="image" to="/camera/depth/image_raw"/> <remap from="scan" to="/scan"/> </node>--> </launch>

2.2 新建kobuki_hexagons_hokuyo.urdf.xacro

由于<include file="$(find turtlebot_gazebo)/launch/includes/$(arg base).launch.xml">可知,turtlebot_world.launch调用了kobuki.launch.xml文件,寻找该文件,

find ~/ros_gazebo -name "kobuki.launch.xml

kobuki.launch.xml:(不用修改)

<launch> <arg name="base"/> <arg name="stacks"/> <arg name="3d_sensor"/> <arg name="urdf_file" default="$(find xacro)/xacro --inorder '$(find turtlebot_description)/robots/$(arg base)_$(arg stacks)_$(arg 3d_sensor).urdf.xacro'"/> <param name="robot_description" command="$(arg urdf_file)"/> <!-- Gazebo model spawner --> <node name="spawn_turtlebot_model" pkg="gazebo_ros" type="spawn_model" args="$(optenv ROBOT_INITIAL_POSE) -unpause -urdf -param robot_description -model mobile_base"/> <!-- Velocity muxer --> <node pkg="nodelet" type="nodelet" name="mobile_base_nodelet_manager" args="manager"/> <node pkg="nodelet" type="nodelet" name="cmd_vel_mux" args="load yocs_cmd_vel_mux/CmdVelMuxNodelet mobile_base_nodelet_manager"> <param name="yaml_cfg_file" value="$(find turtlebot_bringup)/param/mux.yaml"/> <remap from="cmd_vel_mux/output" to="mobile_base/commands/velocity"/> </node> <!-- Bumper/cliff to pointcloud (not working, as it needs sensors/core messages) --> <include file="$(find turtlebot_bringup)/launch/includes/kobuki/bumper2pc.launch.xml"/> </launch>

通过其中的两行代码可知,kobuki.launch.xml文件调用了参数文件:kobuki_hexagons_hokuyo.urdf.xacro(turtlebot_world.launch已经将kinetic改成了hokuyo)

<arg name="urdf_file" default="$(find xacro)/xacro --inorder '$(find turtlebot_description)/robots/$(arg base)_$(arg stacks)_$(arg 3d_sensor).urdf.xacro'"/> <param name="robot_description" command="$(arg urdf_file)"/>

找到kobuki_hexagons_kinect.urdf.xacro,

其路径为/home/jk/ros_gazebo/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_kinect.urdf.xacro,

在该路径下新建文件kobuki_hexagons_hokuyo.urdf.xacro,并复制

kobuki_hexagons_kinect.urdf.xacro代码进去,

kobuki_hexagons_hokuyo.urdf.xacro:

<?xml version="1.0"?> <!-- - Base : kobuki - Stacks : hexagons - 3d Sensor : kinect --> <robot name="turtlebot" xmlns:xacro="http://ros.org/wiki/xacro"> <!--修改<xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro" />--> <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_library.urdf.xacro" /> <xacro:include filename="$(find kobuki_description)/urdf/kobuki.urdf.xacro" /> <xacro:include filename="$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro"/> <!--增加--> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro"/> <kobuki/> <stack_hexagons parent="base_link"/> <sensor_kinect parent="base_link"/> </robot>

上述代码做了如下修改:

寻找turtlebot_common_library.urdf.xacro改成寻找turtlebot_library.urdf.xacro增加寻找hokuyo.urdf.xacro的代码

2.3 新建turtlebot_common_library.urdf.xacrohokuyo.urdf.xacro

2.3.1 turtlebot_common_library.urdf.xacro

cd ~ros_gazebo/src/turtlebot/turtlebot_description/urdf/ gedit turtlebot_library.urdf.xacro <?xml version="1.0"?> <!-- The complete turtlebot library of xacros for easy reference --> <robot xmlns:xacro="http://ros.org/wiki/xacro"> <!-- General --> <xacro:include filename="$(find turtlebot_description)/urdf/common_properties.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_properties.urdf.xacro"/> <!-- Bases --> <xacro:include filename="$(find create_description)/urdf/create.urdf.xacro"/> <xacro:include filename="$(find kobuki_description)/urdf/kobuki.urdf.xacro" /> <!-- Stacks --> <xacro:include filename="$(find turtlebot_description)/urdf/stacks/circles.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro"/> <!-- 3D Sensors --> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/asus_xtion_pro.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/asus_xtion_pro_offset.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/rplidar.urdf.xacro"/> <!--xacro:include filename="$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro"/--> <xacro:include filename="$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro"/> </robot>

2.3.2 hokuyo.urdf.xacro

cd ~/ros_gazebo/src/turtlebot/turtlebot_description/urdf/sensors/ gedit hokuyo.urdf.xacro <?xml version="1.0"?> <!-- script_version=1.1 --> <robot name="sensor_hokuyo" xmlns:xacro="http://ros.org/wiki/xacro"> <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_gazebo.urdf.xacro"/> <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_properties.urdf.xacro"/> <!-- RPLidar 2D LIDAR --> <xacro:macro name="sensor_hokuyo" params="parent"> <joint name="laser" type="fixed"> <origin xyz="0.10 0 0.435" rpy="0 0.0 0.0" /> <parent link="base_link" /> <child link="hokuyo_link" /> </joint> <!-- Hokuyo Laser --> <link name="hokuyo_link"> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <box size="0.1 0.1 0.1"/> </geometry> </collision> <visual> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://turtlebot_description/meshes/sensors/hokuyo.dae"/> </geometry> </visual> <inertial> <mass value="1e-5" /> <origin xyz="0 0 0" rpy="0 0 0"/> <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" /> </inertial> </link> <!-- Set up laser gazebo details --> <turtlebot_sim_2dsensor/> </xacro:macro> </robot>

下载hokuyo.dae:

<mesh filename="package://turtlebot_description/meshes/sensors/hokuyo.dae"/>

我们需要添加这个hokuyo.dae,可以先下载模型包,然后将文件拷贝过来

可以参考gazebo官方教程:http://gazebosim.org/tutorials/?tut=add_laser

cd ~/.gazebo/models wget -q -R *index.html*,*.tar.gz --no-parent -r -x -nH http://models.gazebosim.org/hokuyo/

将/home/jk/.gazebo/models/hokuyo/meshes下的两个文件拷贝到~/ros_gazebo/src.../turtlebot_description/meshes/sensors目录

cd ~/.gazebo/models/hokuyo/meshes/ cp hokuyo_convex.stl hokuyo.dae ~/ros_gazebo/src/turtlebot/turtlebot_description/urdf/sensors/

2.4 配置turtlebot_gazebo.urdf.xacro添加laser

cd ~/ros_gazebo/src/turtlebot/turtlebot_description/urdf/ gedit turtlebot_gazebo.urdf.xacro <?xml version="1.0"?> <robot name="turtlebot_gazebo" xmlns:xacro="http://ros.org/wiki/xacro"> <!-- Microsoft Kinect / ASUS Xtion PRO Live for simulation --> <xacro:macro name="turtlebot_sim_3dsensor"> <gazebo reference="camera_link"> <sensor type="depth" name="camera"> <always_on>true</always_on> <update_rate>20.0</update_rate> <camera> <horizontal_fov>${60.0*M_PI/180.0}</horizontal_fov> <image> <format>B8G8R8</format> <width>640</width> <height>480</height> </image> <clip> <near>0.05</near> <far>8.0</far> </clip> </camera> <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so"> <cameraName>camera</cameraName> <alwaysOn>true</alwaysOn> <updateRate>10</updateRate> <imageTopicName>rgb/image_raw</imageTopicName> <depthImageTopicName>depth/image_raw</depthImageTopicName> <pointCloudTopicName>depth/points</pointCloudTopicName> <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName> <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName> <frameName>camera_depth_optical_frame</frameName> <baseline>0.1</baseline> <distortion_k1>0.0</distortion_k1> <distortion_k2>0.0</distortion_k2> <distortion_k3>0.0</distortion_k3> <distortion_t1>0.0</distortion_t1> <distortion_t2>0.0</distortion_t2> <pointCloudCutoff>0.4</pointCloudCutoff> </plugin> </sensor> </gazebo> </xacro:macro> <!-- RPLidar LIDAR for simulation <xacro:macro name="rplidar_laser"> <gazebo reference="base_laser_link"> <sensor type="ray" name="laser"> <pose>0 0 0 0 0 0</pose> <visualize>false</visualize> <update_rate>5.5</update_rate> <ray> <scan> <horizontal> <samples>360</samples> <resolution>1</resolution> <min_angle>-3.1415926</min_angle> <max_angle>3.1415926</max_angle> </horizontal> </scan> <range> <min>0.10</min> <max>6.0</max> <resolution>0.01</resolution> </range> <noise> <type>Gaussian</type> <mean>0.0</mean> <stddev>0.01</stddev> </noise> </ray> <plugin name="rplidar_node" filename="libgazebo_ros_laser.so"> <topicName>/scan</topicName> <frameName>base_laser_link</frameName> </plugin> </sensor> </gazebo> </xacro:macro> --> <xacro:macro name="turtlebot_sim_2dsensor"> <gazebo reference="hokuyo_link"> <sensor type="ray" name="head_hokuyo_sensor"> <pose>0 0 0 0 0 0</pose> <visualize>false</visualize> <update_rate>40</update_rate> <ray> <scan> <horizontal> <samples>720</samples> <resolution>1</resolution> <min_angle>-1.570796</min_angle> <max_angle>1.570796</max_angle> </horizontal> </scan> <range> <min>0.10</min> <max>30.0</max> <resolution>0.01</resolution> </range> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.01</stddev> </noise> </ray> <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so"> <!--topicName>/turtlebot/laser/scan</topicName--> <topicName>scan</topicName> <frameName>hokuyo_link</frameName> </plugin> </sensor> </gazebo> </xacro:macro> </robot>

此处注意hokuyo_link部件名称和前边的hokuyo_link对应,才能仿真处实际传感器数据。此处数据发布在<topicName>/turtlebot/laser/scan</topicName>中的/turtlebot/laser/scan主题上。

修改环境变量

sudo vi .bashrc 

#在最后添加以下内容 #For gazebo  export  TURTLEBOT_BASE=kobuki export  TURTLEBOT_STACKS=hexagons export  TURTLEBOT_3D_SENSOR=hokuyo

之后运行,正常,激光有数据,话题/scan正常

检查kobuki_hexagons_hokuyo.urdf.xacro问题,以及运行一下代码(需要修改)

roslaunch turtlebot_gazebo explorer.launch roslaunch turtlebot_teleop keyboard_teleop.launch roslaunch turtlebot_gazebo gmapping_demo.launch roslaunch turtlebot_rviz_launchers view_navigation.launch

 

 

 

 

 

 

 

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-5028439.html

最新回复(0)