1. 环境搭建
Ubuntu系统的安装在此不做介绍,网上一搜一箩筐。ROS Kinetic的安装直接参考
wiki
就行。CoppeliaSim 安装也比较简单,直接
官网下载
(以7月21日新鲜刚出炉的CoppeliaSim Edu V4.1.0 为例),具体版本根据用户而定,博主使用CoppeliaSim_Edu_V4_1_0_Ubuntu16_04,ROS Kinetic,如果嫌官网下载太慢或者想下载其他版本的话,可以使用博主分享的百度云链接:(注意区分系统)
-
CoppeliaSim_Edu_V4_2_0_Ubuntu16_04
提取码: i9c5 -
CoppeliaSim_Edu_V4_1_0_Ubuntu16_04
提取码: g9gi -
CoppeliaSim_Edu_V4_0_0_Ubuntu16_04
提取码: afqu -
V-REP_PRO_EDU_V3_6_2_Ubuntu16_04
提取码: x8u5 -
CoppeliaSim_Edu_V4_2_0_Ubuntu18_04
提取码:9s3o -
CoppeliaSim_Edu_V4_1_0_Ubuntu18_04
提取码: 2g3s -
CoppeliaSim_Edu_V4_0_0_Ubuntu18_04
提取码: 3s5f -
V-REP_PRO_EDU_V3_6_2_Ubuntu18_04
提取码: wci8 -
CoppeliaSim_Edu_V4_2_0_Ubuntu20_04
提取码: 9wg3 -
CoppeliaSim_Edu_V4_1_0_Ubuntu20_04
提取码: qdum -
CoppeliaSim_Edu_V4_2_0_macOS10_15
提取码: fuw4 -
CoppeliaSim_Edu_V4_1_0_Mac
提取码:pfqw
下载完成后执行指令
tar -xvf CoppeliaSim_Edu_V4_1_0_Ubuntu16_04.tar
解压,进入CoppeliaSim_Edu_V4_1_0_Ubuntu16_04文件夹下,即可运行
./coppeliaSim.sh
。
但此时CoppeliaSim并不能与ROS进行通信。需要搭建bridge,参考
CoppeliaRobotics Github
git clone --recursive https://github.com/CoppeliaRobotics/simExtROSInterface.git sim_ros_interface
下载simExtROSInterface 并重命名为 sim_ros_interface,下载位置与CoppeliaSim_Edu_V4_1_0_Ubuntu16_04放一个父文件夹下就行,相互之间也能有个照应,打架也能帮个忙。目录如下
# mkdir workspcace
mkdir -p sim_ws/src
# CoppeliaSim_Edu_V4_1_0_Ubuntu16_04_path 为CoppeliaSim_Edu_V4_1_0_Ubuntu16_04的下载路径 需要根据用户路径修改
cp CoppeliaSim_Edu_V4_1_0_Ubuntu16_04_path/CoppeliaSim_Edu_V4_1_0_Ubuntu16_04.tar ~/sim_ws/src
cd ~/sim_ws/src
# unzip CoppeliaSim
tar -xvf CoppeliaSim_Edu_V4_1_0_Ubuntu16_04.tar
# download sim_ros_interface -- bridge
git clone --recursive https://github.com/CoppeliaRobotics/simExtROSInterface.git sim_ros_interface
## 注意: 我电脑的环境大多依赖的python2,而从coppeliaSim V4.1.0的CMakeLists.txt中可知道其依赖的python3,coppeliaSim V4.0.0依赖的python2,所以在此我使用V4.0.0版本的sim_ros_interface,否则会报一堆类似于没有 rospkg的问题
cd sim_ros_interface
git checkout coppeliasim-v4.0.0
# change directory to sim_ws
cd ~/sim_ws
# compile
catkin build -j4
根据Errors信息需要添加环境变量
COPPELIASIM_ROOT_DIR
,系统默认使用的是bash shell,在
~/.bashrc
末尾添加
export COPPELIASIM_ROOT_DIR=/home/lyz/sim_ws/src/CoppeliaSim_Edu_V4_1_0_Ubuntu16_04/
(具体路径根据自己的CoppeliaSim路径而定)。确认环境变量添加成功
source ~/.bashrc
env | grep ROOT
>>> COPPELIASIM_ROOT_DIR=/home/lyz/sim_ws/src/CoppeliaSim_Edu_V4_1_0_Ubuntu16_04/
注意:
a. 编译错误一:有可能报ros依赖库的错误,直接安装即可。
sudo apt-get install ros-kinetic-brics-actuator
sudo apt-get install ros-kinetic-tf2-sensor-msgs
b. 编译错误二:有可能报compile error。 generate.py line102
runprogram('xsltproc', '-o', output('reference.html'), rel('xsl/reference.xsl'), input_xml)
的问题。
sudo apt-get install xsltproc
c. 编译错误三:CoppeliaSim V4.1.0依赖python3,如果系统用的python2会报无rospkg等问题。
可以使用V4.0.0的sim_ros_interface。
git checkout coppeliasim-v4.0.0
接下来重新编译
catkin build -j4
,编译完成后将
devel/lib
下的
libsimExtROSInterface.so
复制到
CoppeliaSim_Edu_V4_1_0_Ubuntu16_04
文件夹下,这样每次启动CoppeliaSim时都会自动导入*.so,导入的同时还会验证
ROS master
有没有启动,若没有启动日志中会包含如下错误。
[CoppeliaSim:error] plugin 'ROSInterface': load failed (failed initialization).
正常运行
roscore
,再运行CoppeliaSim,执行
rosnode list
会有如下显示
$ rosnode list
/rosout
/vrep_ros_interface
除此之外,ROS与CoppeliaSim连接也可直接参考官网
帮助文档
或者我的
翻译教程
。到这里ROS与CoppeliaSim之间的bridge基本配置完成,可以打开CoppeliaSim提供的ROS相关场景进行测试。
2. 基础测试
-
拿CoppeliaSim自带的ros场景
rosInterfaceTopicPublisherAndSubscriber.ttt
进行ros消息publish测试,打开scene之后直接点界面上的右三角或者用快捷键
Ctrl+Space
仿真运行。
出现了topic
/image
,使用命令
rosrun image_view image_view image:=/image
查看摄像头图像
测试由CoppeliaSim发布摄像头图像数据成功。
-
拿场景
controlledViaRos.ttt
测试CoppeliaSim端订阅ros topic并响应。(打开场景后需要注释rosInterfaceControlledBubbleRob脚本第20行
--result=sim.launchExecutable('rosBubbleRob2',leftMotorTopicName.." "..rightMotorTopicName.." "..sensorTopicName.." "..simulationTimeTopicName,0)
,否则BubbleRob会一直按照随机发布的左右轮速度运动)
左轮发布速度
rostopic pub /leftMotorSpeed2497435 std_msgs/Float32 "data: 1.0"
,BubbleRob开始以右轮为中心转圈。
至此Ubuntu上CoppeliaSim/ROS之间的topic发布和订阅均已经测试通过,接下来可以按照自己想法浪一把了。
3. 自定义消息/服务编译使用
- CoppeliaSim
创建自定义消息包test_msgs,消息名称为Notification.msg
catkin_create_pkg test_msgs roscpp rospy std_msgs message_generation
# Notification.msg
string messages
修改test_msgs包 CMakeLists.txt、package.xml。
## CMakeLists.txt 添加Notification.msg
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_message_files(
FILES
Notification.msg
# Message1.msg
# Message2.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
## package.xml 取消以下两行注释
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>
修改sim_ros_interface包CMakeLists.txt、package.xml、meta/messages.txt。
## CMakeLists.txt
set(PKG_DEPS
roscpp
rosconsole
cv_bridge
image_transport
tf
roslib
actionlib_msgs
control_msgs
diagnostic_msgs
geometry_msgs
map_msgs
nav_msgs
pcl_msgs
sensor_msgs
shape_msgs
std_msgs
tf2_geometry_msgs
tf2_msgs
tf2_sensor_msgs
trajectory_msgs
visualization_msgs
test_msgs # 自定义消息包
)
## package.xml
<package format="2">
<name>sim_ros_interface</name>
<description>CoppeliaSim plugin for ROS interface</description>
<maintainer email="marc@coppeliarobotics.com">Marc</maintainer>
<version>3.3.0</version>
<author>Federico Ferri</author>
<license>BSD2</license>
<url>http://www.coppeliarobotics.com</url>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<depend>rosmsg</depend>
<depend>libopencv-dev</depend>
<depend>cv_bridge</depend>
<depend>image_transport</depend>
<depend>tf</depend>
<depend>actionlib_msgs</depend>
<depend>control_msgs</depend>
<depend>diagnostic_msgs</depend>
<depend>geometry_msgs</depend>
<depend>map_msgs</depend>
<depend>nav_msgs</depend>
<depend>pcl_msgs</depend>
<depend>sensor_msgs</depend>
<depend>shape_msgs</depend>
<depend>std_msgs</depend>
<depend>tf2_geometry_msgs</depend>
<depend>tf2_msgs</depend>
<depend>tf2_sensor_msgs</depend>
<depend>trajectory_msgs</depend>
<depend>visualization_msgs</depend>
<depend>rosconsole</depend>
<depend>roslib</depend>
<depend>test_msgs</depend> <!--自定义消息包-->
</package>
## messages.txt 最后添加
test_msgs/Notification
catkin build -j4
编译两个包,然后拷贝lib
cp ~/sim_ws/devel/lib/libsimExtROSInterface.so ~/sim_ws/src/CoppeliaSim_Edu_V4_1_0_Ubuntu16_04
。
最后按正常顺序
roscore
./coppeliaSim.sh
启动。以 CoppeliaSim 软件自带的 controlledViaRos.ttt为例,测试发布自定义消息类型为test_msgs/Notification的话题 /notifications。
-- 注释中带新添加字样的为测试自定义消息类型添加
function sysCall_init()
robotHandle=sim.getObjectAssociatedWithScript(sim.handle_self)
leftMotor=sim.getObjectHandle("rosInterfaceControlledBubbleRobLeftMotor") -- Handle of the left motor
rightMotor=sim.getObjectHandle("rosInterfaceControlledBubbleRobRightMotor") -- Handle of the right motor
noseSensor=sim.getObjectHandle("rosInterfaceControlledBubbleRobSensingNose") -- Handle of the proximity sensor
-- Launch the ROS client application:
if simROS then
sim.addLog(sim.verbosity_scriptinfos,"ROS interface was found.")
local sysTime=sim.getSystemTimeInMs(-1)
local leftMotorTopicName='leftMotorSpeed'..sysTime -- we add a random component so that we can have several instances of this robot running
local rightMotorTopicName='rightMotorSpeed'..sysTime -- we add a random component so that we can have several instances of this robot running
local sensorTopicName='sensorTrigger'..sysTime -- we add a random component so that we can have several instances of this robot running
local simulationTimeTopicName='simTime'..sysTime -- we add a random component so that we can have several instances of this robot running
-- Prepare the sensor publisher and the motor speed subscribers:
sensorPub=simROS.advertise('/'..sensorTopicName,'std_msgs/Bool')
simTimePub=simROS.advertise('/'..simulationTimeTopicName,'std_msgs/Float32')
leftMotorSub=simROS.subscribe('/'..leftMotorTopicName,'std_msgs/Float32','setLeftMotorVelocity_cb')
rightMotorSub=simROS.subscribe('/'..rightMotorTopicName,'std_msgs/Float32','setRightMotorVelocity_cb')
notificationPub=simROS.advertise('/notifications', 'test_msgs/Notification') -- 新添加
-- Now we start the client application:
result=sim.launchExecutable('rosBubbleRob',leftMotorTopicName.." "..rightMotorTopicName.." "..sensorTopicName.." "..simulationTimeTopicName,0)
else
sim.addLog(sim.verbosity_scripterrors,"ROS interface was not found. Cannot run.")
end
end
function setLeftMotorVelocity_cb(msg)
-- Left motor speed subscriber callback
sim.setJointTargetVelocity(leftMotor,msg.data)
end
function setRightMotorVelocity_cb(msg)
-- Right motor speed subscriber callback
sim.setJointTargetVelocity(rightMotor,msg.data)
end
function getTransformStamped(objHandle,name,relTo,relToName)
t=sim.getSystemTime()
p=sim.getObjectPosition(objHandle,relTo)
o=sim.getObjectQuaternion(objHandle,relTo)
return {
header={
stamp=t,
frame_id=relToName
},
child_frame_id=name,
transform={
translation={x=p[1],y=p[2],z=p[3]},
rotation={x=o[1],y=o[2],z=o[3],w=o[4]}
}
}
end
function sysCall_actuation()
-- Send an updated sensor and simulation time message, and send the transform of the robot:
if simROS then
local result=sim.readProximitySensor(noseSensor)
local detectionTrigger={}
detectionTrigger['data']=result>0
simROS.publish(sensorPub,detectionTrigger)
simROS.publish(simTimePub,{data=sim.getSimulationTime()})
-- Send the robot's transform:
simROS.sendTransform(getTransformStamped(robotHandle,'rosInterfaceControlledBubbleRob',-1,'world'))
-- To send several transforms at once, use simROS.sendTransforms instead
local robot_notification={} -- 新添加
robot_notification['messages'] = 'ok' -- 新添加
simROS.publish(notificationPub, robot_notification) -- 新添加
end
end
function sysCall_cleanup()
if simROS then
-- Following not really needed in a simulation script (i.e. automatically shut down at simulation end):
simROS.shutdownPublisher(sensorPub)
simROS.shutdownSubscriber(leftMotorSub)
simROS.shutdownSubscriber(rightMotorSub)
simROS.shutdownPublisher(notificationPub) -- 新添加
end
end
source ~/sim_ws/devel/setup.bash
rostopic echo /notifications 打印话题
打印topic有信息证明自定义消息添加成功。
-
V-REP 3.6
与CoppeliaSim步骤一样,不过修改的软件包不是sim_ros_interface,而是vrep_ros_interface。
-
V-REP 3.4
-
cp
V-rep directory
/programming/ros_packages/v_repExtRosInterface 和自定义消息包到工作空间,修改v_repExtRosInterface 文件夹package.xml、CMakeLists.txt 和meta/messages.txt; -
messages.txt添加新消息,如
test_msgs/Notification
; -
package.xml添加
<build_depend>test_msgs</build_depend> <run_depend>test_msgs</run_depend>
; - CMakeLists.txt添加
-
cp
find_package(catkin REQUIRED COMPONENTS
roscpp rosmsg image_transport tf cv_bridge test_msgs
)
catkin_package(
CATKIN_DEPENDS test_msgs)
编译完成之后,将devel/lib/*.so复制到V-rep,覆盖以前的*.so。
注意:
V-rep 3.4不存在单独的vrep_ros_interface包,它是将其集成在V-rep文件夹中,主要在
programming/ros_packages
下,所以针对ros做的操作包括新消息类型、服务类型的添加都在此。
至此仿真环境与ROS的bridge搭建、测试基本完成,接下来进行仿真环境和小车模型的搭建。