A projekt cékja a turtlebot on lévő állo kaera mountot ami egy raspberry kaera modult tart ,kicserélni egy mount ra ami képes a kamerát forgatni.
- Bevezetés
- Csomagok letöltése
- Turtlebot3-as virtuális kamera setup
- Dynamixel setup
- Kamera modúl mozgatás
- Modell felepítése
Első sorban le kell töltsuk az alap csomagot amely a turtlebot3 , Ros ,Dynamixel lesz elsősorban
Ros letöltese :
http://wiki.ros.org/noetic/Installation
Engedélyezni szeretnénk a ros csomagokat hogy letölthessük
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
Érdemes feltenni a curl-t biztos ami biztos
sudo apt install curl
Hozzáadjuk a kulcsot :
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
Ezek után :
sudo apt update
és
sudo apt upgrade
Ha megvannak ezek el lehet kezdeni a ros feltelepítését:(Érdemes a teljes deskotp packaget felrakni)
sudo apt install ros-noetic-desktop-full
(Ha a parancsra nem akarja feltenni a Ros t mivel nem "Trusted source" ,akkor ezt fel kell oldani a kernelen vagy ui on belül .
Példa videó https://www.youtube.com/watch?v=ET2fXRExxco&t=170s&ab_channel=CyberZypher )
Ha feletelepült a Ros érdemes létrehozni egy workspace és ennek helyet elhelyezni a bashrc faljban
cd ~
mkdir -p catkin_ws/src
cd catkin_ws
(Tetszőleges név)
catkin_make
Ezután a bash be való elhelyezés :
cd ~
nano .bashrc/
Ha megnyílt a legaljára a két kommand :
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
Ezután ctrl +s és ctrl+x el elhagyjuk a bashrc fájlt
Ezután belépve a source folderbe:
cd ~/catkin_ws/src
Ezután letölthetjük a turtlebot csomagjait
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs
git clone https://github.com/MOGI-ROS/turtlebot3
Majd a Dynamixel csomagjait is mainly az oldal lépéseit kell követni pár kaviáttal :
https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_workbench/
git clone https://github.com/ROBOTIS-GIT/dynamixel-workbench.git
git clone https://github.com/ROBOTIS-GIT/dynamixel-workbench-msgs.git
git clone https://github.com/ROBOTIS-GIT/DynamixelSDK.git
- Turtlebot3 as virtuális kamera setup
Ha a dependency-k felvannak téve első feladat egy gazeboos környezetben megcsinálni a csuklóinkat
Be kell álítanunk a bashrc fájlba, hogy mi a burger el dolgozunk ezzel a kommand al :
echo "export TURTLEBOT3_MODEL=burger"
Használjuk az alap packege et
Azon belül :
\catkin_ws\src\turtlebot3\turtlebot3_description\urdf\turtlebot3_burger.urdf.xacro
Ehhez hozzádjuk a kamera modulunkat
<!-- fajdalom kezdete -->
<joint name="camera_base" type="revolute">
<limit upper="1.57" lower="-1.57" velocity="10" effort="1"/>
<origin xyz="0.01 0 0.106" rpy="0 0 0"/>
<child link="camera_link1"/>
<parent link="base_footprint"/>
<axis xyz="0 0 1" />
</joint>
<link name='camera_link1'>
<pose>0 0 0 0 0 0</pose>
<inertial>
<mass value="0.1"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia
ixx="1e-6" ixy="0" ixz="0"
iyy="1e-6" iyz="0"
izz="1e-6"
/>
</inertial>
<collision name='collision'>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.05" radius="0.010" />
</geometry>
</collision>
<visual name='camera_link1_visual'>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.002" radius="0.015" />
</geometry>
</visual>
</link>
<!-- Camera -->
<joint type="fixed" name="camera_joint">
<origin xyz="0.01 0 0.003" rpy="0 0 0"/>
<child link="camera_link"/>
<parent link="camera_link1"/>
<axis xyz="0 1 0" />
</joint>
<link name='camera_link'>
<pose>0 0 0 0 0 0</pose>
<inertial>
<mass value="0.1"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia
ixx="1e-6" ixy="0" ixz="0"
iyy="1e-6" iyz="0"
izz="1e-6"
/>
</inertial>
<collision name='collision'>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size=".01 .005 .005"/>
</geometry>
</collision>
<visual name='camera_link_visual'>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size=".0005 .01 .008"/>
</geometry>
</visual>
</link>
<joint type="fixed" name="camera_optical_joint">
<origin xyz="0 0 0" rpy="-1.5707 0 -1.5707"/>
<child link="camera_link_optical"/>
<parent link="camera_link"/>
</joint>
<link name="camera_link_optical">
</link>
<gazebo reference="camera_link">
<material>Gazebo/Red</material>
</gazebo>
<!--fajadalom vege-->
A gazebo fájl ba hozzácsatolhatjuk a kamera plugint
<!-- Camera -->
<gazebo reference="camera_link">
<sensor type="camera" name="camera1">
<update_rate>30.0</update_rate>
<visualize>false</visualize>
<camera name="head">
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.1</near>
<far>25.0</far>
</clip>
<noise>
<type>gaussian</type>
<!-- Noise is sampled independently per pixel on each frame.
That pixel's noise value is added to each of its color
channels, which at that point lie in the range [0,1]. -->
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
</camera>
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>head_camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>camera_link_optical</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>
Ezután rviz-en belül meg is tekinthetjük a kamera modúlt
A dynamixel trukkös lehet ezért elsősorban fontos leelenőriznünk, hogy felismeri-e a rendszerünk ehhez egy dynamixel wizzard programot használunk :
https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_wizard2/
A telepittés után elsó dolgunk a beallitásokon belül (Options) realisztikus baudrate et meghatározni majd ha ismerjuk a model ID címet lecsökkenteni realisztikus értékre nincs értelme végigfutni minden ID-n ha tudjuk azt .
Ha a wizzard megkapta a dynamixelt akkor pozició kovetést el lehet végezni a görgo segítségevel ha a torque enegdélyezve van
Ha megkapta a gepunk akkor kezdhetjuk a workbench felepittését és egy egyszerű write-read protokolt akarunk lefutattni
Elso lépés az SDK konyvtar inicializálása
gcc -v
Ha gcc nagyobb mint 5.4.0 20160609 akkor haladhaunk tovább ha nem update elnünk kell
sudo apt-get install gcc-5
Ezután :
sudo apt-get install build-essential
Feltesszuk a multilib funkciót (Tobb nyelv összekötése)
sudo apt-get install gcc-multilib g++-multilib
Bemegyünk a make folderbe :
/catkin_ws/src/DynamixelSDK/c++/build/linux64
Ezen belül make elünk
make
Alaposan kell figyelni hogy ne legyen error ha van újra kell make elni elöbb türlunk egyet
make clean
majd make újra
make
Ha sikeresen lefutott akkor kirakjuk a fő asztalra
sudo make install
Ez is bakiba eshet ekkor letöroljuk és újra make install
sudo make reinstall
Ha feltettük akkor csinálunk egy beépített read-write protokolt
/catkin_ws/src/DynamixelSDK/c++/example/protocol1.0/read_write/linux64
ezen belül :
make
Error esetén törlés és újra make
Megnézzük a portjainkat :
ls /dev/tty*
és mi az USB0 keressük de máshogy is nevezhetik ha látjuk mehetünk tovább
Ha wsl2-en belűl dolgozunk akkor átdobhatjuk a wsl2-nek a portokat windowsról
https://devblogs.microsoft.com/commandline/connecting-usb-devices-to-wsl/
Feltelepítjük
https://github.com/dorssel/usbipd-win/releases
Ubuntun belül
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
Ezután windowson belül pl Powershell vagy csak cmd
usbipd wsl list
usbipd wsl attach --busid
Itt láthatjuk a port okon levő eszközök bus id-ját és meg kell keressük a dynamixelet ha megvan akkor meg kell nyitni a wsl-t és nyitva kell tartani amíg fut a cmd is
usbipd wsl attach --busid <busid>
( belul a talált id rakjuk )
Engedelyt kér a rendszert ezután ha megadtuk :
Ubuntun belül :
lsusb
Ezután látnunk kéne a port ot
ls /dev/tty*
-is
/catkin_ws/src/DynamixelSDK/c++/example/protocol1.0/read_write/linux64
és
sudo chmod a+rw /dev/ttyUSB0
ezután ha lefutott akkor mehet a protokol
./read_write
Ekkor fel kell ismerje a port-ot és oda vissza paszolja (ha ez errorba fut de az elöző lepések nem, lehet nem probléma lehet folytatni)
rosrun dynamixel_workbench_controllers find_dynamixel /dev/ttyUSB0
Megkeressük a baudrate et és id ját a dynamixelünknek, ez ugyanazt kell adja mint a Wizzard
Használhatjuk a base yaml fájlokat a adynamixel worskpace ből
joint_2_0.yaml :
ID: 1
Return_Delay_Time: 0
Operating_Mode: 3
Profile_Acceleration: 0
Profile_Velocity: 0
tilt:
ID: 2
Return_Delay_Time: 0
Operating_Mode: 3
Profile_Acceleration: 0
Profile_Velocity: 0```
Nekünk csak egy mozgás kell most szóval (Vigyázzunk, hogy az ID n sajátunk legyen )
```console pan:
ID: 13
Return_Delay_Time: 0
Operating_Mode: 3
Profile_Acceleration: 0
Profile_Velocity: 0 ```
Bemegyunk a dynamixel_controller.launch ba:
```xml
<launch>
<arg name="usb_port" default="/dev/ttyUSB0"/>
<arg name="dxl_baud_rate" default="57600"/>
<arg name="namespace" default="dynamixel_workbench"/>
<arg name="use_moveit" default="false"/>
<arg name="use_joint_state" default="true"/>
<arg name="use_cmd_vel" default="false"/>
<param name="dynamixel_info" value="$(find dynamixel_workbench_controllers)/config/basic.yaml"/>
<node name="$(arg namespace)" pkg="dynamixel_workbench_controllers" type="dynamixel_workbench_controllers"
required="true" output="screen" args="$(arg usb_port) $(arg dxl_baud_rate)">
<param name="use_moveit" value="$(arg use_moveit)"/>
<param name="use_joint_states_topic" value="$(arg use_joint_state)"/>
<param name="use_cmd_vel_topic" value="$(arg use_cmd_vel)"/>
<rosparam>
publish_period: 0.010
dxl_read_period: 0.010
dxl_write_period: 0.010
mobile_robot_config: <!--this values will be set when 'use_cmd_vel' is true-->
seperation_between_wheels: 0.160 <!--default value is set by reference of TB3-->
radius_of_wheel: 0.033 <!--default value is set by reference of TB3-->
</rosparam>
</node>
</launch>
Beállítjuk a baudrate ünket és a basic.yaml helyett a miénket rakjuk
<launch>
<arg name="usb_port" default="/dev/ttyUSB0"/>
<arg name="dxl_baud_rate" default="57600"/>
<arg name="namespace" default="dynamixel_workbench"/>
<arg name="use_moveit" default="false"/>
<arg name="use_joint_state" default="true"/>
<arg name="use_cmd_vel" default="false"/>
<param name="dynamixel_info" value="$(find dynamixel_workbench_controllers)/config/joint_2_0.yaml"/>
<node name="$(arg namespace)" pkg="dynamixel_workbench_controllers" type="dynamixel_workbench_controllers"
required="true" output="screen" args="$(arg usb_port) $(arg dxl_baud_rate)">
<param name="use_moveit" value="$(arg use_moveit)"/>
<param name="use_joint_states_topic" value="$(arg use_joint_state)"/>
<param name="use_cmd_vel_topic" value="$(arg use_cmd_vel)"/>
<rosparam>
publish_period: 0.010
dxl_read_period: 0.010
dxl_write_period: 0.010
mobile_robot_config: <!--this values will be set when 'use_cmd_vel' is true-->
seperation_between_wheels: 0.160 <!--default value is set by reference of TB3-->
radius_of_wheel: 0.033 <!--default value is set by reference of TB3-->
</rosparam>
</node>
</launch>
Ekkor ha belépunk a workspace-be és lefordítjuk a csomagokat
cd ~/catkin_ws && catkin_make
`
Elindítva controll fájlunk
roslaunch dynamixel_workbench_controllers dynamixel_controllers.launch
`
Ha megtalálta a dynamixelt id vel együtt akkor
Egy rqt - t nyitva parhuzamosan beállítjuk a paramétereket :
Vagy alternatívan :
rosservice call /dynamixel_workbench/dynamixel_command "command: ''
id: 13
addr_name: 'Goal_Position'
value: 2048"
Ezzel meg kéne mozdúljon
##Ezutan ismetlödo mozgás létrehozása :
Használjuk a motion.yaml fájlt
joint:
names: [pan, tilt]
motion:
names: [right, zero, left]
right:
step: [-3.14, -3.14] # radian
time_from_start: 2.0 # sec
zero:
step: [0.0, 0.0]
time_from_start: 3.0
left:
step: [3.14, 3.14]
time_from_start: 6.0
Átalakítva :
joint:
names: [pan]
motion:
names: [right, zero, left]
right:
step: [-3.14] # radian
time_from_start: 2.0 # sec
zero:
step: [0.0]
time_from_start: 3.0
left:
step: [3.14]
time_from_start: 6.0
Majd a joint_operator.launch ban :
(Beálítjuk hogy ismétlődjön a motion kicserélve a false -t)
<arg name="is_loop" default="true"/>
Hogy elindítsuk :
cd ~/catkin_ws && catkin_make
roslaunch dynamixel_workbench_controllers dynamixel_controllers.launch
roslaunch dynamixel_workbench_operators joint_operator.launch
Ezután ismetlödő periodikus mozgást kell végezzen a dynamixel
Sok Cad softwerben dolgozhatunk de egyszerübbnek tartottam a Fusion360ben dolgozni mert jól ismerem de máshogy is meglehet csinálni .A cél két kúpfgaskerék ami ráfer a dynamixelre és elég kompakt hogy elférjen a turtle-on
A sima gear plugin-el létrehozunk2 egymásba mesh elő fogaskereket (A fogak számát mi határozzuk meg csak az m találjon )
Ezután elforgatjuk őket a kívánt pitch angle szerint ez esetben 53.1 Fok
Létrehozunk egy match négyzetet ami szélességben a kúpfogaskerekek kivánt hub távólsága egymástól és hossza a két tengely metszete
Loft parancsal az egyik fogat ki extrudáljuk használva a match négyzetet mint végpont
Ezeután egy körrel levágjuk a nemkellő csúcsdarabot
Ha ez megvan adunk neki egy hub ot amit mi határozunk meg de úgy , hogy ne interferáljon a másik kerékkel (Értsd ne érintse )
Ha megvan ezt megismételni a másik kúpfogaskerékre is és match elni majd a fogakat circle function el klónozni . Ha ez megvan az én design-om a könyebb design és a kényelem miatt nem konvenciális csuklót tartalmaz hanem a vázba bevágas van 8 db bb golyo elhelyezésehez ami segít a gordulekeny forgás létrehozásaban
Végső mounting kamera és a turtleboton elhelyezve