UAVCAN: Difference between revisions

From STorM32-BGC Wiki
Jump to navigation Jump to search
m (OlliW moved page UAVCAN to Uavcan without leaving a redirect: revert)
 
(11 intermediate revisions by the same user not shown)
Line 1: Line 1:
''The information on this page refers to firmware v2.30 and higher.''
''The information on this page refers to firmware v2.40 and higher.''


The STorM32 gimbal controller supports [http://uavcan.org/ UAVCAN]. This allows communicating with the STorM32 board through a [https://de.wikipedia.org/wiki/Controller_Area_Network CAN] bus, very similar to the communication through the [[Serial_Communication|serial interfaces]] or [[Using_a_ESP8266_Wifi_Module|Wifi]].
The STorM32 gimbal controller supports [http://uavcan.org/ UAVCAN]. This allows communicating with the STorM32 controller through a [https://de.wikipedia.org/wiki/Controller_Area_Network CAN] bus, very similar to the communication through the [[Serial_Communication|serial interfaces]] or [[Using_a_ESP8266_Wifi_Module|Wifi]].


<div class="toclimit-2">__TOC__</div>
<div class="toclimit-2">__TOC__</div>
Line 7: Line 7:
== Configuration ==
== Configuration ==


The STorM32 parameters, which are related to UAVCAN, are split into the "normal" and the "UAVCAN" parameter sections. The parameters in the normal section are accessible like all the other parameters, e.g. via the GUI. The parameters in the UAVCAN section are however accessible only by using UAVCAN's [http://uavcan.org/Specification/6._Application_level_functions/#node-configuration Node configuration] mechanism. The two parameter sections are exclusive, that is, a parameter is either in the one or the other section, but not in both. The single exception is the {{PARAMNAME|Uavcan Node ID}} parameter, which can be configured by either mechanism.
The STorM32 parameters, which are related to UAVCAN, are split into the 'normal' and the 'UAVCAN' parameter sections. The parameters in the normal section are accessible like all the other parameters, e.g. via the GUI. The parameters in the UAVCAN section are however accessible only by using UAVCAN's [http://uavcan.org/Specification/6._Application_level_functions/#node-configuration Node configuration] mechanism. The two parameter sections are exclusive, that is, a parameter is either in the one or the other section, but not in both. The single exception is the {{PARAMNAME|Uavcan Node ID}} parameter, which can be configured by either mechanism.


=== GUI Parameters ===
=== GUI Parameters ===
Line 19: Line 19:
=== UAVCAN Parameters ===
=== UAVCAN Parameters ===


The parameters in the UAVCAN section can be accessed e.g. using the [http://uavcan.org/GUI_Tool/Overview/ UAVCAN GUI Tool] and a SLCAN adapter. A [http://www.olliw.eu/2017/uavcan-for-hobbyists/ uc4h SLCAN adapter] is probably the cheapest option.
The parameters in the UAVCAN section can be accessed e.g. using the [http://uavcan.org/GUI_Tool/Overview/ UAVCAN GUI Tool], and a SLCAN adapter. A [http://www.olliw.eu/2017/uavcan-for-hobbyists/ UC4H SLCAN adapter] is probably the cheapest option, for an expensive option see the [https://kb.zubax.com/display/MAINKB/Zubax+Babel Zubax Babel].


{{PARAMNAME|NodeId}}: <br> Sets the node ID of the STorM32 controller (default = 71). Dynamic node allocation is not supported. The range of allowed IDs is restricted to 11 - 124. The STorM32 board needs to be reset for a change to become effective.
{{PARAMNAME|NodeId}}: <br> Sets the node ID of the STorM32 controller (default = 71). Dynamic node allocation is not supported. The range of allowed IDs is restricted to 11 - 124. The STorM32 board needs to be reset for a change to become effective.
Line 25: Line 25:
{{PARAMNAME|NodeStatus Rate}}: <br> Sets the rate at which the [http://uavcan.org/Specification/7._List_of_standard_data_types/#nodestatus uavcan.protocol.NodeStatus] message is emitted (default = 1000). A value of 1000 means that a message is broadcasted every 1000 ms.
{{PARAMNAME|NodeStatus Rate}}: <br> Sets the rate at which the [http://uavcan.org/Specification/7._List_of_standard_data_types/#nodestatus uavcan.protocol.NodeStatus] message is emitted (default = 1000). A value of 1000 means that a message is broadcasted every 1000 ms.


{{PARAMNAME|GimbalStatus Rate}}: <br> Sets the rate at which the storm32.GimbalStatus message is emitted (default = 500). A value of 500 means that a message is broadcasted every 500 ms. A value of 0 deactivates the emission of the message.
{{PARAMNAME|GimbalStatus Rate}}: <br> Sets the rate at which the [[#olliw.storm32.Status_.28BC.2C_ID_8300.29 | olliw.storm32.Status]] message is emitted (default = 500). A value of 500 means that a message is broadcasted every 500 ms. A value of 0 deactivates the emission of the message.
 
{{PARAMNAME|Debug}}: <br> A value of 1 enables the emission of [https://uavcan.org/Specification/7._List_of_standard_data_types/#logmessage uavcan.protocol.debug.LogMessage] messages. A value of 0 deactivates the emission of the message.


== UAVCAN Messages ==
== UAVCAN Messages ==


The STorM32 controller supports the UAVCAN [http://uavcan.org/Specification/7._List_of_standard_data_types/ standard data types] which are needed for basic operation, as well as some STorM32 specific data types.  
The STorM32 controller supports the UAVCAN [http://uavcan.org/Specification/7._List_of_standard_data_types/ standard data types] which are needed for basic operation, as well as the tunnel.Broadcast and debug.LogMessage data types.
 
{{COMMENT|It is not claimed that the STorM32 specific data types are the last conclusion of wisdom; they are open for discussion. They may however suggest a skeleton for standard definitions.}}
 
=== Standard Data Types ===


==== NodeStatus (BC, ID 341) ====
==== NodeStatus (BC, ID 341) ====
Line 55: Line 53:
See [http://uavcan.org/Specification/7._List_of_standard_data_types/#getset uavcan.protocol.param.GetSet].
See [http://uavcan.org/Specification/7._List_of_standard_data_types/#getset uavcan.protocol.param.GetSet].


=== STorM32 Data Types ===
==== tunnel.Broadcast (BC, ID 2010) ====
 
See [https://github.com/UAVCAN/dsdl/tree/master/uavcan/tunnel uavcan.tunnel.Broadcast].
 
This message appears to not yet have been finally released to the official standard. It is most important though, since it provides the backbone for the communication with the STorM32 controller via UAVCAN. The STorM32 essentially implements a UAVCAN-UART bridge.
 
==== debug.LogMessage (BC, ID 16383) ====
 
See [https://uavcan.org/Specification/7._List_of_standard_data_types/#logmessage uavcan.protocol.debug.LogMessage].
 
== STorM32 Data Types ==
 
The STorM32 supports also some STorM32 specific data types, which are located in the name space olliw.storm32.
 
==== olliw.storm32.Status (BC, ID 8300) ====
 
uint8 gimbal_id
uint8 mode
uint32 status
uint8 orientation_type
float32[4] orientation
float32[<=3] angular_velocity


==== storm32.Status (BC, ID 8300) ====
Reports the camera orientation. Default is angles in degrees, and yaw angle relative to the gimbal frame or the vehicle.


# Gimbal Attitude, angles in degrees +-180°, in gimbal frame.
==== olliw.storm32.Control (BC, ID 8301) ====
float32 pitch_deg
float32 roll_deg
float32 yaw_deg


Reports the camera angles in degrees. The yaw angle is relative to the gimbal frame or vehicle orientation.
uint8 gimbal_id
uint8 mode
uint8 control_mode
float32[4] orientation
float32[<=3] angular_velocity


==== storm32.Control (BC, ID 8301) ====
Moves the camera to the given orientation.<!-- The yaw angle is relative to the gimbal frame or vehicle orientation. It works like a CMD_SETANGLE command, see [[Inputs_and_Functions#Rc_Input_Processing|Inputs and Functions: Rc Input Processing]].-->


# Gimbal Attitude, angles in degrees +-180°, in gimbal frame.
==== olliw.storm32.Command (BC, ID 8302) ====
float32 pitch_deg
float32 roll_deg
float32 yaw_deg


Moves the camera to the given orientation. The yaw angle is relative to the gimbal frame or vehicle orientation. It works like a CMD_SETANGLE command, see [[Inputs_and_Functions#Rc_Input_Processing|Inputs and Functions: Rc Input Processing]].
uint8 gimbal_id        #0 means broadcast, any gimbal should listen
uint8[<=128] payload


==== storm32.NodeSpecific (BC, ID 8302) ====
The payload can correspond to any of the [[Serial_Communication#Serial_Communication_-_Simple_Commands|simple serial]] or [[Serial_Communication#Serial_Communication_-_RC_Commands|RC commands]], with the crc word stripped off (the crc is not needed since the message is already protected by UAVCAN]. Only commands of lengths less or equal 128 bytes can be handled (this excludes e.g. the 'p' command). The response of the STorM32 controller to the received command is packed into and send out as a olliw.storm32.CommandAck data type.


# Node Specific
==== olliw.storm32.CommandAck (BC, ID 8303) ====
uint8[<=64] payload


The payload can correspond to any of the [[Serial_Communication#Serial_Communication_-_Simple_Commands|simple serial]] or [[Serial_Communication#Serial_Communication_-_RC_Commands|RC commands]], with the crc word stripped off (the crc is not needed since the message is already protected by UAVCAN]. Only commands of lengths less or equal 64 bytes can be handled (this excludes e.g. the 'p' command). The response of the STorM32 controller to the received command is packed into and send out as a storm32.NodeSpecificAck data type.
uint8 gimbal_id        #it cannot be zero, it must by a unique id of the gimbal
uint8[<=128] payload


==== storm32.NodeSpecificAck (BC, ID 8303) ====
The payload holds the response to any of the [[Serial_Communication#Serial_Communication_-_Simple_Commands|simple serial]] or [[Serial_Communication#Serial_Communication_-_RC_Commands|RC commands]], with the crc word stripped off. Only responses of lengths less or equal 128 bytes can be handled (this excludes e.g. the 'g' command).


# Node Specific Ack
=== Comments on STorM32 specific UAVCAN Data Types ===
uint8 initiator_node_id
uint8[<=64] payload


The payload holds the response to any of the [[Serial_Communication#Serial_Communication_-_Simple_Commands|simple serial]] or [[Serial_Communication#Serial_Communication_-_RC_Commands|RC commands]], with the crc word stripped off. Only responses of lengths less or equal 64 bytes can be handled (this excludes e.g. the 'g' command). The initiator_node_id holds the id of the node, which emitted the storm32.NodeSpecific message to which this is the response.
==== Status, Control ====


== Comments on STorM32 specific UAVCAN Data Types ==
I was considering supporting the camera_gimbal standard data types. However, they use only float16 for the quaternion and more seriously expect frames which gimbals generally cannot support, except in special situations. They are thus totally useless in practical terms, and there are no signs that useful standard data types would ever come to live. Hence the STorM32 specific data types.


==== NodeSpecific, NodeSpecificAck ====  
==== Command, CommandAck ====  


This set of messages provides access to all features of the STorM32 controller which are accessible via serial commands, and thus establish a powerful message set. They function very similar to the MAV_CMD_TARGET_SPECIFIC Mavlink command, so please read [[Serial_Communication#Comments_on_STorM32_specific_Mavlink_Messages|Comments on STorM32 specific Mavlink Messages]].
This set of messages provides access to all features of the STorM32 controller which are accessible via serial commands, and thus establish a powerful message set. They function very similar to the MAV_CMD_TARGET_SPECIFIC Mavlink command, so please read [[Serial_Communication#Comments_on_STorM32_specific_Mavlink_Messages|Comments on STorM32 specific Mavlink Messages]]. The same task can be accomplished with using the tunnel.Broadcast data type, but the STorM32 specific Command data types are somewhat denser and allow a somewhat faster handling, and thus are retained.


'''''Example'''''
'''''Example'''''
Line 102: Line 118:
  0xFA 0x06 0x12 0x00 0x00 0x00 0x00 0x00 0x00 crc-low-byte crc-high-byte
  0xFA 0x06 0x12 0x00 0x00 0x00 0x00 0x00 0x00 crc-low-byte crc-high-byte


to any of the serial ports (USB, Uart, ...), or by sending a storm32.NodeSpecific message to the CAN port, with the payload set to  
to any of the serial ports (USB, Uart, ...), or by sending a olliw.storm32.Command message to the CAN port, with the payload set to  


  0xFA 0x06 0x12 0x00 0x00 0x00 0x00 0x00 0x00
  0xFA 0x06 0x12 0x00 0x00 0x00 0x00 0x00 0x00


In the latter case, the STorM32 controller will respond with emitting a storm32.NodeSpecificAck message on the CAN port, with the payload set to
In the latter case, the STorM32 controller will respond with emitting a olliw.storm32.CommandAck message on the CAN port, with the payload set to


  0xFB 0x01 0x96 0x00
  0xFB 0x01 0x96 0x00

Latest revision as of 13:37, 7 August 2018

The information on this page refers to firmware v2.40 and higher.

The STorM32 gimbal controller supports UAVCAN. This allows communicating with the STorM32 controller through a CAN bus, very similar to the communication through the serial interfaces or Wifi.

Configuration

The STorM32 parameters, which are related to UAVCAN, are split into the 'normal' and the 'UAVCAN' parameter sections. The parameters in the normal section are accessible like all the other parameters, e.g. via the GUI. The parameters in the UAVCAN section are however accessible only by using UAVCAN's Node configuration mechanism. The two parameter sections are exclusive, that is, a parameter is either in the one or the other section, but not in both. The single exception is the Uavcan Node ID parameter, which can be configured by either mechanism.

GUI Parameters

In the GUI, the parameters in the normal section are located in the [GUI:Interfaces Tool] window, which is accessible via the [GUI:Tools] menu.

Uavcan Configuration:
Set to “normal” to activate the UAVCAN communication. The STorM32 board needs to be reset for a change to become effective.

Uavcan Node ID:
Sets the node ID of the STorM32 controller (default = 71). Dynamic node allocation is not supported. The range of allowed IDs is restricted to 11 - 124. The STorM32 board needs to be reset for a change to become effective.

UAVCAN Parameters

The parameters in the UAVCAN section can be accessed e.g. using the UAVCAN GUI Tool, and a SLCAN adapter. A UC4H SLCAN adapter is probably the cheapest option, for an expensive option see the Zubax Babel.

NodeId:
Sets the node ID of the STorM32 controller (default = 71). Dynamic node allocation is not supported. The range of allowed IDs is restricted to 11 - 124. The STorM32 board needs to be reset for a change to become effective.

NodeStatus Rate:
Sets the rate at which the uavcan.protocol.NodeStatus message is emitted (default = 1000). A value of 1000 means that a message is broadcasted every 1000 ms.

GimbalStatus Rate:
Sets the rate at which the olliw.storm32.Status message is emitted (default = 500). A value of 500 means that a message is broadcasted every 500 ms. A value of 0 deactivates the emission of the message.

Debug:
A value of 1 enables the emission of uavcan.protocol.debug.LogMessage messages. A value of 0 deactivates the emission of the message.

UAVCAN Messages

The STorM32 controller supports the UAVCAN standard data types which are needed for basic operation, as well as the tunnel.Broadcast and debug.LogMessage data types.

NodeStatus (BC, ID 341)

See uavcan.protocol.NodeStatus.

GetNodeInfo (SR, ID 1)

See uavcan.protocol.GetNodeInfo.

RestartNode (SR, ID 5)

See uavcan.protocol.RestartNode.

param.ExecuteOpCode (SR, ID 10)

See uavcan.protocol.param.ExecuteOpcode.

param.GetSet (SR, ID 11)

See uavcan.protocol.param.GetSet.

tunnel.Broadcast (BC, ID 2010)

See uavcan.tunnel.Broadcast.

This message appears to not yet have been finally released to the official standard. It is most important though, since it provides the backbone for the communication with the STorM32 controller via UAVCAN. The STorM32 essentially implements a UAVCAN-UART bridge.

debug.LogMessage (BC, ID 16383)

See uavcan.protocol.debug.LogMessage.

STorM32 Data Types

The STorM32 supports also some STorM32 specific data types, which are located in the name space olliw.storm32.

olliw.storm32.Status (BC, ID 8300)

uint8 gimbal_id
uint8 mode
uint32 status
uint8 orientation_type
float32[4] orientation
float32[<=3] angular_velocity

Reports the camera orientation. Default is angles in degrees, and yaw angle relative to the gimbal frame or the vehicle.

olliw.storm32.Control (BC, ID 8301)

uint8 gimbal_id
uint8 mode
uint8 control_mode
float32[4] orientation
float32[<=3] angular_velocity

Moves the camera to the given orientation.

olliw.storm32.Command (BC, ID 8302)

uint8 gimbal_id         #0 means broadcast, any gimbal should listen
uint8[<=128] payload

The payload can correspond to any of the simple serial or RC commands, with the crc word stripped off (the crc is not needed since the message is already protected by UAVCAN]. Only commands of lengths less or equal 128 bytes can be handled (this excludes e.g. the 'p' command). The response of the STorM32 controller to the received command is packed into and send out as a olliw.storm32.CommandAck data type.

olliw.storm32.CommandAck (BC, ID 8303)

uint8 gimbal_id        #it cannot be zero, it must by a unique id of the gimbal
uint8[<=128] payload

The payload holds the response to any of the simple serial or RC commands, with the crc word stripped off. Only responses of lengths less or equal 128 bytes can be handled (this excludes e.g. the 'g' command).

Comments on STorM32 specific UAVCAN Data Types

Status, Control

I was considering supporting the camera_gimbal standard data types. However, they use only float16 for the quaternion and more seriously expect frames which gimbals generally cannot support, except in special situations. They are thus totally useless in practical terms, and there are no signs that useful standard data types would ever come to live. Hence the STorM32 specific data types.

Command, CommandAck

This set of messages provides access to all features of the STorM32 controller which are accessible via serial commands, and thus establish a powerful message set. They function very similar to the MAV_CMD_TARGET_SPECIFIC Mavlink command, so please read Comments on STorM32 specific Mavlink Messages. The same task can be accomplished with using the tunnel.Broadcast data type, but the STorM32 specific Command data types are somewhat denser and allow a somewhat faster handling, and thus are retained.

Example

The camera can be recentered by sending the RC command CMD_SETPITCHROLLYAW, with the pitch, roll, and yaw input values set to zero. This can be achieved by sending the byte stream

0xFA 0x06 0x12 0x00 0x00 0x00 0x00 0x00 0x00 crc-low-byte crc-high-byte

to any of the serial ports (USB, Uart, ...), or by sending a olliw.storm32.Command message to the CAN port, with the payload set to

0xFA 0x06 0x12 0x00 0x00 0x00 0x00 0x00 0x00

In the latter case, the STorM32 controller will respond with emitting a olliw.storm32.CommandAck message on the CAN port, with the payload set to

0xFB 0x01 0x96 0x00