一、参考网上资料,在ROS中完成一个机器小车的模型创建,传感器配置,仿真环境的设置,并控制机器小车进行运动;
1.创建小车模型
首先,我们需要创建一个URDF文件来描述机器小车的模型。以下是一个简单的机器小车模型的URDF文件示例:
<?xml version="1.0"?> <?xml version="1.0"?><?xml version="1.0"?>
<robot name="car">
<link name="base_link">
<inertial>
<mass value="1"/>
<inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/>
</inertial>
<visual>
<geometry>
<box size="0.5 0.3 0.2"/>
</geometry>
</visual>
<collision>
<geometry>
<box size="0.5 0.3 0.2"/>
</geometry>
</collision>
</link>
<joint name="base_to_wheel1" type="continuous">
<parent link="base_link"/>
<child link="wheel1"/>
<origin xyz="0.25 0.15 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
<link name="wheel1">
<inertial>
<mass value="0.1"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
</visual>
<collision>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
</collision>
</link>
<joint name="base_to_wheel2" type="continuous">
<parent link="base_link"/>
<child link="wheel2"/>
<origin xyz="-0.25 0.15 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
<link name="wheel2">
<inertial>
<mass value="0.1"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
</visual>
<collision>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
</collision>
</link>
</robot>
将上述内容保存为car.urdf
文件
2.配置传感器
在这个例子中不需要额外的传感器。若需要添加传感器,例如激光雷达或摄像头,可以在URDF文件中添加相应的传感器模型。
3.设置仿真环境
在ROS中,我们可以使用Gazebo作为仿真环境。首先,确保你已经安装了Gazebo和ROS。然后,创建一个名为model.sdf
的文件,其中包含以下内容:
<?xml version="1.0"?>
<sdf version="1.6">
<world name="default">
<include>
<uri>model://car</uri>
</include>
</world>
</sdf>
将上述内容保存为model.sdf
文件。
接下来,运行以下命令启动Gazebo仿真环境:
roslaunch gazebo_ros empty_world.launch world_name:=$(rospack find your_package)/path/to/model.sdf
4.控制小车进行运动
为了控制机器小车进行运动,我们需要编写一个ROS节点。以下是一个简单的Python脚本,用于发布速度命令:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
from geometry_msgs.msg import Twist
def talker():
pub = rospy.Publisher('cmd_vel', Twist, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
msg = Twist()
msg.linear.x = 0.5 # 前进速度
msg.angular.z = 0.1 # 旋转速度
pub.publish(msg)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
将上述内容保存为car_controller.py
文件。确保文件具有可执行权限,并在终端中运行它:
chmod +x car_controller.py
rosrun your_package car_controller.py
现在,你应该能看到机器小车在Gazebo仿真环境中根据速度命令进行运动。
二、参考课件资料,在ROS中利用ROS工具完成你手机广角津贴(畸变较为严重)的标定,写出详细过程和输出结果。
在ROS中完成手机广角摄像头的标定,可以使用ROS工具包camera_calibration
。以下是详细的标定过程和输出结果:
- 准备标定板
首先,需要准备一个标定板,例如棋盘格。确保标定板上有清晰的格子图案,以便在图像中检测到。
- 拍摄标定图片
将手机广角摄像头对准标定板,在不同角度和位置拍摄多张图片。确保每张图片都包含完整的标定板。将这些图片保存到计算机上。
- 准备相机参数文件
创建一个名为camera_info.launch
的文件,其中包含以下内容:
<launch>
<node name="camera_info_publisher" pkg="camera_info_publisher" type="camera_info_publisher" output="screen">
<param name="camera_name" value="wide_angle_camera" />
<param name="camera_info_url" value="package://your_package/config/wide_angle_camera.yaml" />
</node>
</launch>
将your_package
替换为你的ROS包名称。同时,创建一个名为wide_angle_camera.yaml
的文件,其中包含以下内容:
image_width: 640
image_height: 480
camera_name: wide_angle_camera
camera_matrix:
rows: 3
cols: 3
data: [fx, 0, cx, 0, fy, cy, 0, 0, 1]
distortion_model: radial-tangential
distortion_coefficients:
rows: 1
cols: 5
data: [k1, k2, p1, p2, k3]
rectification_matrix:
rows: 3
cols: 3
data: [r11, r12, r13, r21, r22, r23, r31, r32, r33]
projection_matrix:
rows: 3
cols: 4
data: [p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34]
将fx
, fy
, cx
, cy
, k1
, k2
, p1
, p2
, k3
, r11
, r12
, r13
, r21
, r22
, r23
, r31
, r32
, r33
, p11
, p12
, p13
, p14
, p21
, p22
, p23
, p24
, p31
, p32
, p33
, p34
替换为实际的相机参数。
- 运行标定程序
在终端中运行以下命令启动标定程序:
roslaunch your_package camera_info.launch
将your_package
替换为你的ROS包名称。
- 运行标定节点
在另一个终端中运行以下命令启动标定节点:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.025 image:=/wide_angle_camera/image_raw camera:=wide_angle_camera
将your_package
替换为你的ROS包名称。
- 选择标定图片
在弹出的窗口中,选择之前拍摄的标定图片。确保所有图片都被选中。
- 开始标定
点击“Calibrate”按钮开始标定过程。标定完成后,会生成一个名为ost.yaml
的文件,其中包含标定结果。
- 更新相机参数文件
将ost.yaml
中的参数复制到wide_angle_camera.yaml
文件中,替换原来的参数。
- 测试标定结果
运行以下命令启动相机节点:
roslaunch your_package camera_info.launch
将your_package
替换为你的ROS包名称。然后,使用RViz或其他可视化工具查看相机图像。如果图像显示正常,说明标定成功。
三、在ROS下,下载编译orbslam2代码,并在kitti数据集的一个序列图像中进行实验。
1.首先确保已经安装了ROS(Robot Operating System),如果没有安装,请参考ROS官方文档进行安装。
2.安装依赖项:
打开终端,输入以下命令安装依赖项:
sudo apt-get install ros-<your_ros_version>-cv-bridge ros-<your_ros_version>-image-transport ros-<your_ros_version>-tf ros-<your_ros_version>-message-filters ros-<your_ros_version>-geometry-msgs ros-<your_ros_version>-sensor-msgs ros-<your_ros_version>-camera-info-manager ros-<your_ros_version>-nodelet ros-<your_ros_version>-pluginlib ros-<your_ros_version>-roscpp ros-<your_ros_version>-std-msgs ros-<your_ros_version>-image-proc
其中<your_ros_version>
需要替换为你的ROS版本,例如melodic
、noetic
等。
3.克隆orbslam2代码库:
在终端中输入以下命令克隆orbslam2代码库:
git clone https://github.com/raulmur/ORB_SLAM2.git
4.编译orbslam2代码:
进入ORB_SLAM2目录,然后编译代码:
cd ORB_SLAM2
chmod +x build.sh
./build.sh
5.准备kitti数据集:
下载kitti数据集的一个序列图像,例如序列00。将数据集解压到一个文件夹中,例如~/kitti_data
。
6.修改配置文件:
在ORB_SLAM2目录下创建一个名为Examples/ROS/ORB_SLAM2/orb_slam2_ros_https://github.com/raulmur/ORB_SLAM2.git
的文件夹,并将Examples/Monocular/mono_kitti.cc
文件复制到该文件夹中。然后修改CMakeLists.txt
文件,添加以下内容:
add_executable(mono_kitti src/Monocular/mono_kitti.cc)
target_link_libraries(mono_kitti ${OpenCV_LIBRARIES} ${ORB_SLAM2_LIBRARIES})
7.编译可执行文件:
在终端中输入以下命令编译可执行文件:
cd Examples/ROS/ORB_SLAM2
chmod +x build.sh
./build.sh
8.运行orbslam2:
在终端中输入以下命令运行orbslam2:
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.bin Examples/ROS/ORB_SLAM2/orb_slam2_https://github.com/raulmur/ORB_SLAM2.git
注意:这里的Vocabulary/ORBvoc.bin
是ORB特征提取器的词汇文件,需要根据你的实际情况修改路径。
9.播放kitti数据集的序列图像:
使用ROS中的image_view
或rviz
工具播放kitti数据集的序列图像。例如,如果你使用的是image_view
,可以在终端中输入以下命令:
rosrun image_view image_view image:=/camera/image_raw
注意:这里的/camera/image_raw
是ORB_SLAM2节点发布的图像话题,需要根据你的实际情况修改。
四、总结
本次实验着重学习了 ROS 的分布式通信、ROS 动作变成、ROS 话题、服务编程,他们都是 ROS 学习中非常重要的一部分,通过本次学习,了解到机器人是如何进行我们人类行为得规划的,这也为我们未来进入人工智能打下一个良好的开端,对我们以后的学习打下了坚定的基础