前言
今天推出了官方的仿真文件,我也参与了部分仿真模型的设计,提供一个简单的参考思路。
模型下载地址
https://pan.baidu.com/s/1TFBTbCeyQMuKnxemCbyNSw 提取码: crm5
安装依赖工具
sudo apt-get install ros-kinetic-controller-manager
sudo apt-get install ros-kinetic-gazebo-ros-control
sudo apt-get install ros-kinetic-effort-controllers
sudo apt-get install ros-kinetic-joint-state-controller
sudo apt-get install ros-kinetic-driver-base
sudo apt-get install ros-kinetic-rtabmap-ros
sudo apt-get install ros-kinetic-ackermann-msgs
sudo apt-get install ros-kinetic-teb-local-planner
如果gazebo打开仿真出现cmd134字眼是gazebo版本太低的原因从7.0.0升级到7.16.0即可!!!
模型使用说明
首先创建工作区间:
mkdir -p smartcar_ws/src
初始化工作区间
cd ~/smartcar_ws/src
catkin_init_workspace
然后导入仿真文件,将百度云下载的压缩文件解压,将其中的racecar_description.7z文件复制到smartcar_ws/src下并提取(如下图):
将压缩文件中的smartcar_plane.7z文件提取到.gazebo下的models下,具体操作如下:
- 在home目录下ctrl + h显示隐藏文件
- 找到.gazebo文件
- 进入文件中的models文件夹(如果没有就自己创建一个)
- 将smartcar_plane.7z解压到models下 在racecar_description文件夹下创建worlds文件夹,然后把百度网盘的world文件放到下面: 修改一下launch文件夹中的racecar.launch文件: 编译工程:
cd ~/smartcar_ws
catkin_make
使能环境变量:
echo "source ~/smartcar_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
启动仿真环境:
roslaunch racecar_description racecar.launch
启动rviz和gazebo:
roslaunch racecar_description racecar_rviz.launch
仿真任务提示
因为涉及比赛我就不详细讲解怎么配置完整的项目,做一些提示:
- 首先车不能动,需要配置运动控制器,参考我的项目:https://github.com/xmy0916/racecar中racecar_control文件夹配置运动控制器
- 官方仿真没有配置gmapping那些,可以参考我的项目里面racecar_gazebo下的congig文件配置
- 上述配置完成后可以直接使用teb运动规划的速度和方向。
- 也可以参考我写的path_pursuit.py代码完成纯路径追踪,这个算法有缺陷我没有订阅局部路径规划的话题所以只能巡线不能避障。代码在racecar_gazebo下的srcipts下。
关于运动控制的配置
其实车模已经配置好了关节,要做的就是写关节的控制器,关节控制器代码在racecar车模里就一个yml文件,内容如下:
racecar:
# Publish all joint states -----------------------------------
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
# Velocity Controllers ---------------------------------------
left_rear_wheel_velocity_controller:
type: effort_controllers/JointVelocityController
joint: left_rear_wheel_joint
pid: {p: 1.0, i: 0.0, d: 0.0, i_clamp: 0.0}
right_rear_wheel_velocity_controller:
type: effort_controllers/JointVelocityController
joint: right_rear_wheel_joint
pid: {p: 1.0, i: 0.0, d: 0.0, i_clamp: 0.0}
left_front_wheel_velocity_controller:
type: effort_controllers/JointVelocityController
joint: left_front_wheel_joint
pid: {p: 0.5, i: 0.0, d: 0.0, i_clamp: 0.0}
right_front_wheel_velocity_controller:
type: effort_controllers/JointVelocityController
joint: right_front_wheel_joint
pid: {p: 0.5, i: 0.0, d: 0.0, i_clamp: 0.0}
# Position Controllers ---------------------------------------
left_steering_hinge_position_controller:
joint: left_steering_hinge_joint
type: effort_controllers/JointPositionController
pid: {p: 10.0, i: 0.0, d: 0.5}
right_steering_hinge_position_controller:
joint: right_steering_hinge_joint
type: effort_controllers/JointPositionController
pid: {p: 10.0, i: 0.0, d: 0.5}
还不明白嘛?Velocity Controllers部分控制转速的pid以及关节定义,Position Controllers部分配置转向关节的pid以及关节定义,对照官方的车模改个对应的关节名字不就完事了~ 其实想要发现哪里需要修改配置,研究对应的启动文件即可:
<?xml version='1.0'?>
<launch>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find racecar_control)/config/racecar_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_manager" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/racecar" args="left_rear_wheel_velocity_controller right_rear_wheel_velocity_controller
left_front_wheel_velocity_controller right_front_wheel_velocity_controller
left_steering_hinge_position_controller right_steering_hinge_position_controller
joint_state_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen">
<remap from="/joint_states" to="/racecar/joint_states" />
</node>
<!-- servo node -->
<node pkg="racecar_control" type="servo_commands.py" name="servo_commands" output="screen">
<remap from="/racecar/ackermann_cmd_mux/output" to="/vesc/low_level/ackermann_cmd_mux/output"/>
</node>
<!-- Allow for Gazebo to broadcast odom -->
<node pkg="racecar_gazebo" name="gazebo_odometry_node" type="gazebo_odometry.py"/>
</launch>
这里面这一段代码就提示了修改racecar_control.yaml文件嘛:
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find racecar_control)/config/racecar_control.yaml" command="load"/>
<node name="controller_manager" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/racecar" args="left_rear_wheel_velocity_controller right_rear_wheel_velocity_controller
left_front_wheel_velocity_controller right_front_wheel_velocity_controller
left_steering_hinge_position_controller right_steering_hinge_position_controller
joint_state_controller"/>
接下来你应该知道还有啥要修改的了!仔细阅读源码~
享受比赛~
附件:关于添加锥桶
gazebo是可以直接打开world文件的,命令格式:
gazebo ***.world
官方提供的场地目前没加锥桶,我们可以自己添加,首先下载gazebo的模型:
链接:http://pan.baidu.com/s/1pKaeg0F 密码:cmxc (来自rosclub.cn)
或是下载https://bitbucket.org/osrf/gazebo_models/downloads/ (ExBot ROS专区,网友提醒)
下载后找到官方的场地world文件,进入那个文件夹:
gazebo racetrack.world
点击左上角insert插入锥桶:
插入后保存新的world文件,点击左上角:
选择save world as替换官方的world即可: