參考視頻:【奧特學園】ROS機器人入門課程《ROS理論與實踐》零基礎教程_嗶哩嗶哩_bilibili
參考文檔:http://www.autolabor.com.cn/book/ROSTutorials/
一、攝像頭信息仿真以及顯示
通過 Gazebo 模擬攝像頭傳感器,並在 Rviz 中顯示攝像頭數據。
實現流程:
攝像頭仿真基本流程:
-
已經創建完畢的機器人模型,編寫一個單獨的 xacro 文件,為機器人模型添加攝像頭配置;
-
將此文件集成進xacro文件;
-
啟動 Gazebo,使用 Rviz 顯示攝像頭信息。
1.Gazebo 仿真攝像頭
1.1 新建 Xacro 文件,配置攝像頭傳感器信息
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro"> <!-- 被引用的link --> <gazebo reference="camera"> <!-- 類型設置為 camara --> <sensor type="camera" name="camera_node"> <update_rate>30.0</update_rate> <!-- 更新頻率 --> <!-- 攝像頭基本信息設置 --> <camera name="head"> <horizontal_fov>1.3962634</horizontal_fov> <image> <width>1280</width> <height>720</height> <format>R8G8B8</format> </image> <clip> <near>0.02</near> <far>300</far> </clip> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.007</stddev> </noise> </camera> <!-- 核心插件 --> <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so"> <alwaysOn>true</alwaysOn> <updateRate>0.0</updateRate> <cameraName>/camera</cameraName> <imageTopicName>image_raw</imageTopicName> <cameraInfoTopicName>camera_info</cameraInfoTopicName> <frameName>camera</frameName> <hackBaseline>0.07</hackBaseline> <distortionK1>0.0</distortionK1> <distortionK2>0.0</distortionK2> <distortionK3>0.0</distortionK3> <distortionT1>0.0</distortionT1> <distortionT2>0.0</distortionT2> </plugin> </sensor> </gazebo> </robot>
1.2 xacro 文件集成
將步驟1的 Xacro 文件集成進總的機器人模型文件,代碼示例如下:
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!--包含慣性矩陣文件--> <xacro:include filename="head.xacro" /> <!--包含底盤、攝像頭與雷達的 xacro 文件--> <xacro:include filename="demo05_car_base.urdf.xacro" /> <xacro:include filename="demo06_car_camera.urdf.xacro" /> <xacro:include filename="demo07_car_laser.urdf.xacro" /> <!--運動控制--> <xacro:include filename="gazebo/move.xacro" /> <!--雷達--> <xacro:include filename="gazebo/laser.xacro" /> <!--攝像頭--> <xacro:include filename="gazebo/camera.xacro" /> </robot>
1.3啟動仿真環境
啟動 gazebo
cys@ubuntu:~/demo05_ws$ source ./devel/setup.bash
cys@ubuntu:~/demo05_ws$ roslaunch urdf02_gazebo demo03_env.launch
cys@ubuntu:~/demo05_ws$ source ./devel/setup.bash
cys@ubuntu:~/demo05_ws$ roslaunch urdf02_gazebo demo04_sensor.launch
2.Rviz 顯示攝像頭數據
執行 gazebo 並啟動 Rviz,在 Rviz 中添加攝像頭組件。
打開新的命令行,更改角速度,轉動攝像頭
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"
二、kinect信息仿真以及顯示
通過 Gazebo 模擬kinect攝像頭,並在 Rviz 中顯示kinect攝像頭數據。
實現流程:
kinect攝像頭仿真基本流程:
-
已經創建完畢的機器人模型,編寫一個單獨的 xacro 文件,為機器人模型添加kinect攝像頭配置;
-
將此文件集成進xacro文件;
-
啟動 Gazebo,使用 Rviz 顯示kinect攝像頭信息。
1.Gazebo仿真Kinect
1.1 新建 Xacro 文件,配置 kinetic傳感器信息
這里,用機器小車 support 作為 kinect link名稱
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
<gazebo reference="kinect link名稱">
<sensor type="depth" name="camera">
<always_on>true</always_on>
<update_rate>20.0</update_rate>
<camera>
<horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
<image>
<format>R8G8B8</format>
<width>640</width>
<height>480</height>
</image>
<clip>
<near>0.05</near>
<far>8.0</far>
</clip>
</camera>
<plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
<cameraName>camera</cameraName>
<alwaysOn>true</alwaysOn>
<updateRate>10</updateRate>
<imageTopicName>rgb/image_raw</imageTopicName>
<depthImageTopicName>depth/image_raw</depthImageTopicName>
<pointCloudTopicName>depth/points</pointCloudTopicName>
<cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
<depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
<frameName>kinect link名稱</frameName>
<baseline>0.1</baseline>
<distortion_k1>0.0</distortion_k1>
<distortion_k2>0.0</distortion_k2>
<distortion_k3>0.0</distortion_k3>
<distortion_t1>0.0</distortion_t1>
<distortion_t2>0.0</distortion_t2>
<pointCloudCutoff>0.4</pointCloudCutoff>
</plugin>
</sensor>
</gazebo>
</robot>
1.2 xacro 文件集成
將步驟1的 Xacro 文件集成進總的機器人模型文件,代碼示例如下:
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!--包含慣性矩陣文件--> <xacro:include filename="head.xacro" /> <!--包含底盤、攝像頭與雷達的 xacro 文件--> <xacro:include filename="demo05_car_base.urdf.xacro" /> <xacro:include filename="demo06_car_camera.urdf.xacro" /> <xacro:include filename="demo07_car_laser.urdf.xacro" /> <!--運動控制--> <xacro:include filename="gazebo/move.xacro" /> <!--雷達--> <xacro:include filename="gazebo/laser.xacro" /> <!--攝像頭--> <xacro:include filename="gazebo/camera.xacro" /> <!--kinect--> <xacro:include filename="gazebo/kinect.xacro" /> </robot>
1.3啟動仿真環境
啟動 gazebo
cys@ubuntu:~/demo05_ws$ source ./devel/setup.bash
cys@ubuntu:~/demo05_ws$ roslaunch urdf02_gazebo demo03_env.launch
cys@ubuntu:~/demo05_ws$ source ./devel/setup.bash
cys@ubuntu:~/demo05_ws$ roslaunch urdf02_gazebo demo04_sensor.launch
2 Rviz 顯示 Kinect 數據
啟動 rviz,添加攝像頭組件查看數據
讓攝像頭轉動
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"
補充:kinect 點雲數據顯示
在kinect中也可以以點雲的方式顯示感知周圍環境,在 rviz 中操作如下:
問題:在rviz中顯示時錯位。
原因:在kinect中圖像數據與點雲數據使用了兩套坐標系統,且兩套坐標系統位姿並不一致。
解決:
1.在插件中為kinect設置坐標系,修改配置文件的<frameName>
標簽內容:
<frameName>support_depth</frameName>
2.發布新設置的坐標系到kinect連桿的坐標變換關系,在啟動rviz的launch中,添加:
<node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_depth" />
3.啟動rviz,重新顯示。