学习古月老师的ROS探索总结(六)使用smartcar进行仿真和键盘控制时遇到几处运行出错,查找了许多博客最后解决。
我使用的是Ubuntu16.04 + ROS Kinect。
按照博客里所说,先创建三个xacro文件。
然后是launch文件,这里如果跟原文一样的话我的版本运行不了,我在(六)这篇博客的评论里找到了一个解决办法。
如这位朋友所述,只需要把最后一行的urdf.vcg改为urdf.rviz,再把arbotix节点处的type = “driver.py” 改为 “arbotix_driver”,至于smartcar_arbotix.yaml,我们在~SmartCar/src/smartcar_description/config文件夹下创建,把以下语句复制进去:
port: /dev/ttyUSB0
baud: 115200
rate: 20
sync_write: True
sync_read: True
read_rate: 20
write_rate: 20
controllers: {
# Pololu motors: 1856 cpr = 0.3888105m travel = 4773 ticks per meter (empirical: 4100)
base_controller: {type: diff_controller, base_frame_id: base_link, base_width: 0.26, ticks_meter: 4100, Kp: 12, Kd: 12, Ki: 0, Ko: 50, accel_limit: 1.0 }
}
然后运行,又惊喜的报错说没有arbotix_ros包,然后使用sudo apt-get install ros-kinetic-arbotix*也无法安装,很无奈。
在网上找到的方法,为了方便把这个包直接装在当前ros工作区。
cd ~/SmartCar/src
git clone https://github.com/vanadiumlabs/arbotix_ros.git
cd ..
catkin_make
再次尝试roslaunch smartcar_description smartcar_display.rviz.launch 终于成功。
接下来继续学习键盘控制,在~/SmartCar/src创建了一个新的package叫做smartcar_teleop,此时src里已经包括了三个包,分别是arbotix_ros、smartcar_description、smartcar_teleop,然后按照博客中的代码创建一个cpp文件,一个py文件,这两个都可以实现键盘控制。
我们知道,C++是需要先编译生成可执行文件才能运行的语言,python是在运行过程翻译成可执行语句的,为了编译cpp文件,需要修改CMakeLists.txt文件,当然指的是smartcar_teleop这个包内的,原博客说将以下三句添加至文件底部:
rosbuild_add_boost_directories()
rosbuild_add_executable(smartcar_keyboard_teleop src/keyboard.cpp)
target_link_libraries(smartcar_keyboard_teleop boost_thread)
可是我编译却显示undefined reference to symbol XXX
尝试了添加这些在CMakeLists.txt中,
set(LIBS
${PROJECT_SOURCE_DIR}/../../../lib/libboost_filesystem.so
${PROJECT_SOURCE_DIR}/../../../lib/libboost_system.so
-lboost_system
)
都不起作用,最后意外看到一篇博客提到在target_link_libraries中添加boost_system和boost_filesystem,尝试了一下成功了。
具体操作是把添加在文件底部的第三行代码改成
target_link_libraries(smartcar_keyboard_teleop boost_thread boost_system boost_filesystem)
然后我们进入工作区使用rosmake smartcar_teleop编译,成功的话会在smartcar_teleop包的bin文件夹看到一个可执行文件smartcar_keyboard_teleop,这个就是我们用来rosrun的nodename。具体操作:
1、打开一个终端
cd SmartCar
roslaunch smartcar_description smartcar_display.rviz.launch
出现rviz界面
2、打开新的终端
cd SmartCar
rosrun smartcar_teleop smartcar_keyboard_teleop
3、选中第二个终端,然后wasd控制小车,按住shift使用WASD可以跑得更快
假如我们建立teleop包的时候使用
catkin_create_pkg smartcar_teleop rospy geometry_msgs std_msgs roscpp
我们在CMakeLists.txt底部添加
add_executable(smartcar_keyboard_teleop src/keyboard.cpp)
target_link_libraries(smartcar_keyboard_teleop boost_thread ${catkin_LIBRARIES})
然后进入工作区,使用catkin_make进行编译,同样可以成功。
现在C++程序已经可以实现键盘控制了,那再试一试python程序,由于不需要编译所以直接把.py文件建好即可运行,具体操作:
1、打开一个终端
cd SmartCar
roslaunch smartcar_description smartcar_display.rviz.launch
出现rviz界面
2、打开新的终端
cd SmartCar
rosrun smartcar_teleop teleop.py
3、选中第二个终端,然后wasd控制小车,按住shift使用WASD可以跑得更快,使用Caps Lock切换大小写也可。
有时候会出现py文件没法执行的错误,一般来说是执行权限的问题,在py文件所在的位置打开终端,chmod +x XXX.py即可。