最近想在Gazebo中开发一些仿真内容,于是购买了古月学院的《如何在Gazebo中实现阿克曼转向车的仿真》课程,但是由于ROS 版本的更新,拿到手的课程资料不能直接在ROS Noetic版本中运行,经过我这几天的探索,对遇到的错误及解决方法进行了整理,方便后面购买课程的小伙伴更快的成功运行程序
在文章正式开始之前,先放一下我之前为了寻找该资料报错的原因,而写的两篇与该课程相关的文章链接,感兴趣的可以自行阅读
以阿克曼转向车为例对URDF和XACRO文件进行解读(点击可跳转)
将xacro格式文件转换为urdf格式并对其进行检查格式,并生成机器人模型的结构图(点击可跳转)
一、执行roslaunch bringup racecar_gazebo.launch指令时的错误及解决方法
在执行roslaunch bringup racecar_gazebo.launch指令时,会报以下错误
[platform_link] of joint [camera_joint] not found. This is not valid according to the URDF spec. Every link you refer to from a joint needs to be explicitly defined in the robot description. To fix this problem you can either remove this joint [camera_joint] from your urdf file, or add “” to your urdf file.
[robot_state_publisher-5] process has died [pid 17225, exit code 1, cmd /opt/ros/noetic/lib/robot_state_publisher/robot_state_publisher /joint_states:= /racecar/joint_states __name:=robot_state_publisher __log:=/home/jzx /.ros/log / c36c7514 -28da-11ec-9477-05 e88 1bcd2 be/robot_state_p ublisher-5.log].
log file: /hom e/jzx/.ros /log/c36c7514-28da -11ec-9477-05e 881bcd2 be/robot_st ate_publisher-5*.log
[ERROR] [1634112531.464757364]: Failed to build tree: child link [imu_link] of joint [imu_joint] not found[robot_state_publisher-5] process has died [pid 8989, exit code 1, cmd /opt/roseticb/robot_st ate_publisher/robot_state_publisher /join t_s tates:=/racecar/joint_states __name:=robot_state_publisher _l og:=/home/jzx/.ros/log/cc0d1be0-2bfc-11ec-8f3c- 4d8e4603 a785/robot_state publisher-5.log].log file : /home /jzx/.ros/log/cc0d1be0-2bfc-11ec8f3c-4d8e4603a785/robot_state_publisher-5*.log
…
…
等等一系列错误
要消除执行roslaunch bringup racecar_gazebo.launch指令时,所报的一系列错误,需要对几个XACRO文件进行修改,具体修改如下:
1、对racecar.urdf.xacro的修改
打开该文件,我用的Visual Studio Code打开的,拖到第420行,标签visual后面有个W,将这个W删去,估计是作者不经意间敲上的
将473、475、477、479行的layer前加上 xacro:
这是因为在ROS Noetic版本中即使是调用文件内部的宏,也需要在其前面加上xacro:
2、对imu.xacro的修改
打开该文件,我用的Visual Studio Code打开的,拖到第20行,将下图红框处的black,改为tire_mat
不改的话,会报一个警报,是因为在文件中并没有定义颜色black,而在racecar. urdf .xacro文件中,定义了颜色tire_mat(其实就是黑色的),所以在这里我们用其来代替未定义的black
将文件拖到最后,在下图红色框所示位置添加以下语句:
<xacro:imu prefix="imu"/>
在该文件中定义了宏imu,但是没有调用,需要通过以上语句来调用该宏,生成imu_link等结构
3、对lidar.xacro的修改
打开该文件,我用的Visual Studio Code打开的,拖到第20行,将下图红框处的black,改为tire_mat
不改的话,会报一个警报,是因为在文件中并没有定义颜色black,而在racecar. urdf .xacro文件中,定义了颜色tire_mat(其实就是黑色的),所以在这里我们用其来代替未定义的black
将文件拖到最后,在下图红色框所示位置添加以下语句:
<xacro:lidar prefix="laser"/>
在该文件中定义了宏lidar,但是没有调用,需要通过以上语句来调用该宏,生成laser_link等结构
到这里这几个XACRO文件就改完了,此时去运行语句roslaunch bringup racecar_gazebo.launch 就不会报错了,如果能够启动Gazebo,但是加载不出模型,那么需要在执行这条语句之前,先执行以下语句:
export SVGA_VGPU10=0
二、执行roslaunch bringup racecar_gazebo.launch指令时的错误及解决方法
在成功执行roslaunch bringup racecar_gazebo.launch指令之后,再执行roslaunch bringup racecar.launch指令时,会报以下错误:
(1)这其实是一类错误,Could not load controller…
以上错误是由于没有安装ros-noetic-effort-controllers导致的,需要运行以下指令进行安装
sudo apt-get install ros-noetic-effort-controllers
(2)除了上面的错误还有以下错误:/usr/bin/env: “python”: 没有那个文件或目录
导致以上错误的原因可能有两个,一是没有安装python3.8,可运行以下指令安装
sudo apt-get install python3.8
第二个原因是,你虽然装了但是没有设置软连接,依次输入以下指令进行设置
whereis python3.8
cd /usr/bin
ln -s /usr/bin/python3.8 python
解决完以上两个主要错误后,可能还会有个错误[servo_commands-7] process has died
这个错误可以先忽略,等我们启动后面的节点后,这个错误就自动消失了
三、执行rosrun racecar_description servo_commands.py指令时的错误及解决方法
执行rosrun racecar_description servo_commands.py指令时,会报以下错误:
执行以下指令,安装缺失的msgs,就可以了
sudo apt install ros-noetic-ackermann-msgs
四、执行rosrun racecar_description keyboard_teleop.py指令时的错误及解决方法
执行rosrun racecar_description keyboard_teleop.py指令时,会报以下错误:
这个错误是由于python版本的发展导致的语法差异,在python3中,使用print时需要加括号,根据错误里的路径提示,去找到这个文件并打开,按照提示,找到71行,将print ‘error’,改为print (‘error’),如下图所示:
到这里就可以使用键盘在rviz或者gazebo中去控制小车运动了,如下所示:
文章处于持续更新中…