8月25号从杭州回到学校了,前一天晚上喝多了,夜里果然吐了。早上实在是不想动,索性改签到了下午。到学校已经7点1刻了。真是艰难的一天 = =
最近一直在做仿真,做的有点腻了。赶紧弄完做视觉吧,我想早点深入到算法
工作时间: 2019.08.26-2019.08.29
工作内容:
一. urdf模型
之前建立的URDF一直会有漂移的毛病,周一重新建立了一遍,有所改善,但是问题仍然存在。猜测与各个link的质量以及转动惯量相关,但是苦于找不到一个刚刚好合适的值,不知道该怎么弄了。
待解决!!!
二. 地图搭建
在gazebo中如何建立一个有特殊图案的地面?
之前尝试用model edit这个选项卡自己画,但是总是遇到无法改变颜色的BUG,好在网上有大佬给出了教程:
如何用一张特定的图片搭建world?
这里总结如下:
- 建立文件夹
mkdir ~/.gazebo/models/my_ground_plane
mdkir -p ~/.gazebo/models/my_ground_plane/materials/textures
mdkir -p ~/.gazebo/models/my_ground_plane/materials/scripts
- 建立material文件
gedit ~/.gazebo/models/my_ground_plane/materials/scripts/my_ground_plane.material
内容:
material MyGroundPlane/Image
{
technique
{
pass
{
ambient 1 1 1 1.000000
diffuse 1 1 1 1.000000
specular 0.03 0.03 0.03 1.000000
texture_unit
{
texture MyImage.png
}
}
}
}
- 复制图片至~/.gazebo/models/my_ground_plane/materials/textures/MyImage.png
也可以是其他格式,例如 .jepg - Create a
~/.gazebo/models/my_ground_plane/model.sdf
file with the following contents
注意: 图片的大小可以由下面的size属性修改,单位为m
<?xml version="1.0" encoding="UTF-8"?>
<sdf version="1.4">
<model name="my_ground_plane">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
<surface>
<friction>
<ode>
<mu>100</mu>
<mu2>50</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="visual">
<cast_shadows>false</cast_shadows>
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
<material>
<script>
<uri>model://my_ground_plane/materials/scripts</uri>
<uri>model://my_ground_plane/materials/textures/</uri>
<name>MyGroundPlane/Image</name>
</script>
</material>
</visual>
</link>
</model>
</sdf>
- Create a
~/.gazebo/models/my_ground_plane/model.config
file with the following contents
<?xml version="1.0" encoding="UTF-8"?>
<model>
<name>My Ground Plane</name>
<version>1.0</version>
<sdf version="1.4">model.sdf</sdf>
<description>My textured ground plane.</description>
</model>
- 打开gazebo将my_ground_plane加上去。如果发现一直晃动,将原来的ground_plane delete即可
我做出来的效果如图所示,是一个棋盘:
这么做出后每次都需要加载一次,并且无法指定位置,有点麻烦。我们将它加进launch中:
先保存为world文件,然后在launch 文件中添加:
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find your_packge)/worlds/qipan.world"/>
<arg name="gui" value="$(arg gui)"/>
<arg name="debug" value="$(arg debug)"/>
</include>
三. 在gazebo中加入多个机器人模型
好困~先睡了,明天再弄
并且思考一个问题: 每台机器人都要打开一个slam节点吗?(例如gamapping cartographer等)
步骤如下:
- 将urdf改写为xacro。加上xacro声明即可。如:
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="caot">
- 改写launch文件
<group ns="shuai">
<param name="robot_description"
command="$(find xacro)/xacro
$(find caot)/urdf/shuai.urdf.xacro ns:=shuai"
/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model shuai -param robot_description -x 0"/>
</group>
被group标签包围的节点,话题,参数,服务,都会在前面加入<命名空间>的前缀
如: /shuai/joint_state_publisher
我的launch最终如下,可以在一个棋盘地面上加载两个机器人:
<?xml version="1.0"?>
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="extra_gazebo_args" default=""/>
<arg name="gui" default="true"/>
<arg name="debug" default="false"/>
<arg name="physics" default="ode"/>
<arg name="verbose" default="true"/>
<arg name="world" default="gazebo_ros_range"/>
<!-- set use_sim_time flag -->
<group if="$(arg use_sim_time)">
<param name="/use_sim_time" value="true" />
</group>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find caot)/worlds/qipan.world"/>
<arg name="gui" value="$(arg gui)"/>
<arg name="debug" value="$(arg debug)"/>
</include>
<!--include file="$(find caot)/launch/gazebo.launch">
</include-->
<!--param name="robot_description" command="$(find caot)/urdf/caot.urdf" /-->
<!--node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-file $(find caot)/urdf/caot.urdf -urdf -model caot"/-->
<!--node
name="spawn_model"
pkg="gazebo_ros"
type="spawn_model"
args="-file $(find caot)/urdf/caot.urdf -urdf -model caot"
output="screen" /-->
<group ns="ma">
<param name="robot_description"
command="$(find xacro)/xacro
$(find caot)/urdf/ma.xacro ns:=ma"
/>
<!--remap from="/cmd_vel" to="/macmd_vel" /-->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model ma -param robot_description -x 10"/>
</group>
<group ns="shuai">
<param name="robot_description"
command="$(find xacro)/xacro
$(find caot)/urdf/shuai.urdf.xacro ns:=shuai"
/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model shuai -param robot_description -x 0"/>
</group>
</launch>